VST3プラグイン開発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プラグインのサンプルソースファイルはこちらからダウンロードできます→vst3dev_20210403
ZIPファイルの中の「vst3dev04_パラメーター実装方法3」フォルダが今回のサンプルソースファイルになります。

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

また、今回ローパスフィルタをかけるにあたって、自作のフィルタクラス(CMyFilter)を使用しています。
フィルタクラスについては「簡単なデジタルフィルタの実装」と「簡単なデジタルフィルタのサンプルコード」にて説明しております。

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

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

Parameterクラスを継承して自作のパラメーターを使用するには、下記手順を行います。
表示値と正規化値の意味については前回の表示値と正規化値をご参照ください。

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

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

【myparameter.h】

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

  • MyParameterコンストラクタ
  • 概要 MyParameterのコンストラクタ。メンバー変数や継承元クラスの初期化などを行う
    (引数についてはRangeParameterを参考に作成している。)
    戻り値 概要
    戻り値はありません(コンストラクタのため)
    引数 変数名 概要
    TChar* title パラメーターの名前。
    (TCharはwchar_tの再定義。文字コードはUTF-16で設定する)
    int32 tag パラメーターのタグ。重要。他のパラメーターのタグと重複しないほうがよい。
    TChar* units パラメーターの単位(dB、sec など)。省略可。省略した場合 NULL になる。(単位が表示されない)
    (TCharはwchar_tの再定義。文字コードはUTF-16で設定する)
    minPlain ParamValue 表示値の最小値。省略可。省略した場合 0.0 とする。(ParamValueはdoubleの再定義)
    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]と同じ。文字コードはUTF-16で設定する)
  • fromString()関数
  • 概要 表示値(50~22050など)の文字列を正規化された値(0.0~1.0の値)に変換する関数
    継承元のParameterクラスからオーバーライドした関数
    戻り値 概要
    bool 正常に変換出来た場合はtrue。失敗した場合はfalse。
    引数 変数名 概要
    const TChar* string 変換したい文字列
    (TCharはwchar_tの再定義。文字コードはUTF-16で設定する)
    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】

ローパスフィルタをかけるフィルタクラス(CMyFilter)は「簡単なデジタルフィルタの実装」と「簡単なデジタルフィルタのサンプルコード」にて説明しておりますので詳細は割愛いたします。

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

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

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

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

最後に

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

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

 次回→パラメーターの保存方法

このVST3プラグインのサンプルソースファイルはこちらからダウンロードできます → vst3dev_20210403.zip
コンパイル・ビルドの方法は簡単にこちらでご説明しております。ご参考までに。→サンプルソースファイルのビルド方法

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

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

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


コメントを残す