我正在使用内置的sequence.getResolution()方法提取节拍的持续时间(以毫秒为单位)。它适用于某些歌曲,但不是全部。例如,对于歌曲“ sweet home alabama”,它返回384 MS的节拍,但是在现实生活中,实际节拍长度为612 MS。这适用于无数其他歌曲,并且仅适用于我正在处理的其中一首歌曲。
使用Java正确提取MIDI文件的bpm或速度的其他方法将不胜感激
答案 0 :(得分:0)
速度在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字节长的标头中。紧随其后的是一个磁道块,然后是另一个磁道块,以及第11和12个字节定义的次数。每个块的长度在块的5、6、7和8个字节中定义。长度测量轨道的字节数(从第9个字节开始)。