İyi akşamlar. Kaliteli ses bankası ile basit bir midi oyuncu yazmaya çalışıyorum. Midi dosyalarını oynatma sorunu ile karşı karşıya. Sorun şu ki midi (davul, ped, bas, synth vb) tüm parçaları çaldı, ama tek bir enstrüman çalıyorlar. OS X için bir çözüm buldum iOS için bir çözüme ihtiyacım var. kAudioUnitSubType_Sampler ile her bir Instrument audioUnit için oluşturmam gerekecek mi?Çok enstrümanlı MIDI dosyasını oynatın IOS
Seçilen kanaldaki Enstrümanı gerçek zamanlı olarak değiştirmek mümkün mü? Nasıl uygulanabilir? .. Ingilizcem ((Burada
düzgün çalışmıyor, benim kodudur için üzgünüm:// 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;
}
Merhaba, bu yüzden nasıl parçalarını ayırmak ve farklı bir AUSampler her birini atamak için yönetilen vermedi ?? Son saatlerde bunu anlamaya çalışıyorum> _ < – Hazneliel
İstenen sayıda midi enstrümanı oluşturun -> AudioUnit midiUnit_0, midiUnit_1, midiUnit_2, midiUnit_3, midiUnit_4, midiUnit_5; Grafiği Yapılandır -> Denetle (AUGraphConnectNodeInput (graph, midiNode_0, 0, mixerNode, 0)); Check (AUGraphConnectNodeInput (grafik, midiNode_1, 0, mikserNode, 1)); Check (AUGraphConnectNodeInput (grafik, midiNode_2, 0, mikserNode, 2)); Check (AUGraphConnectNodeInput (grafik, midiNode_3, 0, mikserNode, 3)); Check (AUGraphConnectNodeInput (grafik, midiNode_4, 0, mikserNode, 4)); Check (AUGraphConnectNodeInput (grafik, midiNode_5, 0, mikserNode, 5)); – John
Merhaba John Aynı şeyi yapmaya çalışıyorum ama başarıya ulaşamadım. Kodunuzun geri kalanını, örneğin "NewMusicSequence" ve "NewMusicPlayer" yöntemlerini vererek yardımcı olabilir misiniz? Çok teşekkürler –