1
我創建MIDI音符的MusicTrack正在使用什麼時候在MusicTrack中播放MIDINoteMessage? iOS的
MusicPlayerStart(sequencePlayer)成功地扮演了
但我想知道當他們打了,這樣我就可以更新UI爲每個MIDI音符播放。
// Creating MIDI Track
MusicTrack track;
UInt32 trackIndex = 0;
musicTrackAtIndex(trackIndex, &track);
//Adding Tempo
addTempoEvent(0.0, 120);
// Adding MIDI notes
const int channel = 0;
MIDINoteMessage note;
note.channel = channel;
note.velocity = 100.0;
note.duration = 0.3;
note.releaseVelocity = 0;
note.note = 68;
addMIDINoteToTrack(track, note, 1);
note.note = 78;
addMIDINoteToTrack(track, note, 2);
note.note = 88;
addMIDINoteToTrack(track, note, 3);
note.note = 98;
addMIDINoteToTrack(track, note, 4);
MusicTimeStamp trackEnd = 4;
addEndOfTrackAtTime(trackEnd);
setLoopTrack(true);
playSequence();
編輯
顯示更詳細,我如何建立MIDI軌。
-(void) playing4NotesInLoop {
MusicTrack musicTrack;
MusicSequence musicSequence;
MusicPlayer musicPlayer;
const int loop_length = 4;
NewMusicSequence(&musicSequence);
// Create a client
MIDIClientRef virtualMidi;
MIDIClientCreate(CFSTR("Virtual Client"),
MyMIDINotifyProc,
NULL,
&virtualMidi);
// Create an endpoint
MIDIEndpointRef virtualEndpoint;
MIDIDestinationCreate(virtualMidi, @"Virtual Destination", MyMIDIReadProc, self.samplerUnit, &virtualEndpoint);
MusicSequenceNewTrack(musicSequence, &musicTrack);
MIDINoteMessage aMessage;
aMessage.channel = 1;
aMessage.duration = 0.5f;
aMessage.velocity = 100;
for(int i=0; i<4; ++i)
{
if (i==0) {
aMessage.note = 30;
}else {
aMessage.note = 60;
}
MusicTrackNewMIDINoteEvent(musicTrack, i, &aMessage);
}
MusicTrackLoopInfo loop_info;
loop_info.loopDuration = loop_length;
loop_info.numberOfLoops = 0;
MusicTrackSetProperty(musicTrack, kSequenceTrackProperty_LoopInfo, &loop_info, sizeof(MusicTrackLoopInfo));
MusicTimeStamp track_length;
track_length = loop_length;
MusicTrackSetProperty(musicTrack, kSequenceTrackProperty_TrackLength, &track_length, sizeof(MusicTimeStamp));
MusicSequenceSetMIDIEndpoint(musicSequence, virtualEndpoint);
NewMusicPlayer(&musicPlayer);
MusicPlayerSetSequence(musicPlayer, musicSequence);
MusicPlayerStart(musicPlayer);
}
有了這個代碼,我成功地打4注一環,MusicSequenceSetMIDIEndpoint(musicSequence,virtualEndpoint)已設立指定讀取PROC。我使用了相同的代碼,但加載了一個MIDI文件,並且讀取過程成功地爲每個音符調用。
請參閱我的編輯。 –
那麼,它現在正在做你想要的嗎? –
不,MyMIDIRecProc它永遠不會被稱爲 –