2015-06-04 7 views
3

У меня есть MusicTrack с MIDI Notes, установленным в MusicSequence, который воспроизводится с MusicPlayer. Проблема возникает, когда я пытался настроить темп, используя;Как изменить MIDI TEMPO на лету? [CoreMIDI] iOS

MusicTrackNewExtendedTempoEvent (musicTrack, 0.0, newBPM);

По-видимому, это должно изменить TempoEvent в MusicTrack, который воспроизводится, но это не так. Любая идея, почему это может произойти?

ответ

5

Сначала вам нужно удалить все события темпа из дорожки темпа.

static void removeTempoEvents(MusicTrack tempoTrack){ 
    MusicEventIterator tempIter; 
    NewMusicEventIterator(tempoTrack, &tempIter); 
    Boolean hasEvent; 
    MusicEventIteratorHasCurrentEvent(tempIter, &hasEvent); 
    while (hasEvent) { 
     MusicTimeStamp stamp; 
     MusicEventType type; 
     const void *data = NULL; 
     UInt32 sizeData; 

     MusicEventIteratorGetEventInfo(tempIter, &stamp, &type, &data, &sizeData); 
     if (type == kMusicEventType_ExtendedTempo){ 
      MusicEventIteratorDeleteEvent(tempIter); 
      MusicEventIteratorHasCurrentEvent(tempIter, &hasEvent); 
     } 
     else{ 
      MusicEventIteratorNextEvent(tempIter); 
      MusicEventIteratorHasCurrentEvent(tempIter, &hasEvent); 
     } 
    } 
    DisposeMusicEventIterator(tempIter); 
} 
static void setTempo(MusicSequence sequence,Float64 tempo){ 
    MusicTrack tempoTrack; 
    MusicSequenceGetTempoTrack(sequence ,&tempoTrack); 
    removeTempoEvents(tempoTrack); 
    MusicTrackNewExtendedTempoEvent(tempoTrack,0, tempo); 
} 
+0

Блестящий! Это сработало! Благодарю. –