S.F. Tracker (173)

公開:2006-04-13 05:52
更新:2020-02-15 04:36
カテゴリ:sftracker,c++,windows,audio,tracker

昨日のコントロールチェンジのLSBの処理だが、
・先ずMSBはMSBとして処理してMSBの値をcacheする
・後でLSBがきたら(cacheしたMSB << 7) + LSBという新たなイベントを起こせば解決できる。

よく考えるとコントロールチェンジは複数のコマンド群からなっているので、これを個々のコマンドオブジェクトに分解する必要がある。
しかし、これを行うとコマンドが大量に増える。

各コマンドのの処理は、mahineにコマンドを引数にしたsequence()をオーバーロードして行っている。

virtual void sequence(const UINT time,const pattern_command& com) = 0;
virtual void sequence(const UINT time,const note_command& com) = 0;
virtual void sequence(const UINT time,const note_on_command& com) {};
virtual void sequence(const UINT time,const note_off_command& com) {};
virtual void sequence(const UINT time,const control_change_command& com) = 0;
virtual void sequence(const UINT time,const program_change_command& com) = 0;
virtual void sequence(const UINT time,const pitch_bend_command& com) = 0;
virtual void sequence(const UINT time,const automation_command& com) = 0;
.
.
.

コマンドが増えるとダブルディスパッチのオーバーロードが増えるので、これを何とかできないかなと、MC++のマルチメソッドの項を読み返している。