VST3.6勉強中 5 – VST3プラグインのパラメーター実装方法1

VST3プラグインのパラメーター実装方法1

前々回は最小構成のVST3のプラグインを作成いたしました。
今回は前々回のVST3プラグインにパラメーターを追加します。

今回作成するプラグインは下記のとおりです。

  • パラメーターは1つ(ボリュームコントロール)
  • 入力のボリュームをパラメーターにより調整して出力する
  • 入力バス、出力バスは1つで、共にステレオ(2ch)

「バス」についての概念は前回記載したとおりです。

パラメーター操作クラスの作成

まずはパラメーター操作を行うクラスを作成します。

パラメーター操作クラスはEditControllerクラスを継承して下記のように宣言します。
(VST3の開発では名前空間を指定する必要がありますので忘れないようご注意ください。)

【controller.h】

【controller.cpp】

initialize()関数は名前のとおり、クラスの初期化を行う関数です。
継承元のinitialize()関数を呼び出した後、継承元のプライベート変数parametersクラスのaddParameter()関数を呼び出し、パラメーターを追加しています。
addParameter()関数は下記のとおりです。

  • addParameter()関数
  • 概要 パラメーター操作クラスにパラメーターを追加する関数
    パラメーターの値は必ず0.0~1.0の間でなければならない。
    戻り値 概要
    Parameter* 追加したパラメーターのポインタ
    引数 変数名

    概要
    TChar* title

    パラメーターの名前。
    TChar* units

    パラメーターの単位(dB、sec 等)。省略可。
    int32 stepCount

    何段階のパラメーターか?
    例:
     3を指定した場合…0.0、0.5、1.0の3段階
     5を指定した場合…0.0、0.25、0.5、0.75、1.0の5段階
    0を指定すると0.0~1.0を滑らかに動く。
    省略した場合 0 になる。
    ParamValue defaultValueNormalized

    標準のパラメーターの値。0.0~1.0で指定する。省略可。
    (ParamValueはfloatの再定義)
    int32 flags

    パラメーターのフラグ。省略可。
    基本的にParameterInfo::kCanAutomateでいいはず。
    int32 tag

    パラメーターのタグ。重要。省略した場合 1 になる。
    UnitID unitID

    詳細不明。省略可。基本的にkRootUnitIdでいいはず

パラメーターのタグ(第6引数int32 tag)はパラメーター操作クラスと音声処理クラスの間でパラメーター情報をやり取りするために必要となってきます。

今回はパラメーター操作クラスと音声処理クラスのソースファイルから読み込めるよう、ヘッダファイルを分けで下記のように定義しています。

【myvst3define.h】

ホストアプリケーション(Cubase,Sonar等のDAW)はまず、パラメーター操作クラスを呼び出し、パラメーターの数やID情報などを取得します。
その後、標準のGUI画面を作成します。(下図のような画面。ひとつのパラメーターにひとつのスライダーが割り当たる。)

20141208

標準GUI画面のパラメーター(スライダー)が操作されると、変更したパラメーターのIDと値(スライダーの位置)を取得し、音声処理クラスにその情報を渡します。

音声処理クラスでのパラメーターの処理

パラメーターの操作情報を受け取り、処理する機能を音声処理クラスに追加します。
追加する処理はprocess()関数内に下記(51~90行目)のように記載します。

【processor.cpp 追加分】

パラメーターは処理するサンプル(numSamples)内で複数設定されていることがあります。
処理するサンプルの長さは一般的に2~5ミリ秒程度(numSamplesは100~200程度の値。サンプリングレートを44100Hzで換算)になりますので、上記の処理では細かくパラメーターを変更せず、最後に変更された値のみを反映する形をとっています。
(厳密に処理することもできますが、労力の割にわからない程度の誤差ですので上記のようにしています。)

FUIDの追加

パラメーター操作クラスにもFUID(GUID)を定義する必要があります。前々回に作成したmyvst3fuid.hにFUIDクラスを追加します。

【myvst3fuid.h 追加分】

音声処理クラスとパラメーター操作クラスの関連付け

FUIDを追加したら、音声処理クラスとパラメーター操作クラスの関連付けを行います。
音声処理クラスにコンストラクタを定義し、下記のようにsetControllerClass()関数を呼び出します。

【processor.cpp 追加分】

生成関数の追加

最後にパラメーター操作クラスを呼び出すための関数を追加します。
前々回同様マクロを使って下記のように定義・作成します。(BEGIN_FACTORY_DEFとEND_FACTORYの間に追記します。)
なお、事前にcontroller.hをインクルードする必要があります。
【factory.cpp】

最後に

以上でパラメーター操作可能なVST3プラグインを作成することができます。

なお、今回の方法で作成したパラメーターは0.0~1.0の範囲の値しか表示できません。

ディレイエフェクターの遅延時間のように、0.0~1.0に収まらない(例えば1.0~4.0秒等)パラメーターや、シンセサイザーのフィルタータイプのように「Lowpass」「Highpass」等の文字列一覧を表示したいパラメーターもあります。

次回は、そういったパラメータの表示方法について記載したいと思います。

今回作成したVST3のソースファイルはこちらになります。→20141209_vst3


6 thoughts on “VST3.6勉強中 5 – VST3プラグインのパラメーター実装方法1

  1. いつも更新お疲れ様です。
    ブログ楽しく読ませていただいています。
    最近、管理人様とともにVST3.6の勉強を始めさせていただきました。
    近々VST2.4のSDKの配布が中止になるという話も小耳に挟んだため、そろそろ以降時期なのかなと感じたのもあります。

    最新記事を参考にVST3.6のビルドを試してみたのですが、どうにもprocess関数内でのポインタ周りや変数でエラーが出てしまいます。
    もしよろしければ、参考にさせていただきたいので全体のソースコードを前wikiのようにあげていただけないでしょうか?
    厚かましい要望をしてしまい恐縮なのですが、お時間がありましたらよろしくお願いいたします。
    これからもブログ更新楽しみにしています。

    • コメントありがとうございます。

      実はVST3の中に書かれているコードは動作確認していないものもあります…

      いずれ動作確認の上、ソースコードのアップロードや整理する予定でしたが、早めに行うようにします。
      今は平日は少し忙しく、更新の余裕がないので、土日ぐらいになると思います。

      最後に、エラーの発生したコードや使用したDAWや環境等も可能な限り教えていただけると幸いです。
      日本にはほとんど情報がなく、私もぜひ参考にさせていただければと思います。

      • 返信ありがとうございます。
        私の環境だとエラーが発生したコードはprocessor.cppとcontroller.hでした。
        どうやらパラメータを保管する変数がヘッダファイル側で定義されていなかったり、ヘッダを二度読みしていたことなどが原因でした。
        私自身もいろいろいじってしまっていたのでそれも原因かもしれません。
        無事ビルドは完了しました。
        DAWは使わずに公式から配布されているテストアプリを使って動作確認をしたのですが
        現在はパラメータの変更に伴ってエフェクトがかからないといった状態です。
        また、いろいろ試してみようと思います。

        また、重ねて質問になってしまい申し訳ないのですが
        以前使用していたVSTHostアプリケーションのバージョンアップの関係で、VisualStudio側からプロセスアタッチを使ったVSTSDK2.4プラグインのデバッグができなくなってしまい困っています。
        もしよろしければ管理人様が使っているVSTホストアプリケーション、デバッグ環境を教えていただけると幸いです。

        • 解決してよかったです。
          とりあえずソースコードは早めにアップロードするようにします。

          私の使っているVST3ホストアプリケーションはVST 3.6 SDKに同梱されているVST3PluginTestHostとVSTHostです。
          実はデバッグはやったことがありません…

          • ソースコードをアップロードいたしました。参考にしていただければと思います。

コメントを残す