Midi TEMPO 信息如何应用于其他曲目?
Posted
技术标签:
【中文标题】Midi TEMPO 信息如何应用于其他曲目?【英文标题】:How does Midi TEMPO message apply to other tracks? 【发布时间】:2009-07-03 17:42:38 【问题描述】:一个相当简单的问题,我有一个猜测,但我在任何地方都找不到明确的答案。
背景:我有一个多轨 MIDI 文件,第一轨中有 TEMPO 控件。我需要将其他曲目中的 ABSOLUTE_TICK 计数转换为“秒”(从 midi 文件开头偏移的小数秒)。
我有公式将 ABSOLUTE_TICK 与基于文件的 PulsePerQuarterNote (PPQN) 的秒数关联到速度(每四分音符的毫秒数)。
问题是:第一个音轨(音轨 0)中的 TEMPO 变化是否适用于所有其他音轨?
如果是这样,那么当我解析其他音轨时(例如,音轨 4,其中包含我感兴趣的 NOTE_ON 和 NOTE_OFF 消息),我需要将手指指向音轨 0 中并行的 TEMPO 变化。对吗?
谢谢,
标记
【问题讨论】:
【参考方案1】:简而言之,是的。第一个轨道包含将应用于整个安排的时间信息,因此您将这些消息应用于具有相同绝对时间的每个轨道。由于所有事件都使用刻度偏移量,因此您需要首先提取速度变化消息,将它们转换为绝对时间,然后在您阅读其他曲目时,您将根据该时间线应用这些消息。
来自MIDI fanatic's technical brainwashing center:
在格式 0 文件中,速度变化分散在一个 MTrk 中。在格式 1 中,第一个 MTrk 应该只包含速度(和时间签名)事件,以便它可以被一些能够生成“速度图”的设备读取。最好不要在这个 MTrk 中放置 MIDI 事件。在格式 2 中,每个 MTrk 应以至少一个初始速度(和拍号)事件开始。
也就是说,一些音序器确实违反了这一规则,并将实际的 MIDI 事件与计时信息一起放在第一条轨道中,因为标准在这方面并没有那么具体。您的程序应该同时处理这两种情况,因为它很可能会在野外遇到以这种方式格式化的 MIDI 文件。
【讨论】:
感谢 Nik...您提供的参考资料是迄今为止我发现的最有用的 MIDI 参考资料。 是的,我自己也喜欢那个网页。它是所有 MIDI 的宝库,也有很好的极客幽默,以防止事情变得过于枯燥。如果您还没有弄清楚,主要门户页面实际上是home.roadrunner.com/~jgglatt 这里是某个镜像站点的链接 (midi.teragonaudio.com),因为来源似乎已关闭。 你成功了吗?有伪代码遍历功能就好了。以上是关于Midi TEMPO 信息如何应用于其他曲目?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 OS X 中读取 midi 文件并获取曲目的预设信息