Midi TEMPO消息如何应用于其他曲目?

Mar*_*aff 9 midi

一个相当简单的问题,我有一个猜测,但我无法在任何地方找到明确的答案.

背景:我在第一首曲目中有一个带有TEMPO控件的多音轨midi文件.我需要将其他轨道中的ABSOLUTE_TICK计数转换为"秒"(从midi文件的开头偏移的小数秒).

我有一个公式,根据文件的PulsePerQuarterNote(PPQN)将ABSOLUTE_TICK与秒关联到速度(MS每季度音符).

问题是:第一首曲目(曲目0)中的TEMPO变化是否适用于所有其他曲目?

如果是这样,那么当我解析等曲目(如轨道4,其中有NOTE_ON和NOTE_OFF消息我很感兴趣),我需要保持指着并行轨道0 TEMPO变化的手指.是对的吗?

谢谢,

标记

Nik*_*man 10

简而言之,是的.第一首曲目包含将应用于整个排列的时间信息,因此您可以使用相同的绝对时间为每个曲目应用这些信息.由于所有事件都使用刻度线中的偏移量,因此您需要先提取速度更改消息,将其转换为绝对时间,然后在阅读其他轨道时,您将根据该时间轴应用这些消息.

来自MIDI狂热者的技术洗脑中心:

在格式为0的文件中,速度变化分散在整个MTrk中.在格式1中,第一个MTrk应该仅由速度(和时间签名)事件组成,以便能够由能够生成"节拍图"的某个设备读取它.最好不要在这个MTrk中放置MIDI事件.在格式2中,每个MTrk应该以至少一个初始速度(和时间签名)事件开始.

也就是说,一些音序器确实打破了这个规则并将实际的MIDI事件放在第一个音轨和时序信息中,因为标准在这方面并不那么具体.你的程序应该处理这两种情况,因为它可能会遇到以这种方式格式化的野外MIDI文件.