JUCEプラグイン開発、シンプルなハイパスフィルタープラグインにQパラメータを追加

パラメータの追加、意外と色々と追加する点があるので、またメモしていきます。

今回はフィルターのQのパラメータだね〜

ハイパスフィルターのプラグインの改良を引き続きやっています。今回は、パラメータとしてQを追加しましたので、追加したプログラムをまとめていきたいと思います。

前回までのフィルタープラグイン作成に続けての記事となります。

デジタルフィルタの基礎とパラメータついて調査

・ミニマムでシンプルなフィルタープラグインを実装

・AudioProcessorValueTreeStateの設定手順

・ミニマムでシンプルなフィルタープラグイン、カットオフ周波数可変の処理

Qパラメータをハイパスフィルターに追加すると、カットオフ周波数の部分が盛り上がり、シンセのレゾナンスみたいな効果になります。

目次

こんな人の役にたつかも

・JUCEでフィルタープラグインを作成したい人

・JUCEでフィルターのQパラメータを追加したい人

・JUCEのAudioProcessorValueTreeStateパラメータを追加したい人

PluginProcessor(プロセッサ側)

PlugionProcessor.h

FilterProcessorクラス

FilterProcessorクラスのprivateなメンバ変数として、「QParam_filter」を追加しました。プラグイン本体のプロセッサから呼び出す際に、Qパラメータのポインタを受け取ります。

//FiterProcessorクラスのprivateなメンバ変数です。
private:
    std::atomic<float>* cutoffParam_filter = nullptr;
    float samplerate;
    //追加しました。
    std::atomic<float>* QParam_filter = nullptr;
    
//...略...

次に、フィルターのprocessBlockで、Qのパラメータをフィルタの処理に追加します。「*QParam_filter」でfloatのQ値を取得できますので、これを一度qParam_val変数に格納します。そして、makeHighPass関数の第三引数として与えることで、ハイパスフィルターのQ値を設定することができます。

    void processBlock(juce::AudioSampleBuffer& buffer, juce::MidiBuffer&) override
    {
        float cutoff_val = *cutoffParam_filter;
        //追加・変更しました。
        float qParam_val = *QParam_filter;
        *filter.state = *juce::dsp::IIR::Coefficients<float>::makeHighPass(samplerate, cutoff_val, qParam_val);
        
        juce::dsp::AudioBlock<float> block(buffer);
        juce::dsp::ProcessContextReplacing<float> context(block);
        filter.process(context);
    }

次に、setQParam関数をpublicな関数として実装しました。プラグイン本体のAudioProcessorから、パラメータのポインタを受け取る関数です。この関数を本体のAudioProcessorのコンストラクタで呼び出すことで、AudioProcessorValurTreeStateのQパラメータと紐付けします。

     void setQParam(std::atomic<float>* param) {
        QParam_filter = param;
    }

プラグイン本体●●AudioProcessorクラス

プラグイン本体のAudioProcessorクラス(私の作成したプラグイン名のクラスはFilter_plugin01AudioProcessorです。)のprivateなメンバ変数にQのパラメータを管理する「QParam」を追加しました。AudioProcessorValueTreeStateで追加するパラメータです。

private:
    FilterProcessor MyFilter;
    
    juce::AudioProcessorValueTreeState parameters;
    std::atomic<float>* cutoffParam = nullptr;
    //追加しました。
    std::atomic<float>* QParam = nullptr;
    
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Filter_plugin01AudioProcessor)
};

PluginProcessor.cpp

●●AudioProcessorクラスのコンストラクタに、AudioProcessorValueTreeStateのパラメータ初期化を設定します。

[1]のようにAudioProcessorValueTreeStateにパラメータを準備して、[2]のように、先ほど準備したポインタに紐付けします。

Filter_plugin01AudioProcessor::Filter_plugin01AudioProcessor()
//...略...
        ,parameters(*this, nullptr, juce::Identifier("APVTSTutorial"),
        {
            std::make_unique<juce::AudioParameterFloat>("cutoff",  // ID
                                                        "Cutoff",  // name
                                                        //20210508
                                                         20.0f,     // min
                                                         22000.0f, // max
                                                         20.0f)// default
            //[1]以下のQパラメータを追加しました。
            ,
            std::make_unique<juce::AudioParameterFloat>("qParam",  // ID
                                                        "QParam",  // name
                                                        0.01f,     // min
                                                        4.0f, // max
                                                        0.70710678f)
        })
{
    cutoffParam = parameters.getRawParameterValue("cutoff");
    MyFilter.setCutoffParam(cutoffParam);
    //[2]APVTSのQパラメータをQParamに紐付けます。
    QParam = parameters.getRawParameterValue("qParam");
    //[3]先ほどヘッダに設定したsetQParam関数でフィルタークラスにパラメータを紐付けます。
    MyFilter.setQParam(QParam);
}

[3]では、ヘッダで作成したsetQParam関数でフィルタークラスのオブジェクトMyFilterへもQパラメータを紐付けします。

Qの初期値は、うつぼかずらさんのサイトを参考に、「1/√2」(0.70710678f)としました。

PluginEditor(GUI側)

PluginEditor.h

QパラメータのGUI、スライダーコンポーネントをprivateなメンバに定義しました。また、AudioProcessorValueTreeStateのパラメータと紐付けするためのQParamArrachmentを準備します。

private:

//...略...    
    //追加しました。
    juce::Slider QParamSlider;
    std::unique_ptr<SliderAttachment> QParamAttachment;
    
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Filter_plugin01AudioProcessorEditor)
};

PluginEditor.cpp

コンストラクタ

エディタのコンストラクタで、先ほど準備したスライダーにQAudioProcessorValueTreeのqParamを紐付けます。(その前に、スライダーの可視化も行なっています)

Filter_plugin01AudioProcessorEditor::Filter_plugin01AudioProcessorEditor (Filter_plugin01AudioProcessor& p, juce::AudioProcessorValueTreeState& vts)
    : AudioProcessorEditor (&p), valueTreeState(vts)//audioProcessor (p)
{
 //...略...
    //スライダーコンポーネントとAPVTSのパラメータを紐付けします。
    addAndMakeVisible(QParamSlider);
    QParamAttachment.reset(new SliderAttachment(valueTreeState, "qParam", QParamSlider));
    setSize (400, 300);
}

最後に、resized関数にQパラメータのスライダーを配置します。

void Filter_plugin01AudioProcessorEditor::resized()
{
    cutoffSlider.setBounds(10, 10, 200, 30);
    //Qパラメータのスライダーを配置します。
    QParamSlider.setBounds(10, 50, 200, 30);
}

意外と最後のGUIへの配置を忘れることが多いんですよね〜

よかったらシェアしてね!
目次
閉じる