1

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

我的做法:

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

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

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

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

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

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

4

1 回答 1

2

我使用的一般策略是:

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

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

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

于 2012-12-20T19:03:58.273 回答