怎样获取、测定一个MIDI文件的bpm?

群里有同学问有没有 midi的bpm测定软件,我也不太清楚,之前做Midi文件属性提取的时候还考虑过这个问题,貌似 mid 文件里并没有这个属性,需要计算。

有人知道计算方法或原理吗?给点思路也行。

先谢谢了!

1 Like

嘿嘿,这时候就要祭出俺当年北漂帝都,拎着一个华硕EeePC上网本,在每天上下班的公交车上,敲出的MIDI文件解析帖子咧~

读书笔记——MIDI文件结构简介
https://www.cndzq.com/bbs/thread-114440-1-1.html

读书笔记:MIDI Tick、Meta-event、变长数表示法、区分MIDI文件中单个字节的含义
https://www.cndzq.com/bbs/thread-117332-1-1.html

研究MIDI文件结构,发个读书笔记~有关MIDI音乐的拍速、MIDI Tick速度和周期等等的转
https://www.cndzq.com/bbs/thread-110934-1-1.html

先贴一下外链,以解河总燃眉之急~文章原文和配图俺都有,回头有机会再整理到这里来~

5 Likes

多谢神!

有这些足够了,我去看看再整理整理,能研究明白的就发过来。

1 Like

捞干的,就是第三个帖子里的内容:

绝对时间是通过meta-event中的FF 51 03 xx xx xx来定义的。这个meta-event表明了一个四分音符的绝对时间长度。而一个四分音符包含多少个tick,又是由MThd块中来定义的。所以这样就能换算出一个tick所需要的时间有多长。

人通常是按照曲子的拍速来度量的。拍速就是指曲子的一分钟有多少拍。通常(有不是通常的时候)一拍就是一个四分音符(quarter-note)。所以(仅在)通常情况下,一拍 == 一个四分音符的长度 == 480个MIDI Tick。

所以,根据meta-event事件的FF 51 03 xx xx xx,可以得到一个四分音符的绝对时间长度。如果用一分钟(60秒,即60,000,000微秒)来除这个值,就得到了曲子的拍速Tempo。比如上面例子,得到的四分音符时间为468750微秒,所以它的拍速就是:

Tempo = 60,000,000 / 468,750 = 128 bpm.

而通过 MThd块中对每个四分音符中包含MIDI Tick数的定义(就是所谓的TPQN,Ticks Per Quarter-Note),将这个四分音符的绝对时间长度,除以TPQN,就得到了每个MIDI Tick的绝对时间。所以示例中的每个MIDI Tick的绝对时间就是:

468,750 / 480 = 976.5625 us = 976562.5 ns。

4 Likes

惭愧,直到现在才回来研究这个问题。

bpm的计算就是用楼上大神说的 60,000,000 / xx xx xx 这几个字节。

和音色标准一样,一个 midi 文件中的 bpm 也是随时可变的。

亲眼看这个 mid 文件在播放过程中从 250 的bpm 一路降到了 55 bpm :joy:

unknown_zh.mid (21.3 KB)

1 Like

补充:如果mid中没有设置tempo相关的事件,则默认 tempo 为 500000 microseconds per beat, 也就是 120bpm .

2 Likes