【问题标题】:How to convert midi timeline into the actual timeline that should be played如何将midi时间线转换为应该播放的实际时间线
【发布时间】:2011-03-13 09:44:22
【问题描述】:

我已经研究了一段时间,但仍然没有弄清楚。 我使用 midas3 库 (Midi-actionscript3) 将 midi 导入到 flash。我在时间线上得到每个笔记项目。我得到了除数 (192),所有“GET-TEMPO”元素都等于 81。

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

我知道它与实际时间不同步的原因是,当我将音符可视化为 Flash 中的简单矩形时 - 我检查它们是否与 mp3 文件播放的内容完全一致(我已将 midi 文件转换为这个 mp3使用简单的转换程序)

我已经阅读了很多关于如何计算所有内容的信息,但仍然没有弄清楚我需要使用的数字才能正确处理(时间线 * MysteriusConstant = ReaTIME,MysteriusConstant 的值是多少?它真的是常数吗?和如果不是,我如何计算它是如何变化的?)

谢谢 阿隆

【问题讨论】:

    标签: flash actionscript-3 midi timeline timecodes


    【解决方案1】:

    如果我正确理解您的问题,您基本上希望将每个 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 事件以来的秒数,而不是从序列开始的秒数。您需要保持该值的总和以构建一个连贯的序列。

    【讨论】:

    • 还请记住,尽管分度是恒定的,但速度会通过 MIDI 元事件发生变化。即使您自己生成了 MIDI 文件,这也可能不是问题。但是您应该考虑到这一点并避免缓存tempo * division,以防您的软件将来需要支持它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2018-12-03
    • 1970-01-01
    • 2011-07-29
    • 2014-12-04
    相关资源
    最近更新 更多