昨日はplayerがbreak throughを得たので、そのまま調子に乗ってもうひとつ予定していた小物アプリを書き上げた。PCのキーボードを利用した仮想MIDIキーボードである。これもportmidi-sharpのリポジトリに入っている。
実は同じ目的のプログラムを大昔にWindows APIベースで書いたことがあるのだけど、ソースもどこかに行ってしまったし今さらMFCのソースを眺める気もしない。その割に、MIDIをいじって打ち込もうとする時には未だに手放せない。世にあるMIDIキーボードツールの大半はマウスでクリックしないと発音できない(どうやって和音を出すというのだろう)。キーボード入力を受け付ける賢いやつは、まあWindowsでしか見たことが無い。
そんなわけで、portmidi-sharpで書き直そうと思っていたのである。
仕組みは大変簡単で、KeyDownしている間だけ、そのキーに割り当てられた音で発音し、KeyUpで消音する。上下矢印キーでオクターブを変更する。出力デバイスと音色だけ変えられればとりあえず実用に堪える。
単純なアプリだが、標準的なUIをもっているというわけではない。ボタンはそれ自身のUIイベントとは無関係にup/downしなければならないし(ボタンにしないという選択は無くもないが)、音色選択やデバイス選択のコンボボックスにフォーカスがある時は、それ自身のキーバインドを有効にしなければならない一方で、ボタンはフォーカスを受け取ると変なUIになってしまう(発音/消音とフォーカスは無関係)。
何で書くかは一寸考えたが、結局winformsで書くことにした。そしたらキーイベントの拾い方ではまるはまる。Formはフォーカスを受け取らないし、キーイベントを消費したことを明示してもなお上下カーソルを押したらフォーカスが移動してしまう(オクターブ上下に使うために使っているのに)。仕方ないのでダミーのTextBoxを用意して、ここでキーイベントを全て受け取るようにして解決した。
こんな風に、Linux環境にも少しずつ打ち込み環境を整えていきたい。
Leave a comment