Dobry wieczór. Próbuję napisać proste odtwarzacze midi z bankiem jakości dźwięku. W obliczu problemu odtwarzania plików midi. Problem polega na tym, że wszystkie utwory midi (perkusja, pady, bas, syntezator itp.) Grały, ale grają na jednym instrumencie. Znalazłem rozwiązanie dla OS X bu Potrzebuję rozwiązania dla iOS. Czy muszę utworzyć dla każdego instrumentu audioUnit za pomocą kAudioUnitSubType_Sampler?Odtwórz plik MIDI z wieloma instrumentami IOS
Pytanie Czy możliwa jest zmiana instrumentu na wybranym kanale w czasie rzeczywistym? Jak można go wdrożyć? Przepraszam za mój angielski ((
Oto mój kod, to nie działa prawidłowo..
// 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;
}
Witam, tak jak nie udało się rozdzielić ścieżki i przypisać każdy do innego AUSampler ?? Próbuję to rozgryźć w ciągu ostatnich godzin> _ < – Hazneliel
Utwórz żądaną liczbę instrumentów midi -> AudioUnit midiUnit_0, midiUnit_1, midiUnit_2, midiUnit_3, midiUnit_4, midiUnit_5; Skonfiguruj wykres -> Sprawdź (AUGraphConnectNodeInput (wykres, midiNode_0, 0, mixerNode, 0)); Sprawdź (AUGraphConnectNodeInput (wykres, midiNode_1, 0, mixerNode, 1)); Sprawdź (AUGraphConnectNodeInput (wykres, midiNode_2, 0, mixerNode, 2)); Sprawdź (AUGraphConnectNodeInput (wykres, midiNode_3, 0, mixerNode, 3)); Sprawdź (AUGraphConnectNodeInput (wykres, midiNode_4, 0, mixerNode, 4)); Sprawdź (AUGraphConnectNodeInput (wykres, midiNode_5, 0, mixerNode, 5)); – John
Witam, John Próbuję zrobić to samo, ale bez powodzenia. Czy możesz pomóc, podając resztę kodu, na przykład metody "NewMusicSequence" i "NewMusicPlayer". Wielkie dzięki –