JUCEプログラミング、フィルターのQを追加する

1_プログラミング

カスケードプラグインのフィルターモジュールをいじっています。

フィルタのDSPモジュールは、Q値が変更できるみたいだね。

前回、フィルターのカットオフ周波数をパラメータで変更できるようにしました。DSPモジュールのドキュメントを見ていたら、カットオフ周波数以外に、Q値を与えることで、フィルターのQ設定ができましたので、これもパラメータ化したら面白いのではないかと思い、フィルタークラスをいじってみました。

Q値を高くすると、レゾナンスの効果もえられてなんとなく満足感が高いです。笑

レゾナンスやカットオフ周波数については、こちらのサイトが面白くわかりやすいです。

こんな人の役に立つかも

・JUCEフレームワークに入門したい人

・VST、AUプラグイン開発の最初の一歩を踏み出したい人

・JUCEのチュートリアルをやっている人

スポンサーリンク

Q値の追加

パラメータ追加の流れとしては、ほとんど前回のカットオフ周波数と同じです。

「PluginProcessor.h」のprivateなメンバ変数として以下の「paramQ」を追加しました。

    //add
    juce::AudioParameterFloat* testparam;
    //↓今回はこのパラメータを追加しました。
    juce::AudioParameterFloat* paramQ;

「PluginProcessor.cpp」のコンストラクタに以下のようにメンバイニシャライザを追加して、addParameterしました。

paramQに与える値としては、少し大きめの20を最大値としました。20くらいあると、レゾナンスの効果が顕著にわかったので、このくらいにしています。

testparam(new juce::AudioParameterFloat("test", "testParam", 0.0f, 22000.0f, 1000.0f)),//←前回追加したものです。
    paramQ(new juce::AudioParameterFloat("Q", "paramQ", 0.0f,20.0f, 1.0f))//Q値を初期化します。
{
    addParameter(muteInput);

//...略...

    addParameter(testparam);
    //↓今回、以下のパラメータを追加します。
    addParameter(paramQ);
}

「PluginProcessor.h」のFilterProcessorクラスを次のように変更しました。

class FilterProcessor : public ProcessorBase
{
public:
    FilterProcessor(juce::AudioParameterFloat* f, juce::AudioParameterFloat* q) 
//[2]コンストラクタに引数を追加しました。
    {
        freq = f;
        Q = q;
//[3]引数をメンバ変数Qに代入します。
    }//changed

    void prepareToPlay(double sampleRate, int samplesPerBlock) override
    {
        //[4]フィルターを設定します。
        *filter.state = *juce::dsp::IIR::Coefficients<float>::makeLowPass(sampleRate, *freq, *Q);

        juce::dsp::ProcessSpec spec{ sampleRate, static_cast<juce::uint32> (samplesPerBlock), 2 };
        filter.prepare(spec);
    }

//...略...

private:
    juce::dsp::ProcessorDuplicator<juce::dsp::IIR::Filter<float>, juce::dsp::IIR::Coefficients<float>> filter;

    juce::AudioParameterFloat* freq;//前回追加したパラメータです。
    juce::AudioParameterFloat* Q;//[1]Qというメンバ変数を追加しました。
};

[1](一番下)では、パラメータを受け取るメンバ変数「Q」を定義しています。

[2]で、コンストラクタにQの値を受け取るための引数を追加しています。

[3]では受け取ったパラメータをメンバ変数のQに代入しています。

[4]で、さりげなく、ローパスフィルターに変更しました。以前までハイパスでしたので、気分を変えて・・・ちなみに、引数の3つ目にQ値を渡すことができます。

updateGraph関数

最後に、忘れずにupdateGraph関数でのフィルターオブジェクト生成時に引数を渡すように設定します。

slots.set(i, mainProcessor->addNode(std::make_unique<FilterProcessor>(testparam, paramQ)));

動作検証

Q値を上げてレゾナンス効果を得てみました。

DAWなどで、周波数が可視化できるEQを後にいれると視覚的に確認出来ていいですね。

ちなみに、私は、BitwigStudioというDAWを以前オーディオインターフェイスを購入したときにもらっていることを思い出し、Reaperから検証用DAWを乗り換えました。

実際に動くと面白いですね~

音を確認できると面白いね

タイトルとURLをコピーしました