首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CoreMIDI轨迹访问时间签名信息

CoreMIDI轨迹访问时间签名信息
EN

Stack Overflow用户
提问于 2012-03-30 04:11:25
回答 1查看 1.5K关注 0票数 1

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

我知道MIDI文件包含时间和密钥签名信息,作为文件开头的元消息。但是,我还没有找到从MusicPlayer或MusicSequence检索这些信息的方法。

我需要的信息是玩八分音符,八分音符等需要的秒数。我预计这会受到时间签名和MusicPlayerPlayRateScalar值的影响。

看起来这些信息可以在CoreAudio clock中找到,但我还不能解决如何访问特定音乐序列的问题。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-30 04:34:47

您需要获取midi文件的节拍轨迹,然后遍历它以获得节拍。

要获得序列长度,您需要找到最长的轨迹:

代码语言:javascript
复制
 (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;
}

// -获取节拍曲目:

代码语言:javascript
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9932754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档