音楽技術Advent Calendar 2019の1日目エントリーです。今年はちょっと手が回らなそうなので「たまに書く」くらいのノリで進めていきたいと思います。かなり空き枠があるので、もし書けそうな話題がありましたらぜひご参加ください。2018年版を見るとわかりますが、割と手短なエントリーでも全然大丈夫です。
MIDIキーボードを使いこなせない…!
みなさんはDAWで打ち込むときにMIDIキーボードを使っていますか? たぶん少なからぬ人がYESと答えるのではないかと思います。DAWでマウスでポチポチとピアノロールに音を追加していく作業、しんどいんですよね。MIDIキーボードなどで入力して、ちょいちょい音長などを調整していけば効率的です。
…わたしこれがダメなんです。主な作業環境がノートPCなのでMIDIキーボードを繋いでいないことが多いのと、ふだん楽器を弾かないので間違いだらけになってしまうのが主な挫折ポイントです。まあどう考えても慣れるしか無いですね。
とはいえ、DAWでマウス入力していくのはしんどいので、もう少し別の方法で入力できないものか…とは思うわけです。MIDI音源はハードウェアでもソフトウェアでも良いのだから、MIDI入力デバイスもハードウェアではなくソフトウェアで作っても良いのでは…?
というわけで、ソフトウェアMIDIキーボードが誕生しました…というのはちょっと今さら感ありますね。2019年にあるオーディオプラグインには、PCキーボードを押すとMIDIノートメッセージとして処理してくれるものが少なからずあります。いずれにしろ、これは便利なので単体で実装する価値があります。
実際にはキーボードである必要はないのですが、今回はとりあえずどのPCにもありそうな「入力デバイス」であるところのキーボードを使います。
MIDI出力デバイスに接続するソフトウェアMIDIキーボードを作る
まず最初に思いつくのが、プラットフォームの標準MIDI APIを使って、接続したいMIDI出力デバイスを選択して、そのデバイスにMIDIメッセージを送る、というものです。これはそんなに難しくありません。 GUIでは、何らかのキーボード入力イベントを受け取れるコントロールをウィンドウに置いて、入力されたキーに応じてMIDIノートオン/ノートオフのメッセージを送信するだけです。
このアプローチでは、MIDI音源で演奏することはできるのですが、DAWのようにVSTやAUなどのオーディオプラグインをトラックで指定して打ち込むタイプのツールでは、そのままでは使えないのが問題です。オーディオプラグイン側をMIDIデバイスのように設定して認識させることができれば可能かもしれませんが、一般的なオーディオプラグインやDAWからしてみれば、MIDIキーボードはMIDI入力デバイスであり、MIDI入力デバイスをサポートしてしまえば終わりです。オーディオプラグインをわざわざ機能の制限されたMIDI音源として利用可能にする意味がほとんど無いのです。
MIDI virtual input device / portを作る
そういうわけで、DAWにも認識してもらえるようなソフトウェアMIDIキーボードを実現するための一番確実な方法は、ソフトウェアMIDI入力デバイスあるいはポートを作るところからです。
- Macの場合はCoreMIDIの
MIDIDestinationCreate()
を使います - Linuxの場合はALSA Sequencerの
snd_seq_create_simple_port()
https://www.alsa-project.org/alsa-doc/alsa-lib/group___seq_middle.html#ga9368266bde7b5c0f8d5ddeaf64914719などを使います - Windowsの場合は…WinMMにはアプリケーションから仮想ポートを作る機能が、入力・出力ともにありません(!) ちなみにUWPにもありません(!) なので標準APIだけで考えたらWindowsは捨てるしかないのですが、MIDI Yokeのようなソフトウェアをインストールして、そこに任意の入力をプログラマブルに繋ぎこむことができれば、いけるかもしれません(わたしは試したことがありません)
一般的には、CoreMIDIもALSAも、作成した仮想ポートにMIDIメッセージを「出力」すると、それが「入力」となって、その仮想ポートに接続されたアプリケーションが最終的にMIDIメッセージを受け取れることになります。というわけで、GUIから受け取ったキー入力イベントは、これらの仮想ポートに出力するようにすると良いでしょう。
実例
わたしが.NET開発者だった頃に作った個人的なプロジェクトですが、仮想ポートを活用して既存のソフトウェアMIDIキーボードアプリに仮想ポートを自動的に作成するようにしたものがあります。このアプリ上で入力したキーボードイベントから生成されたMIDIメッセージは、接続されたMIDI出力デバイスに送られるほか、仮想ポートに接続したDAWが受け取ることもできます。
自分で作成したアプリなので、入力はまあまあやりやすいので、たまに打ち込み作業で使っています。
いかがでしたか? 自分で好きなように楽器のインターフェースを作れるのは割と楽しいので、もし興味が出てきたらぜひ試してみてください。