2012-03-29 11 views
1

私はMIDIトラックによって駆動されるリズムゲームを設計しています。 MIDIメッセージは画面上の要素のリリースをトリガーします。私はファイルからMIDIデータをロードしてから、MusicSequenceとMusicPlayerを使ってMIDIデータを再生しています。拍子情報にアクセスするCoreMIDIトラック

私は、MIDIファイルには、ファイルの先頭に時間と鍵の署名情報がメタメッセージとして含まれていることを理解しています。しかし、私はこの情報をMusicPlayerまたはMusicSequenceのいずれかから取得する方法を見つけていません。

私が必要とする情報は、クヴァーア、クロッチなどを再生するのにかかる秒数です。これは、拍子記号とMusicPlayerPlayRateScalar値の影響を受けることが予想されます。

この情報はCoreAudio clockにありますが、特定の音楽シーケンスでどのようにアクセスされたかはわかりません。

これを行う方法を知っているCoreAudioの専門家はいますか?

答えて

4

テンポを取得するには、midiファイルのテンポトラックを取得し、それを反復処理する必要があります。

は、あなたが最も長いトラックを見つける必要があり、配列の長さを取得するには:

(MusicTimeStamp)getSequenceLength:(MusicSequence)aSequence { 
    UInt32 tracks; 
    MusicTimeStamp len = 0.0f; 

    if (MusicSequenceGetTrackCount(sequence, &tracks) != noErr) 
    return len; 

    for (UInt32 i = 0; i < tracks; i++) { 
     MusicTrack track = NULL; 
     MusicTimeStamp trackLen = 0; 

     UInt32 trackLenLen = sizeof(trackLen); 

     MusicSequenceGetIndTrack(sequence, i, &track); 
     MusicTrackGetProperty(track, kSequenceTrackProperty_TrackLength, &trackLen, &trackLenLen); 

     if (len < trackLen) 
      len = trackLen; 
    } 

    return len; 
} 

// - テンポのトラックを取得:

OSStatus result = noErr; 

MusicTrack tempoTrack; 
result = MusicSequenceGetTempoTrack(sequence, &tempoTrack); 
if (noErr != result) {[self printErrorMessage: @"MusicSequenceGetTempoTrack" withStatus: result];} 

MusicEventIterator iterator = NULL; 
NewMusicEventIterator(tempoTrack, &iterator); 

MusicTimeStamp timestamp = 0; 
MusicEventType eventType = 0; 
const void *eventData = NULL; 
UInt32 eventDataSize = 0; 

MusicEventIteratorGetEventInfo(iterator, &timestamp, &eventType, &eventData, &eventDataSize); 
+0

非常に役に立った、感謝を! –

関連する問題