VST3プラグインでは、信号処理用のProcessorとパラメータ管理・UI管理用のControllerは別コンポーネントとなっており、両者の間でデータをやりとりするときはParameterChangeまたはMessageを使うことになっている。
ParameterChangeの仕組みは実装例が豊富であるものの、扱える情報は基本的に0.0~1.0の正規化された実数だけであり、整数、配列、文字列といったデータは扱いづらい。
一方でMessageの実装例は少なく、特にProcessor側からControllerへ伝えるシンプルな例は現状ほとんどない。
オーディオ情報やMIDI情報はProcessorのprocess()関数で検知する。そのためこれらを画面表示するためにはControllerへ渡す必要がある。ただし、process()関数はリアルタイムスレッドで動いており、このスレッドで時間のかかるメッセージ送信をしてはならず、代わりにタイマースレッドを使うようドキュメントには書いてある。
FAQ - How should I communicate between the 'Processing' and the 'User Interface'?
Communication between the components - Private communication
そこで、タイマースレッドでProcessorからメッセージ送信する、もっともシンプルなVST3/VSTGUIプラグイン実装例を書いてみた。
- VST InstrumentプラグインとしてDAWから起動できる
- MIDIキーボードやピアノロールからノートオンを受信すると、押されたノート番号をプラグイン画面に表示する
- 複数の鍵盤を押した場合、一番高い音のノート番号を表示する。
- EditorクラスではUI更新用に定期的なタイマーイベントが動いている。ここでProcessorに毎回空のメッセージを送信する
- ProcessorはNoteOn/NoteOffイベントのたびに各鍵盤の状態を配列に記憶しておく
- メッセージを受信したProcessorは、鍵盤状態に変更があれば鍵盤状態配列をメッセージデータとしてControllerに返信する
- Controllerはノート番号表示用パラメータクラスに、押されている鍵盤のうち最も高い音のノート番号を渡す
- ノート番号表示用パラメータクラスは自身の状態を変更すると自動的に画面に反映される
VST3NotifyExample program is licensed under MIT License.
Copyright 2023, aike (@aike1000)