Java 如何从MIDI文件中提取节奏

Java 如何从MIDI文件中提取节奏,java,midi,Java,Midi,我使用sequence.getResolution内置方法来提取节拍的长度(以毫秒为单位)。它适用于某些歌曲,但并非所有歌曲。例如,对于歌曲“甜蜜家园阿拉巴马”,它返回的节拍为384毫秒,但在现实生活中,实际节拍长度为612毫秒。这适用于无数其他歌曲,仅适用于我正在处理的其中一首歌曲 使用java正确提取MIDI文件的bpm或节拍的任何其他方法都将非常受欢迎节拍在MIDI文件中自动定义。使用javax.sound.MIDI中的MetaMessage类和getData方法,您将获得元数据的字节。标

我使用sequence.getResolution内置方法来提取节拍的长度(以毫秒为单位)。它适用于某些歌曲,但并非所有歌曲。例如,对于歌曲“甜蜜家园阿拉巴马”,它返回的节拍为384毫秒,但在现实生活中,实际节拍长度为612毫秒。这适用于无数其他歌曲,仅适用于我正在处理的其中一首歌曲


使用java正确提取MIDI文件的bpm或节拍的任何其他方法都将非常受欢迎

节拍在MIDI文件中自动定义。使用javax.sound.MIDI中的MetaMessage类和getData方法,您将获得元数据的字节。标有0x51的字节保存每个音轨每四分之一音符测量的速度值(微秒)。注意,每个MIDI文件通常有多个曲目;因此,多个节奏签名。请看下面MIDI结构链接的概要。它解释了每一段MIDI文件数据,以及它们的位置和含义

以下是指向MIDI结构概要的链接:

以下是指向MetaMessage类的链接:

以下是标准MIDI文件格式的链接:


简单摘要:第11和第12字节=磁道数。它位于14字节长的标题中。接下来是一个轨迹块,然后是另一个,以及第11和第12字节定义的次数。每一个都有一个在块中的5、6、7和8字节中定义的长度。长度测量曲目从第9个字节开始的字节数。

您确定源MIDI文件有效吗?我经常遇到自动计算的节拍不合适的情况,就像这样。节拍会随着时间的推移而改变,并且不是每个MIDI文件都正确定义节拍。@CL他们根据MIDI文件的创建者定义节拍。每个MIDI文件都有一组曲目,每个曲目定义一个节奏。一般来说,所有的音轨都有一个恒定的节奏,但是。。。