如何从 MIDI 文件中提取速度

Posted

技术标签:

【中文标题】如何从 MIDI 文件中提取速度【英文标题】:How to extract tempo from MIDI file 【发布时间】:2019-03-15 17:35:33 【问题描述】:

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

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

【问题讨论】:

您确定源 MIDI 文件有效吗?我经常遇到自动计算的节奏不合适,就像这样。 速度会随着时间而改变,并不是每个 MIDI 文件都能正确定义节拍。 @CL 他们根据 MIDI 文件的创建者定义节拍。每个 MIDI 文件都有一堆轨道,每个轨道定义一个速度。一般来说,所有曲目的节奏都是恒定的...... 【参考方案1】:

速度在 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 个字节开始)。

【讨论】:

以上是关于如何从 MIDI 文件中提取速度的主要内容,如果未能解决你的问题,请参考以下文章

使用 MetaMessage getData() 和/或 MetaMessage 值从 java 中的 MIDI 文件中提取速度?

使用 NAudio 在 MIDI 文件中设置 MIDI 速度

BLE MIDIMIDI 文件速度设置识别 ( 查找 midi 文件中速度相关的二进制数据 | FF 51 03 速度设置指令 )

BLE MIDIMIDI 文件速度设置识别 ( 查找 midi 文件中速度相关的二进制数据 | FF 51 03 速度设置指令 )

MIDI 文件的分辨率会影响它的速度吗?

如何“减慢” MIDI 文件(最好在 Python 中)?