将MIDI-deltatimes转换为秒

时间:2012-12-20 15:38:34

标签: midi milliseconds

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

我的方法:

  1. 我在每个轨道中搜索setTempo-Events并将它们全部放入列表中。我还在列表中存储了后续setTempo-Events之间的刻度数。

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

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

  4. 这是从MIDI文件获取音符开启的正确方法,还是我必须考虑时间签名? - 是来自setTempo-event microseconds / quarter或microseconds / beat?

    的数据

    另一个问题: 假设我有两个曲目的文件。跟踪二在文件的最后只有一个事件,假设deltatime = 1000。第一个轨道有两个setTempo-Event,一个是deltatime = 0,另一个是deltatime = 500。

    哪个速度用于等待第二个音轨中的1000个音阶 - 第一个速度,第二个或两者?

1 个答案:

答案 0 :(得分:2)

我使用的一般状态是:

  1. 在列表中记录所有速度变化。
  2. 对于每个速度变化,使用先前的速度及其实时来计算速度变化的实际时间。这将产生一个节奏“间隔”列表,其中包含以刻度开头的开始时间和以秒为单位的开始时间
  3. 对于每个事件,确定它所属的速度间隔,并计算自节奏间隔开始以来的实际时间
  4. 如果你正在按顺序进行所有处理,那么一旦你建立了间隔,确定音符落入哪个间隔是相当微不足道的。

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