我已经研究了这个主题一段时间了,但仍然没有弄明白。 我使用midas3库(Midi-actionscript3)将midi导入flash。我在时间轴上得到每个音符项目。我得到除法值(192),所有“GET-TEMPO”元素都等于81。
我尝试了很多组合来获得midi的实际时间但仍然没有好处(例如时间轴* 192/60)。
我知道它与实际时间不同步的原因是当我将音符可视化为闪存中的简单矩形时 - 我检查它们是否与mp3文件播放完全一致(我已将midi文件转换为此mp3使用简单的转换程序)
我已经阅读了很多关于如何计算所有内容的信息,但仍然没有弄清楚我需要使用的数字才能使它正确(时间轴* MysteriusConstant = ReaTIME,MysteriusConstant的值是多少?它真的是不变的吗?如果不是我如何计算它是如何改变的?)
感谢 阿龙
答案 0 :(得分: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事件后的秒数,而不是序列开始时的秒数。您需要保持此值的总计,以构建一个连贯的序列。