java - 如何从 MIDI 文件中提取速度

标签 java midi

我正在使用 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/

相关文章:

java - 如何使用输入流列表创建 ZIP 文件?

java - Texture.setEnforcePotImages(false);无法解决android studio下的moth错误

java - 选择密码行并粘贴到记事本中即可显示密码

Java 无法替换后跟的字符串\n

java - 将连续 Controller 数据写入 MIDI 文件

java - 是否可以拦截 spring-data-elasticsearch 中的保存或加载事件?

midi - RtMIDI - 在 OSX 下工作,在 Windows 下不接收

python - 使用 pygame.mixer.music 选择播放 MIDI 的设备

python - python 中 MIDIUtil 中的乐器列表是什么?

java - Head First Java——创建第一个音乐播放器报错