2012-12-20 117 views
1

我的目标是从标准MIDI文件中检索精确的音符开/关时序。 该文件是类型1(它有几个轨道)和定时模式是每季度滴答。将MIDI-deltatimes转换为秒

我的方法:

  1. 我搜索setTempo事件在每个轨道,并把它们全部放入一个列表。我还在我的列表中存储后续setTempo事件之间的滴答数量。

  2. 然后我将每个事件的所有deltaTime加起来,并获得相对于每个事件的零点滴答的绝对滴答数。

  3. 最后我计算时间以秒为蜱的绝对数量和包含拍子

那是从一个MIDI文件获得音符的声母一个正确的方法,或做名单我也必须考虑时间签名? - setTempo事件的数据是微秒/四分之一还是微秒/节拍?

另一个问题: 假设我有一个文件有两个轨道。跟踪二只在文件的最后有一个事件,可以说deltatime = 1000。跟踪一个有两个setTempo事件,一个deltatime = 0,另一个deltatime = 500。

哪个节奏用于等待第二轨中的1000个节拍 - 第一个节奏,第二个还是两个?

回答

2

我使用的一般stategy是:

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

如果您要一次性处理所有处理,按顺序确定音符落入哪个区间是相当平凡的,一旦您建立区间。

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