VST3.6勉強中 4 – VST3のバスについて

VST3のバスについて

前回は最小構成のVST3プラグインを作成しましたが、その中にあったバスの概念について簡単にメモいたします。

VST3のプラグインには「バス」というものがあります。

「バス」とはコンピュータでは”データの流れる道”になります。
VST3のプラグインには「AudioBus」と「EventBus]の2種類のバス(データの流れる道)があります。

  • AudioBus
  • オーディオデータ(音声波形データ)の流れる道。
    オーディオバスには「モノラルのオーディオバス」や「ステレオのオーディオバス」等の構成がある。

  • EventBus
  • イベントデータ(ノートオン、ノートオフメッセージ等)の流れる道。

VST3のプラグインでは入力、出力はすべてバス単位で扱われます。
例として、VST3プラグインでは下記のような入力・出力のバスの組み合わせがあります。(他にも色々なバスの組み合わせはあります。)

  • 例1:モノラルのエフェクター
  • モノラルのオーディオバス入力…1つ
    モノラルのオーディオバス出力…1つ

  • 例2:ステレオのエフェクター
    ステレオのオーディオバス入力…1つ
    ステレオのオーディオバス出力…1つ

  • 例3:サイドチェイン付きステレオエフェクター
  • ステレオのオーディオバス入力…2つ(ひとつがサイドチェイン用)
    ステレオオーディオバス出力…1つ

  • 例4:シンセサイザー
  • イベントバス入力…1つ(ノートオン、ノートオフメッセージの受け取り用)
    ステレオオーディオバス出力…1つ

  • 例5:ボコーダー機能付きシンセサイザー
  • イベントバス入力が1つ(ノートオン、ノートオフメッセージの受け取り用)
    ステレオのオーディオバス入力…1つ(音声入力用)
    ステレオオーディオバス出力…1つ

VST3プラグイン開発時のバス設定

VST3を開発する際は、開発するVST3プラグインに入力と出力のバスがいくつあるかを設定する必要があります。

この設定は、initialize()関数内でaddAudioInput()関数、addAudioOutput()関数、addEventInput()関数、addEventOutput()関数を追加したいバスの分だけ呼び出せば設定が可能です。

※initialize()関数は自作Processorクラス(AudioEffectを継承して作るクラス)のメンバー関数としてオーバーライドして定義します。
参考…自作Processorクラス

それぞれの関数については下記の通りです。

  • addAudioInput()関数、addAudioOutput()関数
  • 概要 VST3プラグインにオーディオ入力バス、オーディオ出力バスを設定する関数。
    戻り値 概要
    AudioBus* 追加したオーディオバスのクラスのポインタ
    引数 変数名 概要
    const TChar* name 追加するオーディオバスの名前。
    \0で終端する。何文字でも可。(おそらく)
    SpeakerArrangement arr 追加するオーディオバスの構成。
     ステレオの場合…SpeakerArr::kStereo
     モノラルの場合…SpeakerArr::kMono
    他の構成(5.1ch…k51 等)もある。
    BusType busType 追加するオーディオバスの種類。引数を省略すると標準でkMainとなる。
     エフェクター入力/出力のような場合…kMain
     サイドチェイン入力のような場合…kAux
    int32 flags 追加するオーディオバスのフラグ。BusInfo::kDefaultActiveのみ指定可能。省略可。
  • addEventInput()関数、addEventOutput()関数
  • 概要 VST3プラグインにイベント入力バス、イベント出力バスを設定する関数
    戻り値 概要
    EventBus* 追加したイベントバスのクラスのポインタ
    引数 変数名 概要
    const TChar* name

    追加するイベントバスの名前。
    \0で終端する。何文字でも可。(おそらく)
    int32 channels 追加するイベントバスで受け取るノートオン、ノートオフイベントのチャンネル数。
    標準で16。省略可。
    BusType busType 追加するイベントバスの種類。引数を省略すると標準でkMainとなる。
    int32 flags 追加するイベントバスのフラグ。BusInfo::kDefaultActiveのみ指定可能。省略可。

オーディオバスの接続

VST3プラグインがホストアプリケーション(Cubase,Sonar等のDAW)に読み込まれたとき、オーディオ入力バスやオーディオ出力バスはホストアプリケーションの用意したバスに接続されます。

このとき、ホストアプリケーションの用意したバスの構成(モノラル・ステレオ等)にVST3プラグインのバス構成が対応しているかどうかを判断しなければなりません。
この判断を行うためにsetBusArrangements()関数がVST3にはあります。

  • setBusArrangements()関数
  • 概要 ホストアプリケーションが用意したオーディオバス構成をVSTプラグインの各バスに設定する関数。
    VST3プラグインが呼び出されたときや、バスの接続が変わった場合に呼び出される。
    戻り値 概要
    tresult 設定が成功したかどうかの結果
     設定に成功した場合…kResultTrue、設定に失敗した場合…kResultFalse
    引数 変数名 概要
    SpeakerArrangement* inputs

    入力バス構成(SpeakerArr::kStereo、SpeakerArr::kMono等)の配列。配列の数はnumInsとなる。
    int32 numIns 設定しようとしている入力バスの数
    SpeakerArrangement* outputs 出力バス構成の配列。配列の数はnumOutsとなる。
    int32 numOuts 設定しようとしている出力バスの数

setBusArrangements()関数が呼び出された場合、通常はnumInsとnumOutsが設定したバスの数と同じかを確認します。
合わせて、inputs[]とoutputs[]に入っているそれぞれのバスの構成が開発したVST3プラグインで対応しているかどうかを確認します。
参考…自作Processorクラス

前回作成したVST3プラグインでは、オーディオ入力/出力バスは1つで、共にステレオのみの対応でしたので下記のようにしております。

addAudioInput()関数、addAudioOutput()関数で追加したバスの構成と必ずしも一致する必要はありませんが、複数のバス構成に対応するとなるとprocess()関数でバス構成に応じて処理を変更する必要があります。

例えば、モノラルも対応させたい場合はif分の条件の中を”(inputs[0] == SpeakerArr::kStereo || inputs[0] == SpeakerArr::kMono)”のようにし、process()関数も合わせて変更すればOKです。(process()関数の説明は省略します。)

なお、ホストアプリケーションで一つのバス接続が変わった場合でも、全部のバス構成の再設定が行われます。

最後に

バスについては上記のような内容でいいと思っています。ご指摘があればうれしいです。

次回は、パラメーターの追加について記載できればと思います。


コメントを残す