怎么计算MIDI文件时间长度?

提问于
最后更新于
浏览 70次
登录并提问
1

如题,如果我知道MIDI的tick长度,如何计算其秒数长度?如果MIDI总共只有一个Tempo信息还好办,但有多个Tempo就不好办了。该怎么算,比如计算平均速度?

提问于 2021/2/16 下午1:13:47
0

随便找个midi编辑软件拉到最后不就知道MIDI总长度了?

独自听听
XP 1550
独自听听
回答于 2021/2/16 下午2:10
2

数据结构层面上来说,midi 文件中没有直接存储整首乐曲的时间长度信息,所以,计算整个长度就需要遍历文件,找出每个 tempo 变更事件,然后计算出 tempo 变更事件之后的时间长度,然后把各个时间长度加起来,就是整个 midi 文件的播放时长。


要理解上面这个步骤,需要先搞清楚 MIDI 文件的结构。

可以参考这个帖子: https://tat.midishow.com/t/topic/220/4


关键信息就是kingsky说的:

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

riverlet
XP 1739
riverlet
回答于 2021/2/16 下午8:12
-1

aI唡a!aI弜R=}ۏGo6߱;mƕUs

MB셅$CqHa߯=Q۾Ɣ TWNT.

Happy_734308
XP -15
Happy_734308
回答于 2025/5/13 下午7:55

您的回答

登录以回答

这儿是 MidiShow 问答区,欢迎您请教或帮大家解决关于音乐创作、MIDI 应用、MIDI 技术等音乐相关的问题。

问答区积分规则如下:


  1. 提问、回答或自问自答积分均不变
  2. 问题被赞成 : +10
  3. 问题被反对 : 提问者 -2,点击反对者不扣分
  4. 回答被赞成 : +10
  5. 回答被反对 : 回答者 -2,点击反对者 -1
  6. 提问者选出满意回答 :回答者 +15 ,提问者 +2

参与问答前请阅读:问答区玩法规则