10

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

背景:我有一个多轨 MIDI 文件,第一条轨道中有 TEMPO 控件。我需要将其他轨道中的 ABSOLUTE_TICK 计数转换为“秒”(从 midi 文件开头偏移的小数秒)。

我有公式将 ABSOLUTE_TICK 与基于文件的 PulsePerQuarterNote (PPQN) 的秒数关联到速度(每四分音符的 MS)。

问题是:第一个音轨(音轨 0)中的 TEMPO 变化是否适用于所有其他音轨?

如果是这样,那么当我解析其他轨道时(例如轨道 4,它有我感兴趣的 NOTE_ON 和 NOTE_OFF 消息),我需要保持手指指向轨道 0 中并行的 TEMPO 变化。是对的吗?

谢谢,

标记

4

1 回答 1

11

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

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

在格式 0 文件中,速度变化分散在一个 MTrk 中。在格式 1 中,第一个 MTrk 应该只包含速度(和时间签名)事件,以便它可以被一些能够生成“速度图”的设备读取。最好不要在这个 MTrk 中放置 MIDI 事件。在格式 2 中,每个 MTrk 应以至少一个初始速度(和拍号)事件开始。

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

于 2009-07-05T08:57:53.993 回答