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

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

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

先谢谢了!

嘿嘿,这时候就要祭出俺当年北漂帝都,拎着一个华硕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

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

3赞

多谢神!

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

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

绝对时间是通过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。

2赞