如题,如果我知道MIDI的tick长度,如何计算其秒数长度?如果MIDI总共只有一个Tempo信息还好办,但有多个Tempo就不好办了。该怎么算,比如计算平均速度?
3 回答
数据结构层面上来说,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。
随便找个midi编辑软件拉到最后不就知道MIDI总长度了?
您的回答
登录以回答这儿是 MidiShow 问答区,欢迎您请教或帮大家解决关于音乐创作、MIDI 应用、MIDI 技术等音乐相关的问题。
问答区积分规则如下:
- 提问、回答或自问自答积分均不变
- 问题被赞成 : +10
- 问题被反对 : 提问者 -2,点击反对者不扣分
- 回答被赞成 : +10
- 回答被反对 : 回答者 -2,点击反对者 -1
- 提问者选出满意回答 :回答者 +15 ,提问者 +2
参与问答前请阅读:问答区玩法规则