Buona sera. Sto cercando di scrivere un semplice lettore midi con una banca sonora di qualità. Di fronte al problema di riprodurre i file midi. Il problema è che tutte le tracce di midi (batteria, pad, basso, synth ecc.) Sono suonate, ma suonano un singolo strumento. Ho trovato una soluzione per OS X bu ho bisogno di una soluzione per iOS. Devo creare per ogni strumento audioUnit con kAudioUnitSubType_Sampler?Riproduzione di file MIDI multi-strumento IOS
Prompt È possibile cambiare lo strumento sul canale selezionato in tempo reale? Come può essere implementato? Ci dispiace per il mio inglese ((
Ecco il mio codice, non funziona correttamente:..
// 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;
}
Ciao, così come hai riuscito a separare le tracce e assegnare a ciascuno di un diverso AUSampler ?? Ho cercato di capirlo per le ore passate> _ < – Hazneliel
Crea il numero desiderato di strumenti midi -> AudioUnit midiUnit_0, midiUnit_1, midiUnit_2, midiUnit_3, midiUnit_4, midiUnit_5; Configura grafico -> Verifica (AUGraphConnectNodeInput (grafico, midiNode_0, 0, mixerNode, 0)); Verifica (AUGraphConnectNodeInput (grafico, midiNode_1, 0, mixerNode, 1)); Verifica (AUGraphConnectNodeInput (graph, midiNode_2, 0, mixerNode, 2)); Verifica (AUGraphConnectNodeInput (grafico, midiNode_3, 0, mixerNode, 3)); Verifica (AUGraphConnectNodeInput (grafico, midiNode_4, 0, mixerNode, 4)); Verifica (AUGraphConnectNodeInput (graph, midiNode_5, 0, mixerNode, 5)); – John
Ciao John Sto cercando di fare lo stesso, ma senza successo. Puoi aiutare dando il resto del codice? Ad esempio i metodi "NewMusicSequence" e "NewMusicPlayer". Grazie mille –