VST3.6開発07 – VST3プラグインのパラメーター実装方法3

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

前回はいろいろな値を表示すると文字列リストのパラメーターを実装しました。

しかし、「デジタルフィルタのカットオフ周波数」ようなパラメーターでは、パラメーターの値が大きくなるにつれて効き目が変わってくるものもあります。
例えば、デジタルフィルタのカットオフ周波数の場合、同じ1,000Hz分をカットオフ周波数を操作するにしても500Hz~1,500Hzと15,000Hz~16,000Hzではフィルタの影響が大きく異なります。(15,000Hz~16,000Hzはほとんど変化がないように感じます。)

20171103

このようなの場合、どの位置を動かしても同じような影響がでるパラメーターを実装したほうが使いやすくなります。
これはパラメーターの操作に対して指数的(非線形)に値が増加するパラメーターを実装すれば実現できます。

今回は「パラメーターの操作に対して、値が指数的(非線形)に値が増加するパラメーター」を実装する方法について記載したいと思います。

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

  • ローパスフィルタをかける機能を持つエフェクター
  • パラメーターは2つ
    • 周波数(50.0~22000.0Hzの範囲のパラメーター)
    • Q値(0.5~10.0の範囲のパラメーター)
  • 入力バス、出力バスは1つで、共にステレオ(2ch)

VSTのイメージ
20171103

今回の内容は前回前々回の説明を参考にしています。パラメーターの追加方法などについては、前回の説明前々回の説明をご参照ください。
なお、「バス」についての概念はこちらに記載したとおりです。

今回作成したVST3のソースファイルはこちらになります。 → 20171103_vst3
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法

指数的な変化をするパラメーター

指数的な変化をするパラメーターを実装するためには、Parameterクラスを継承し自作のパラメータークラスを作成します。

Parameterクラスを継承して自作のパラメーターを使用するには、下記手順を行います。

  1. Parameterクラスをpublicで継承
  2. コンストラクタで継承元クラスの初期化と自作パラメータクラスの初期化を行う
  3. toString()関数、fromString()関数、toPlain()関数、toNormalized()関数をオーバライドし、それぞれの関数に応じた処理を行う
    (各関数の詳細は後述)

今回の自作パラメータクラスはMyParameterとします。MyParameterは下記のようにして定義しています。

【myparameter.h】

コンストラクタや各メンバー関数の引数などは下記のとおりとなります。

  • MyParameterコンストラクタ
  • 概要 MyParameterのコンストラクタ。メンバー変数や継承元クラスの初期化などを行う
    (引数についてはRangeParameterを参考に作成している。)
    戻り値 概要
    戻り値はありません(コンストラクタのため)
    引数 変数名 概要
    TChar* title パラメーターの名前。
    int32 tag パラメーターのタグ。重要。他のパラメーターのタグと重複しないほうがよい。
    TChar* units パラメーターの単位(dB、sec など)。省略可。省略した場合 NULL になる。(単位が表示されない)
    minPlain ParamValue 表示値の最小値。省略可。省略した場合 0.0 とする。(ParamValueはfloatの再定義)
    maxPlain ParamValue 表示値の最大値。省略可。省略した場合 1.0 とする。
    defaultValuePlain ParamValue 表示値の初期値。省略可。省略した場合 0.0 とする。
    int32 flags パラメーターのフラグ。省略可。
    省略した場合 ParameterInfo::kCanAutomateになる。基本的に省略でいいはず。
    UnitID unitID 詳細不明。省略可。省略した場合 kRootUnitId になる。基本的に省略でいいはず。
  • toString()関数
  • 概要 正規化された値(0.0~1.0の値)を表示値(50~22050など)の文字列に変換する関数
    継承元のParameterクラスからオーバーライドした関数
    戻り値 概要
    戻り値はありません
    引数 変数名 概要
    ParamValue valueNormalized 変換したい正規化値
    String128 string 変換後の文字列を格納する文字列バッファ
    (String128は長さ128の2Byte文字配列。__wchar_t[128]と同じ。)
  • fromString()関数
  • 概要 表示値(50~22050など)の文字列を正規化された値(0.0~1.0の値)に変換する関数
    継承元のParameterクラスからオーバーライドした関数
    戻り値 概要
    bool 正常に変換出来た場合はtrue。失敗した場合はfalse。
    引数 変数名 概要
    const TChar* string 変換したい文字列
    ParamValue& valueNormalized 変換後の正規化値を入れるためのポインタ
  • toPlain()関数
  • 概要 正規化された値(0.0f~1.0fの値)から表示値(50~22050など)にする関数
    継承元のParameterクラスからオーバーライドした関数
    戻り値 概要
    ParamValue 表示値を返す
    引数 変数名 概要
    ParamValue valueNormalized 変換したい正規化値
  • toNormalized()関数
  • 概要 正規化された値(0.0f~1.0fの値)から表示値(50~22050など)にする関数
    継承元のParameterクラスからオーバーライドした関数
    戻り値 概要
    ParamValue 正規化値を返す
    引数 変数名

    概要
    ParamValue plainValue

    変換したい表示値

指数的な変化をするパラメーターの実装

MyParameterの実装はは下記のようにしています。

【myparameter.cpp】

指数的な変化をするパラメーターの利用

次に自作したMyParameterパラメータを実際に利用します。

利用方法は前回のRangeParameterやStringListParameterと同様にnewで作成したあと、MyParameterクラスのポインタaddParameter()関数に渡します。

  1. 自作クラスのヘッダファイルmyparameter.hをインクルード
  2. newでMyParameterクラスのインスタンスを生成
  3. パラメーター操作クラスにparameters.addParameter()関数で追加

【controller.cpp】

パラメーターのタグ(PARAM_FILTERFREQ_TAGとPARAM_FILTERQ_TAG)は事前に定義しております。

また、今回もsetPrecision()関数で小数第何位まで表示するかを指定しています。(前回参照)
setPrecision()関数の呼び出し自体を省略しても問題ありません。(省略時は小数第4位まで表示されます。)

音声処理クラスでのパラメーター値の受け取り

次は追加したパラメーターの値を音声処理クラスのprocess関数内で受け取る部分です。

前回説明の通り、渡されるパラメーター値は必ず正規化された値(0.0~1.0)になります。

受け取ったパラメーター値は使用しやすい値に再変換して各メンバー変数に格納しています。
また、今回はデジタルフィルターを使うため、メンバー変数freqとqをセットで利用する必要があります。
各メンバー変数へ格納後、Filterクラスの再計算を実施しています。(processor.cppの44~46行目)

赤く強調された部分が今回変更した部分になります。
【processor.h】

【processor.cpp】

音声処理クラスでの音声信号の処理

パラメーター値を受け取り、再変換した後は音声信号を処理します。

今回は単純に入力にフィルタをかけて出力しております。

赤く強調された部分が今回変更した部分になります。

最後に

以上で指数的に値が増加するパラメーターを追加することができます。
今回はデジタルフィルタのカットオフ周波数を例としましたが、シンセサイザーのエンベロープジェネレータなどで利用することがあると思います。

なお、前々回から今回までで作成したVSTは終了してしまうとパラメータがデフォルト値に戻ってしまいます。
次回は作成したパラメータを保存する方法について記載したいと思います。

今回作成したVST3のソースファイルはこちらになります。 → 20171103_vst3
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法

VST3.6プラグインの作りの情報はこちらにもございます → はじめてのVST3.6プラグインの作り

ご指摘やご質問などがございましたら、コメント欄か掲示板Twitterでご連絡いただければと思います。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp


コメントを残す