前提
フォーマット1のMIDIファイルのバイナリを解析して、音の鳴るタイミングとどの音が鳴るのかというデータを集めようと思っています。
質問
MIDIのデータ本体は、
デルタタイム→イベント→デルタタイム→イベント→…
となっているわけですが、拾わないイベントは無視しつつ、すべてのデルタタイムを足し合わせるのは正しい方法でしょうか?
問題
これを元にプログラムを実行したところ、並列で演奏されるはずのトラックが、直列に演奏する結果になってしまいました。
私のプログラムは、まずMIDIデータをトラックごとに分解した後、それぞれトラックごとに初期値0の変数を作り、デルタタイムを見つけるたび変数に加算するようにしています。
ただ、同一トラック内の音と次の音の間隔は、元のMIDIファイルと同じだったので、デルタタイムをミリ秒に変換することに失敗しているわけでは無さそうです。
音色は原曲通りなのでデータの読み方自体に失敗しているわけでも無いです。
解析結果を見てみると、なぜか複数のメタイベントの前のデルタタイムに秒に直すと7秒ほどのものがちらほら検出されているのが不思議でした。
補足
デルタタイムだけMIDIファイルの解析の仕方が誤っているか、そもそもの手法が誤っているか、どちらかが失敗の原因だと目星を付けているので、ソースコードは掲載しません。
一般に、フォーマット1のMIDIのデータを解析するとき、この手法が誤っているかどうかだけ聞きたいので質問します。
図 トラックごとに再生開始から最初に音が鳴るまでの時間を出力したもの(単位はミリ秒)
入力に使ったMIDIファイルは、音の始まりが複数のトラック同時なので、この時点で解析の誤りが確認できます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。