前回の記事で、AudioProcessorValueTreeStateで管理したパラメータをデシベル単位にしてスライダーに紐づけました。課題として、スライダーを動作させたときに中央値を-10dBなどにして、最小値を-100dB、最大値を0dBといように変化具合をゆがめる(skew)する設定がsetSkewFactorFromMidPoint関数で反映されないという現象がみられました。
この点を今回改善できましたので、備忘録的に記事といたします。
こんな人の役に立つかも
・JUCEプラグインを作成している人
・AudioProcessorValueTreeStateでプラグインパラメータ管理をしたい人
・AudioProcessorValueTreeStateパラメータと連動したスライダーのskew設定をしたい人
解決方法
PluginEditor.cppのGainPluginAudioProcessorEditorクラスのコンストラクタのgainSliderの設定部分を抜粋します。
//...略...
//[1]ここでAudioProcessorValueTreeStateの「gain」をgainSliderに紐づけます。
gainAttachment.reset(new SliderAttachment(valueTreeState, "gain", gainSlider));
gainSlider.setRange(-100.0, 0.0);//[2]ここでもsliderに範囲を設定します。
gainSlider.setSkewFactorFromMidPoint(-10.0);//[3]skewの設定を行います。
gainSlider.setValue(-10.0f);//[4]便宜的にここでも初期化しました。
シンプルにsliderコンポーネント自体の範囲設定を「setRange」でおこなってから「setSkewFactorFromMidPoint」関数で設定します。
[1]では、AudioProcessorValueTreeStateのパラメータ「gain」に紐づけられ、上限、下限、初期値が設定されます。
[2]範囲設定が重複してしまいますが、setRangeをしないとsetSkew…が効かなかったので、ここでもパラメータで設定した範囲を改めて範囲設定します。
[3]ここでskewを設定します。setSkewFactorFromMidPoint関数は引数の値をスライダーの中央値に設定して変化具合をゆがめるような処理が反映されます。
[4]は、中央値を確認するために、再度初期値をスライダーコンポーネントに設定しました。テスト用です。ここがないと、AudioProcessorValueTreeStateのgainパラメータに設定した初期値が反映されます。(さらに、XMLへのパラメータ保存関数、PluginProcessor.cppのsetStateInformationを以前作成した通りに定義されていると、前回のパラメータが保存されてよみだされ、初期値は読みだした値になります。)
変更によって生じた問題と回避策
PluginEditor側でスライダーコンポーネントの範囲をsetRange関数で設定すると、パラメータの上限下限値を二重に定数で指定していることになります。スライダーの上限、下限はすでに定められているパラメータgainから取得しないと、変更点も増えたり管理上面倒になります。
そこで次のように変更を行いました。
※AudioProcessorValueTreeStateという文字が長いのでAPVTSと省略しました。
//...略...
gainAttachment.reset(new SliderAttachment(valueTreeState, "gain", gainSlider));
//[1]APVTSのパラメータgainの最大、最小値を取得します。
auto gain_range = valueTreeState.getParameter("gain")->getNormalisableRange();
auto gain_min = gain_range.start;
auto gain_max = gain_range.end;
DBG("gainParameter MIN:" << gain_min);
DBG("gainParameter MAX:" << gain_max);
//[2]skewのための設定です。
gainSlider.setRange(gain_min, gain_max);//変数で上限下限を指定します。
gainSlider.setSkewFactorFromMidPoint(-10.0);
gainSlider.setValue(-10.0f);
[1]では、APVTSのパラメータ「gain」の最大値、最小値をNormalisableRangeクラスのオブジェクトとして取得します。APVTSクラスのvalueTreeStateを初期化していますので、ここから「getParameter」関数に「gain」を指定することで、gainパラメータをRangedAudioParameterクラスのオブジェクトとして取得できます。さらに、ここからgetNormalisableRange関数でパラメータの範囲をNormalisableRangeクラスのオブジェクトとして取得することができます。
NormalisableRangeのオブジェクトとして取得できれば、あとはメンバ変数である「start」と「end」にそれぞれ最小値と最大値が格納されていますので、ここからパラメータの上限、下限値を取得してきます。
こうすることで、パラメータの上限、下限値をAPVTSの初期化時に一回だけ定数で指定すればよいことになります。
[2]の「setRange」関数の引数に、先ほど取得した下限、上限の変数を与えて完了です。