我猜的一个相当简单的问题,但我无法在任何地方找到明确的答案。
背景:我在第一首曲目中有一个带有TEMPO控件的多音轨midi文件。我需要将其他轨道中的ABSOLUTE_TICK计数转换为“秒”(从midi文件的开头偏移的小数秒)。
我有一个公式,根据文件的PulsePerQuarterNote(PPQN)将ABSOLUTE_TICK与Seconds相关联到速度(MS每季度音符)。
问题是:第一首曲目(曲目0)中的TEMPO变化是否适用于所有其他曲目?
如果是这样的话,那么当我正在解析其他音轨时(例如音轨4,其中我感兴趣的是NOTE_ON和NOTE_OFF消息)我将需要保持手指指向轨道0中的TEMPO变化并行。是吗?
谢谢,
标记
答案 0 :(得分:9)
简而言之,是的。第一首曲目包含将应用于整个排列的时间信息,因此您可以使用相同的绝对时间为每个曲目应用这些消息。由于所有事件都使用刻度线中的偏移量,因此您需要先提取速度更改消息,将其转换为绝对时间,然后在阅读其他轨道时,您将根据该时间线应用这些消息。
来自MIDI fanatic's technical brainwashing center:
在格式0文件中,速度变化分散在整个MTrk中。在格式1中,第一个MTrk应该仅由速度(和时间签名)事件组成,以便能够由能够生成“节拍图”的某个设备读取它。最好不要在这个MTrk中放置MIDI事件。在格式2中,每个MTrk应该以至少一个初始速度(和时间签名)事件开始。
也就是说,一些音序器确实打破了这个规则并将实际的MIDI事件放在第一个音轨和时序信息中,因为标准在这方面并不那么具体。你的程序应该处理这两种情况,因为它可能会遇到以这种方式格式化的野外MIDI文件。