我正在使用 sequence.getResolution()
内置方法来提取节拍的长度(以毫秒为单位)。它适用于某些歌曲,但不适用于全部。例如,对于歌曲“sweet home alabama”,它返回 384 MS 的节拍,但在现实生活中,实际节拍长度为 612 MS。这适用于无数其他歌曲,但仅适用于我正在处理的其中一首歌曲。
任何其他使用 java 正确提取 MIDI 文件的 bpm 或节奏的方法将不胜感激
最佳答案
速度在 MIDI 文件中自动定义。使用 javax.sound.MIDI 中的 MetaMessage 类和 getData() 方法,您将获得元数据的字节。标记为 0x51 的字节保存每个轨道每四分音符以微秒为单位测量的速度值。注意,每个 MIDI 文件通常有多个轨道;因此有多个节奏特征。请看下面的MIDI结构概要链接。它解释了每一段 MIDI 文件数据以及它们的位置和含义。
这里是 MIDI 结构概要的链接:http://www.ccarh.org/courses/253/handout/smf/
这里是 MetaMessage 类的链接:https://docs.oracle.com/javase/8/docs/api/javax/sound/midi/MetaMessage.html
这里是标准 MIDI 文件格式的链接: https://formats.kaitai.io/standard_midi_file/index.html
简单总结:第 11 和 12 字节 = 磁道数。它位于 14 字节长的 header 中。接下来是一个轨道 block ,然后是另一个轨道 block ,然后是另一个轨道 block ,其次数由第 11 和第 12 字节定义。每个 block 的长度定义为 block 中的 5、6、7 和 8 字节。长度测量轨道有多少字节(从第 9 个字节开始)。
关于java - 如何从 MIDI 文件中提取速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55188029/