2012-12-20 116 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. 對於每個事件,確定它落入哪個節奏間隔,並計算自節奏開始以來的實時時間區間

如果您要一次性處理所有處理,按順序確定音符落入哪個區間是相當平凡的,一旦您建立區間。

對於第二個問題 - 以前的所有節奏都會影響事件的實時性。上述戰略將解決所有這些問題。