默认情况下,MIDI 文件设置为 120 bpm 的速度,文件中的 MThd 块将以“每四分音符的脉冲数”(ppqn) 的形式告诉您分辨率。
如果 ppqn 是 96,那么 96 个刻度的增量就是一个四分音符。
如果您对每个声音的实际持续时间(以秒为单位)感兴趣,您还应该考虑可以通过事件“FF 51 03 tt tt tt”改变的“节奏”;这三个字节是四分音符的微秒。
使用这两个值,您应该可以找到所需的内容。请注意,midi 文件中的持续时间可能是近似的,特别是如果该 MIDI 文件是人类演奏者的录音。
很久以前我已经整理了一个C库来读/写midifile:https://github.com/rdentato/middl以防万一它可能会有所帮助(有一段时间我不看代码,请随时询问是否有有什么不清楚的地方)。
我建议采用这种方法:
- 选择与您的划分兼容的“最小注释”(例如 1/128)并将其用作一种网格。
- 将每个音符与最近的网格线对齐(即与最小节点的最近整数倍)
- 将其转换为标准记谱法(例如四分音符、八分音符等)。
在您的情况下,将 1/32 作为最小音符,将 384 作为除法(即 48 个滴答声)。对于 376 刻度的注释,您将得到 376/48=7.8,将其四舍五入为 8(最接近的整数)和 8/32 = 1/4。
如果您找到一个持续时间为 193 个滴答声的音符,您可以看到它是 1/8 音符,因为 193/48 是 4.02(您可以四舍五入为 4)并且 4/32 = 1/8。
继续这个推理,您可以看到持续时间为 671 节拍的音符应该是双点四分音符。
实际上,671 应该近似为 672(48 的最接近的倍数),即 14*48。所以你的笔记是 14/32 -> 7/16 -> (1/16 + 2/16 + 4/16) -> 1/16 + 1/8 + 1/4。
如果您习惯使用二进制数,您可能会注意到 14 是 1110,并从那里直接推导出 1/16、1/4 和 1/8 的存在。
再举一个例子,一个 480 节拍的音符是一个四分音符与一个 1/16 音符相连,因为 480=48*10 而 10 是二进制的1010。
三胞胎和其他组会使事情变得更复杂一些。最常见的除法值是 96 (3*2^5)、192 (3*2^6) 和 384 (3*2^7) 并非偶然;这种方式可以用整数个刻度来表示三元组。
在某些情况下,您可能不得不猜测或简化,这就是为什么没有“midi 到标准符号”程序可以 100% 准确的原因。