【音楽技術AC12/1】 ソフトウェアMIDI入力デバイスを作ろう

音楽技術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のようにVSTAUなどのオーディオプラグインをトラックで指定して打ち込むタイプのツールでは、そのままでは使えないのが問題です。オーディオプラグイン側をMIDIバイスのように設定して認識させることができれば可能かもしれませんが、一般的なオーディオプラグインDAWからしてみれば、MIDIキーボードはMIDI入力デバイスであり、MIDI入力デバイスをサポートしてしまえば終わりです。オーディオプラグインをわざわざ機能の制限されたMIDI音源として利用可能にする意味がほとんど無いのです。

MIDI virtual input device / portを作る

そういうわけで、DAWにも認識してもらえるようなソフトウェアMIDIキーボードを実現するための一番確実な方法は、ソフトウェアMIDI入力デバイスあるいはポートを作るところからです。

一般的には、CoreMIDIもALSAも、作成した仮想ポートにMIDIメッセージを「出力」すると、それが「入力」となって、その仮想ポートに接続されたアプリケーションが最終的にMIDIメッセージを受け取れることになります。というわけで、GUIから受け取ったキー入力イベントは、これらの仮想ポートに出力するようにすると良いでしょう。

実例

わたしが.NET開発者だった頃に作った個人的なプロジェクトですが、仮想ポートを活用して既存のソフトウェアMIDIキーボードアプリに仮想ポートを自動的に作成するようにしたものがあります。このアプリ上で入力したキーボードイベントから生成されたMIDIメッセージは、接続されたMIDI出力デバイスに送られるほか、仮想ポートに接続したDAWが受け取ることもできます。

github.com

自分で作成したアプリなので、入力はまあまあやりやすいので、たまに打ち込み作業で使っています。

いかがでしたか? 自分で好きなように楽器のインターフェースを作れるのは割と楽しいので、もし興味が出てきたらぜひ試してみてください。