如何从 MIDI 文件中提取速度

How to extract tempo from MIDI file

我正在使用 sequence.getResolution() 内置方法来提取节拍的长度(以毫秒为单位)。它适用于某些歌曲,但不是全部。例如,歌曲 'sweet home alabama' 它 returns 的节拍为 384 毫秒,但在现实生活中实际节拍长度为 612 毫秒。这适用于无数其他歌曲,并且仅适用于我正在处理的其中一首歌曲。

任何其他使用 java 正确提取 MIDI 文件的 bpm 或速度的方法将不胜感激

速度是在 MIDI 文件中自动定义的。使用 javax.sound.MIDI 中的 MetaMessage Class 和方法 getData() 您将获得元数据的字节。标记为 0x51 的字节保存了每条轨道每四分音符以微秒为单位测量的速度值。请注意,每个 MIDI 文件通常有多个音轨;因此有多个速度签名。请看下面的 MIDI 结构 link 的概要。它解释了每段 MIDI 文件数据以及所有内容的位置和含义。

这里是一个link到MIDI结构的大纲:http://www.ccarh.org/courses/253/handout/smf/

这里是 link 到 MetaMessage Class:https://docs.oracle.com/javase/8/docs/api/javax/sound/midi/MetaMessage.html

这里是一个link标准的 MIDI 文件格式: https://formats.kaitai.io/standard_midi_file/index.html

简单总结:第11和第12字节=轨道数。它位于 14 字节长的 header 中。接下来是一个轨道块,然后是另一个轨道块,然后是第 11 和第 12 个字节定义的另一个轨道块。每个都有一个长度,定义在块中的 5、6、7 和 8 个字节中。长度衡量轨道有多少字节(从第 9 个字节开始)。