昨日は帰りに楽器屋に寄って、テスト用に手頃な中古MIDI音源がないかなーと思ってチェックした。SC88Proが19,800円、TX81Zが4000円だった。TX81Zがまだ売っているが驚きだが。TX81Zは手頃な価格なのだが図体がでかい(ラックマウント)ので諦めた。どこかにSC55がただ同然で転がっていないだろうか。。
それはさておき、昨日からMIDIのロング・メッセージ(システム・エクスクルーシブ)周りを調べていてようやく理解した(midiInPrepareHeader・midiInAddBuffer・midiInUnprepareHeader)。
処理の流れはこうだ。
- midiInOpenでドライバをオープンする。
- システム・エクスクルーシブを受けるバッファ用のメモリを自前で確保する。
- midiInPrepareHeaderでバッファ用メモリの情報をドライバに教える。情報はMIDIHDR に格納する。
- midiInStartで受信スタート。
- ドライバはシステム・エクスクルーシブを受け取るとバッファメモリに格納し、MIM_LONGDATAメッセージを送る。
- >MIM_LONGDATAでシステム・エクスクルーシブを受ける。
- midiInAddBufferで確保したメモリを再利用できるようにする。
- 受信を停止するまで5-7を繰り返す。
- midiInStopで受信を終了する。
- midiInUnprepareHeaderでバッファ用メモリ情報をクリアする。
- midiInCloseでドライバをクローズする。
MIM_LONGDATAでデータを受け取ったら、受信バイトの末尾が0xF7かどうかを確認すること。0xF7であればエクスクルーシブデータは受信完了だし、そうでないのなら引き続き受信を行う処理を組み込まないといけない。
ということで理解できたのだが、MIDI Wrapperクラスの処理はさらにわからなくなってしまった。まあいいか。。