2011-03-13 70 views
6

我已经研究了这个主题一段时间,但仍然没有弄明白。 我使用midas3库(Midi-actionscript3)将MIDI导入闪存。我在时间线上获得每个笔记项目。我得到的分区值(192)和所有的“GET-TEMPO”元素等于81.如何将midi时间线转换为应播放的实际时间线

我试了很多组合来获得midi的实际时间,但仍然不好(时间轴* 192/60例如)。

我知道它没有与实际时间同步的原因是,当我在flash中将音符可视化为简单的矩形时 - 我检查它们是否完全显示mp3文件播放的内容(我已将该midi文件转换为此MP3使用简单的转换程序)

我已经读了很多关于如何计算所有,但仍然没有弄清楚我需要使用的数字是正确的(时间轴* MysteriusConstant = ReaTIME,MysteriusConstant的值是什么?它真的是恒定的吗?如果不是,我该如何计算它是如何改变的?)

谢谢 Alon

回答

8

如果我正确理解您的问题,您基本上想要将每个MIDI音符的刻度转换为毫秒值,以便沿着时间线可视化地显示音符。

首先,您需要使用除法和速度来确定单个刻度的值。这转换基本上看起来像:

[ 1 min 60 sec 1 beat  Z clocks ] 
| ------- * ------ * -------- * -------- | = seconds 
[ X beats 1 min Y clocks  1 ] 

所以,在上面的转换,X是节奏,Y为师,并Z是从传入事件的时钟数。你可以看到所有的单位如何取消,在几秒钟内给你一个价值。因此,转化的浓缩版本是:

(60 * clocks)/(tempo * division) = seconds 

请记住,在这里seconds给出的数值是自以前 MIDI事件的秒数,而不是从序列的开始。你需要保持这个值的总数来构建一个连贯的序列。

+0

另外请记住,虽然分区是不变的,但速度可能会因MIDI元事件而改变。即使您自己生成了MIDI文件,但这可能不是问题。但是,您应该考虑到这一点,并避免缓存'tempo * division',以防您的软件在未来需要支持它。 – 2011-03-14 10:48:34

相关问题