Chào buổi tối. Tôi đang cố gắng để viết một người chơi midi đơn giản với chất lượng âm thanh ngân hàng. Đối mặt với vấn đề chơi các tập tin midi. Vấn đề là tất cả các bài hát của midi (trống, miếng đệm, bass, synth, vv) đều chơi, nhưng chúng chơi một nhạc cụ duy nhất. Tôi tìm thấy một giải pháp cho OS X bu Tôi cần một giải pháp cho iOS. Tôi có phải tạo ra cho mỗi âm thanh cụUnit with kAudioUnitSubType_Sampler?Phát tệp MIDI nhiều nhạc cụ IOS
Nhắc có thể thay đổi Công cụ trên kênh đã chọn trong thời gian thực? Làm thế nào nó có thể được thực hiện? Xin lỗi vì tiếng anh của tôi ((
Đây là mã của tôi, nó không hoạt động đúng cách:..
// Create a client
MIDIClientRef virtualMidi;
Check(MIDIClientCreate(CFSTR("Virtual Client"),
MyMIDINotifyProc,
NULL,
&virtualMidi));
// Create an endpoint
MIDIEndpointRef virtualEndpoint;
Check(MIDIDestinationCreate(virtualMidi, CFSTR("Virtual Destination"), MyMIDIReadProc, samplerUnit, &virtualEndpoint));
// Initialise the music sequence
NewMusicSequence(&midiSequence);
if (!midiFilePath) {
midiFilePath = [[NSBundle mainBundle]
pathForResource:@"carelesswhisper"
ofType:@"mid"];
}
NSLog(@"midiFilePath %@", midiFilePath);
// Create a new URL which points to the MIDI file
NSURL * midiFileURL = [NSURL fileURLWithPath:midiFilePath];
MidiParser *midiParser = [[MidiParser alloc] init];
NSData *data = [NSData dataWithContentsOfFile:midiFilePath];
[midiParser parseData:data];
NSString *midiInfo = [midiParser log];
NSLog(@"midiInfo %@", midiInfo);
MusicSequenceLoadFlags loadFlags = 0;
loadFlags = kMusicSequenceLoadSMF_ChannelsToTracks;
MusicSequenceFileLoad(midiSequence, (__bridge CFURLRef) midiFileURL, 0, loadFlags);
// Initialise the music player
NewMusicPlayer(&midiPlayer);
// ************* Set the endpoint of the sequence to be our virtual endpoint
MusicSequenceSetMIDIEndpoint(midiSequence, virtualEndpoint);
if (!soundBankFilePath) {
soundBankFilePath = [[NSBundle mainBundle] pathForResource:@"SGM-V2.01-1" ofType:@"sf2"];
}
NSLog(@"soundBankFilePath %@", soundBankFilePath);
NSURL *presetURL = [NSURL fileURLWithPath:soundBankFilePath];
// Initialise the sound font
AUSamplerInstrumentData bpdata;
bpdata.fileURL = (__bridge CFURLRef) presetURL;
bpdata.bankMSB = kAUSampler_DefaultMelodicBankMSB;
bpdata.bankLSB = kAUSampler_DefaultBankLSB;
bpdata.instrumentType = kInstrumentType_SF2Preset;
// set the kAUSamplerProperty_LoadPresetFromBank property
result = AudioUnitSetProperty(samplerUnit,
kAUSamplerProperty_LoadInstrument,
kAudioUnitScope_Global,
0,
&bpdata,
sizeof(bpdata));
MusicPlayerSetSequence(midiPlayer, midiSequence);
// Called to do some MusicPlayer setup. This just
// reduces latency when MusicPlayerStart is called
// MusicPlayerPreroll(midiPlayer);
// Starts the music playing
MusicPlayerStart(midiPlayer);
// Get length of track so that we know how long to kill time for
MusicTrack track;
MusicTimeStamp len;
UInt32 sz = sizeof(MusicTimeStamp);
MusicSequenceGetIndTrack(midiSequence, 1, &track);
MusicTrackGetProperty(track, kSequenceTrackProperty_TrackLength, &len, &sz);
while (1) { // kill time until the music is over
usleep (3 * 1000 * 1000);
MusicTimeStamp now = 0;
MusicPlayerGetTime (midiPlayer, &now);
if (now >= len)
break;
}
Xin chào, vì vậy làm thế nào bạn quản lý để tách các track và gán mỗi một đến một AUSampler khác nhau ?? Tôi đã cố gắng tìm ra điều này trong những giờ qua> _ < – Hazneliel
Tạo số lượng nhạc cụ midi mong muốn -> AudioUnit midiUnit_0, midiUnit_1, midiUnit_2, midiUnit_3, midiUnit_4, midiUnit_5; Định cấu hình biểu đồ -> Kiểm tra (AUGraphConnectNodeInput (biểu đồ, midiNode_0, 0, mixerNode, 0)); Kiểm tra (AUGraphConnectNodeInput (đồ thị, midiNode_1, 0, mixerNode, 1)); Kiểm tra (AUGraphConnectNodeInput (biểu đồ, midiNode_2, 0, mixerNode, 2)); Kiểm tra (AUGraphConnectNodeInput (đồ thị, midiNode_3, 0, mixerNode, 3)); Kiểm tra (AUGraphConnectNodeInput (biểu đồ, midiNode_4, 0, mixerNode, 4)); Kiểm tra (AUGraphConnectNodeInput (đồ thị, midiNode_5, 0, mixerNode, 5)); – John
Xin chào John Tôi đang cố gắng làm điều tương tự nhưng không thành công. Bạn có thể trợ giúp bằng cách cung cấp phần còn lại của mã không? Ví dụ: phương thức "NewMusicSequence" và "NewMusicPlayer". Cảm ơn rất nhiều –