めまいが…こんなにプログラムで苦しんだのは久しぶりだ。。。
音楽情報実験の課題2が昨日終わって、余裕ぶっこいて課題3に挑戦。
まずUNIデータを保持するクラスは昨日こしらえたので、SMFフォーマットを書き出すところから始めた。。。
んが、これが上手くいかない。 何故かと言えば「可変長数値」という特殊なビット演算を使う数値の表現方法がある上、SMFのMIDIメッセージやらは全て「逆バイト順」で書きこまなくてはならない。 これは気付かずにハマってしまうと最悪な事態だ。
そしてなんとかSMFをいじくるクラスができたところで、次に肝心のUNI->SMFの変換クラスをこしらえることになる。 とりあえずSMFの知識はルーズソックエミュレータを作ったときに独学していたので、ここまでは4時間で完成。
そしてここからが地獄!!!
口では説明できないようなプログラムになること間違い無し!!! 「デルタタイム」と「インターバル」がぐちゃぐちゃに入り乱れ飛び交うことになる。。。 大きなヒントになるけど、UNIフォーマットにはノートオフがないので、UNIイベントのlengthパラメータとinterva!
lパラメータを比較しながら、ノートオフの相対的なデルタタイムを全て計算していくことになる。 それを効率良くやるためにノートオフの待ち行列を新たに作成してて、そこから先入れ後出しのアルゴリズムで吐き出してあげるわけだが、これにさらにメモリの管理が必要になるわ、tempoパラメータがあるわ、果てにはSMFの分解能とUNIの分解能の比率を計算してあげたりで、久しぶりに相手に恐怖を感じました。
とりあえず8時間後、、、WinAmpでキレイなサンプルが流れるようになりました。。。感動もクソもない。。。涙
この課題、MIDIで音が鳴る仕組みを理解してCのビット演算の知識がついてないと、相当苦しいです。 しかもこの次に課題3-2があるので、もうヒトヤマ!!!