2015-06-01 32 views
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文件,並且讀取過程成功地爲每個音符調用。

回答

1

您使用MIDIDestinationCreate創建一個虛擬端點,然後調用MusicSequenceSetMIDIEndpoint將您的序列連接到它。您指定的讀取過程將在每個事件中調用。

+0

請參閱我的編輯。 –

+0

那麼,它現在正在做你想要的嗎? –

+0

不,MyMIDIRecProc它永遠不會被稱爲 –

相關問題