【问题标题】:Converting MIDI-deltatimes to seconds将 MIDI 增量时间转换为秒
【发布时间】:2012-12-20 15:38:33
【问题描述】:

我的目标是从标准 MIDI 文件中检索确切的音符开/关时间。 该文件是类型 1(它有几个轨道),计时模式是每季度滴答声。

我的做法:

  1. 我在每首曲目中搜索 setTempo-Events 并将它们全部放入一个列表中。我还将成功的 setTempo-Events 之间的滴答数存储在我的列表中。

  2. 然后我将每个事件的所有 deltaTimes 相加,并获得每个事件相对于零刻度的绝对刻度数。

  3. 最后,我从绝对滴答数和包含 tempi 的列表中计算出时间(以秒为单位)

这是从 MIDI 文件获取音符开始的正确方法,还是我也必须考虑时间签名? - setTempo-event 的数据是微秒/季度还是微秒/节拍?

另一个问题: 假设我有一个包含两条轨道的文件。轨道二在文件的最后只有 1 个事件,假设 deltatime=1000。 Track 1 有两个 setTempo-Event,一个 deltatime=0,另一个 deltatime=500。

哪个速度用于等待第二轨中的 1000 个滴答声 - 第一个速度、第二个或两者兼而有之?

【问题讨论】:

    标签: midi milliseconds


    【解决方案1】:

    我使用的一般策略是:

    1. 在列表中记录所有速度变化。
    2. 对于每个速度变化,使用前一个速度及其实时计算该速度变化的实时时间。这将产生一个节奏“间隔”列表,开始时间以节拍为单位,开始时间以秒为单位
    3. 对于每个事件,确定它落入哪个节奏间隔,并计算它从节奏间隔开始以来的实时时间

    如果您按顺序一次完成所有处理,那么一旦您建立了音程,确定音符落入哪个音程就相当简单了。

    对于您的第二个问题 - 所有之前的节奏都会影响事件的实时性。上述策略将解决所有这些问题。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多