今日は昨日のデスクトップ プレイヤーのために多少コードを切り分けたのを、さらに押し進めて、PortMidiSharpに依存するメッセージ出力機能を、単独で演奏を行うMidiPlayerから完全に切り離して、MidiPlayerにイベントフックを仕掛けるだけのものにした。コードはこれでかなりすっきりして、web版をデスクトップ版から完全に切り離して、かつ変更もスマートに共有できるようになった。
今日はこれだけで終わるかと思っていたけど、眠れなかったので、昨日の構想に基づいて、仮想レジスタマシンを作ろうと思って、とりあえずMIDI規格のメッセージ一覧を眺めて、ステータスを記録するべきものをリストアップする作業をやった。途中でCCの膨大なリストを全部拾い集めるのが面倒になって、単純に構造体にした時の配列のスロットだけ確認するかたちにした。
その途中で気がついたのだけど、コントロールチェンジにはモードメッセージというのがあって、オールサウンドオフすることができる。これを使えば一時停止はすぐ実装できるのではないかと思って、試しにPauseで 0xBn 0x78 0x00 を全チャネルに送ってみたら、あっさり停止できた。ということは...VMはこの目的では不要だったわけである。ついでに一時停止と停止まわりの処理がきちんと出来ていなかったので、一時停止や停止できちんと消音して終わるようにはした。
VMは今回は不要だったわけだけど、TMIDI Playerみたいに、画面上からコントロール パラメータを変更したい場合には、いずれにせよ記憶しておく必要があるので、これは実装することにする。
→実装してみた。RPN/NRPNだけtodoとして残っているけど。playerはイベントでVMのメッセージ設定を呼び出し、VMはportmidiにMIDIメッセージを送る、という仕組みになって、もしかしたらそろそろパフォーマンスの問題になるかもしれないな...
Leave a comment