フィルターカーブをslopeパラメータに対応させました。
フィルターカーブの描画はこれで完了だね~
シンプルなハイパスフィルターのslopeパラメータは、フィルターのカーブの減衰を急にします。この急になるslopeのパラメータでフィルターカーブが反映されるように変更しました。
それぞれのスロープ状態(-6db/oct、-12db/oct、-18db/oct)をスクショして、透過させて重ね合わせました。
今回も、シンプルなハイパスフィルターのカスタマイズとなります。シンプルなハイパスフィルターの記事につきましては、こちらもご参照ください。
こんな人の役に立つかも
・JUCEのgetMagnitudeForFrequencyを利用したい人
・JUCEのDSPモジュールでフィルターカーブを作成したい人
・本ブログでシンプルなハイパスフィルターを作成している人
実装
PluginEditor.cppのpaint関数内、フィルターカーブの描画処理の部分を変更していきます。
//[1]エディタ側からslopeパラメータへアクセスして値を取得します。
//DBG("slope:" << valueTreeState.getParameter("slope")->getValue());
auto slope_Param = valueTreeState.getParameter("slope")->getValue();
for (int i = 0; i < diaplayWidth; i++) {
//[2]3個のハイパスフィルターのmagnitudeをそれぞれ取得するように変更しました。
auto filter1_magnitude = audioProcessor.getMyFilter().getFilterCoef().getMagnitudeForFrequency(skewedVector[i], currentSampleRate);
auto filter2_magnitude = audioProcessor.getMyFilter2().getFilterCoef().getMagnitudeForFrequency(skewedVector[i], currentSampleRate);
auto filter3_magnitude = audioProcessor.getMyFilter3().getFilterCoef().getMagnitudeForFrequency(skewedVector[i], currentSampleRate);
//[3]スロープの選択状態で条件判断しています。
if (slope_Param == 0.5f)
currentMagnitude = filter1_magnitude * filter2_magnitude;
else if (slope_Param == 1.0f)
currentMagnitude = filter1_magnitude * filter2_magnitude * filter3_magnitude;
else
currentMagnitude = filter1_magnitude;
g.drawLine( i + displayMargin //start X
, (preMagnitude * displayHeight)/ maxGain * -1 + displayHeight //start Y
, i + displayMargin + 1 //end X
, (currentMagnitude * displayHeight)/ maxGain * -1 + displayHeight //end Y
, 1.0f); // Line thickness
preMagnitude = currentMagnitude;
}
[1]で、APVTSのvalueTreeStateオブジェクトから、slopeパラメータの値を取得しています。エディタ側からパラメータにアクセスするためにgetValue関数で取得していますが、なぜか、コンボボックスの値が、0、0.5、1と変更されるようです。もちろん、プロセッサ側でDBGしてみたのですが、こちらはしっかり整数(AudioParameterInt)で1、2、3となっていました。
とりあえず値を取得できたので、今回は、値に準じて条件判定をするようにします。
[2]では、プロセッサ側で作成しているハイパスフィルターのインスタンス、MyFilter1からMyFilter3のフィルターカーブをgetMagnitudeForFrequencyで取得しています。
この3つのハイパスフィルターは、与えている引数(カットオフ周波数、Q値)がすべて同じなので、実際のところ、getMagnitudeForFrequency関数で得られる数値は、全部同じになります。Q値をそれぞれ違うように動作させたり、音声処理の部分で工夫を追加して、各々のフィルターに個性を与えたときは、違う値が返ってきます。そのため、あえて分離して取得するようにしました。
[3]では、3つのフィルターから得られた値をスロープパラメータの設定に応じて計算を行い、currentMagnitude変数を計算しています。
フィルタを2個通したときの20Hzのゲインのイメージです。
こんなイメージで、それぞれのフィルタの値を乗算しました。
シンプルなハイパスフィルターの所感
JUCEチュートリアルを一通り行ってから、初めてオリジナルの仕様のプラグインを作成してみました。
プラグインを作成してみることで、プラグインメーカーの技術力の高さや、工夫していることなどが少しわかってきたような感じがします。
フーリエ変換やフィルターなどは、高度な数学的な知識などが必要で、一通り勉強するにしても、高度な専門性がないとなかなか難しいと思います。JUCEでは、この点、DSPモジュールを利用することで、高度な数学的な実装を任せてしまうことができ、与えるパラメータと得られる出力を理解できれば使えるようになっていましたので、もう少しアプリケーションレベルでの制作に専念できるなとかんじました。
また、JUCEには、便利な関数群が存在しています。その使い方の情報がもっと容易に手に入るように、本ブログでも精進していきたいと思います。
githubにて、ファイルの全体をアップロードしましたので、ご利用ください。「source」階層のプログラムが作り上げてきたコードになります。
https://github.com/perfectpanda-works/simple_highpass_filter.git