【问题标题】:CoreMIDI track accessing time signature informationCoreMIDI 轨道访问拍号信息
【发布时间】:2012-03-29 20:11:24
【问题描述】:

我正在设计一个由 MIDI 轨道驱动的节奏游戏。 MIDI 消息触发屏幕元素的释放。我正在从文件中加载 MIDI 数据,然后使用 MusicSequence 和 MusicPlayer 播放它。

我了解 MIDI 文件在文件开头包含时间和调号信息作为元消息。但是,我还没有找到从 MusicPlayer 或 MusicSequence 中检索此信息的方法。

我需要的信息是播放八分音符、四分音符等所需的秒数...我希望这会受到拍号和 MusicPlayerPlayRateScalar 值的影响。

看起来可以在CoreAudio clock 中找到此信息,但我无法了解如何访问特定音乐序列。

有没有 CoreAudio 专家知道如何做到这一点?

【问题讨论】:

    标签: objective-c core-audio midi coremidi


    【解决方案1】:

    您需要获取 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);
    

    【讨论】:

      猜你喜欢
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多