昨日のコントロールチェンジの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++のマルチメソッドの項を読み返している。