VST3の用語について その１

[VST3制作の過去記事一覧はこちら](https://qiita.com/aike@github/items/05a14911bb89db8b6c2c)

音楽制作用DAWのプラグイン仕様VST3についてインターネットのヤホーで調べました。今回はVST SDKで使われる用語について整理してみる第1回目です。
この記事はVST3プラグインを書く人向けの内容です。

# モジュールとプラグインとコンポーネント

モジュールはVST3としてインストールする.vst3ファイルをイメージすると良いと思います。ここで出てくる用語の一番大きな単位です。
一方、プラグインは、独立したVSTエフェクト／インストゥルメンツとしてDAWで使用できる単位です。

どうして用語が分かれているかと言うと、誰が得するのかまったく謎ですが、VST3ではひとつのモジュールに複数のプラグインを含めることができてしまうからです。
※これは、ひとつの画面に多数のエフェクターが並ぶマルチエフェクターの意味ではなく、別々に読み込まれます

サンプルプログラムの[mda Plug-ins](https://steinbergmedia.github.io/vst3_doc/vstexamples/index.html#mdaplugs)には、ひとつのモジュールに30個のEffectと4個のInstrumentsが含まれていて大変なことになっています。 

ホストはモジュール（実体はDLL）をメモリに読み込んでプラグインを取り出すことができます。ただしプラグインはひとつのかたまりではなくコンポーネントごとに取り出します。基本的にプラグインはEditControllerコンポーネントとAudioProcessorコンポーネントのペアとして構成されます。[^1]
EditController(UI)とAudioProcessor(信号処理部)に分ける理由としては、将来的に映像処理などにも対応するためとドキュメントにありますが、現状でも別スレッドで動かしてUIが信号処理に影響しないというメリットもあります。[^2]

![module.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/f4256db0-0684-0213-d398-8e6c42fe733b.png)



# ユニット

ユニットは、マルチエフェクターやマルチティンバー音源をサポートするための機能です。最近増えてきた[Soundtoys Effect Rack](https://www.soundtoys.com/product/effect-rack/)や[IK Multimedia MixBox](https://www.ikmultimedia.com/products/mixbox/)のようなラック型プラグインとも親和性が高いと思います。
[VST3公式ドキュメントのスクショ](https://steinbergmedia.github.io/vst3_dev_portal/pages/Technical+Documentation/VST+3+Units/Index.html)がわかりやすいですね。

ひとつのプラグイン中にユニットがどれだけたくさんあっても、コンポーネントとしてはAudioProcessorとEditControllerのペアがひとつだけです。[^3]

ユニットの役割としては、パラメータに階層構造のIDを付与してパラメータを階層管理しやすくするのがひとつ、もうひとつはユニットごとにプリセットを読み込めるようにすることにあります。

特徴としては、ユニットを選択するという概念があり、なにかユニットが選択されたらコールバック関数を呼ぶことができます。選択されているエフェクターのプロパティ表示などを想定しているのかもしれません。[^4]


ちなみにMixBoxのパラメータ管理をVST3PluginTestHostでのぞいてみましたが、残念ながらUnit機能は使われていないようでした（Nameカラムの階層構造とUnitIDカラムの数字に注目）。Effect Rackの方はVST2だったので、そもそもユニットの概念がありません。

![mixbox_param_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/db7346ab-f2d0-d355-ff6c-c9edacd57f7d.png)

ちなみに、普通の単一のシンセである[u-he TyrellN6](https://u-he.com/products/tyrelln6/)は、なぜかUnitの階層機能をフル活用していました。VST3の機能をあますところなく使ってやろうという気概がうかがわれます。
![tyrell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/31c7f371-3653-a1f5-2201-a43cbc54469b.png)


# バスとチャンネル

バスはインストゥルメンツ、エフェクターの入出力を示します。バスにはAudio BusとEvent Bus(MIDI的な情報)の2種類があります。[^5]

ステレオ出力がひとつある場合、Output Audio Busが1個、Channelが2個、ステレオ出力が5個あるマルチ音源の場合、Output Audio Busが5個、各バスにChannelが2個という考え方になります。
サイドチェーン対応のコンプレッサーの場合、Input Audio Busが2個、Bus 0は2Channel、サイドチェーン信号のBus 1はモノラルなので1Channelというパターンが多いです。
インストゥルメンツの場合、オーディオではなくイベントを受けるので、Input Event Busが1個となります。

これらを組み合わせると、オーディオとイベントの両方を入力するボコーダーや、MIDIノートで操作するエフェクターなども考えられますね。
![bus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/0d3503de-2c8a-fcb2-6d9f-ee49ba3e9a3f.png)



今回はこんな感じ。[次回](https://qiita.com/aike@github/items/b4983755d8a05898ffb0)はVST3の魔窟であるプログラムリストの闇に迫ります。

[VST3制作の過去記事一覧はこちら](https://qiita.com/aike@github/items/05a14911bb89db8b6c2c)


[^1]: https://steinbergmedia.github.io/vst3_doc/vstinterfaces/index.html#vst3Structure
[^2]: https://steinbergmedia.github.io/vst3_doc/vstinterfaces/index.html#vst3Processing
[^3]: 関係ないけどdBのようなパラメータの「単位」も英語でunitというのでSDKを検索するときに紛らわしいです
[^4]: https://steinbergmedia.github.io/vst3_doc/vstinterfaces/classSteinberg_1_1Vst_1_1IUnitHandler.html
[^5]: https://steinbergmedia.github.io/vst3_doc/vstinterfaces/group__vstBus.html