【JUCEプラグイン開発】ディレイプラグイン、トグルボタンのAPVTSパラメータ化を行う

パンダさん

DAWでプラグインの検証などを行いました。トグルボタンの状態が初期化されてしまいます。

コパンダ

一つ、不具合を見つけたんだね~、改善していこ~

プラグインとして検証をしたときに気づいたのですが、SYNCのトグルボタンで、DAW上のプラグインのGUIを閉じて再度表示されると、初期化(チェックが入っていない状態)されてしまう、ということが分かりました。

これは、トグルボタンがAPVTSとして管理されていないので、状態保持されていないことが原因だと察しました。ということで、SYNCのトグルボタンをAPVTSに連動させていく、という修正を行いました。

目次

こんな人の役に立つかも

・JUCEのtoggleButtonをAudioProcessorValueTreeクラスのパラメータと紐づけたい方

・本ブログのディレイプラグインを作成している方

APVTSパラメータの追加

プロセッサ側へパラメータの追加

APVTSのパラメータと紐づけするメンバは、<float>にします。APVTSではboolですが、trueのとき「1」、falseのとき「0」となるようにtempoSyncFlgの値が変化します。

    //APVTSを紐づけるメンバです。
    std::atomic<float>* tempoSyncFlg = nullptr;

    //==============================================================================
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TheDelayAudioProcessor)
};

PluginProcessor.cppのプラグイン本体クラスのメンバイニシャライザにAPVTSパラメータを追加します。APVTSのパラメータはAudioProcessorBoolとして作成しました。([1])

            //[1]以下のパラメータを追加しました。
            ,
            std::make_unique<juce::AudioParameterBool>("tempoSyncFlg",      // parameterID
                                                        "TempoSyncFlg",     // parameter name
                                                        false)
            
        })
{
//...略...

    //パラメータを紐づけました。
    tempoSyncFlg = parameters.getRawParameterValue("tempoSyncFlg");
}

[2]のコンストラクタ内で先ほどのprivateなメンバ、tempoSyncFlgへ紐づけます。

エディタ側のGUIへの紐づけ

GUIのトグルボタンへ、パラメータを紐づけます。[1]のように、ボタンアタッチメントクラスを省略記載で定義しておきます。そして、[2]でメンバとして追加しました。

class TheDelayAudioProcessorEditor  : public juce::AudioProcessorEditor
{
public:
//...略...
    //[1]ButtonAttachmentを省略記載できるようにしました。
    typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment;

private:
//...略...

    //[2]アタッチメントのクラスを追加します。
    std::unique_ptr<ButtonAttachment> tempoSyncButtonAttachment;
    juce::ToggleButton tempoSyncButton;

//...略...    
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TheDelayAudioProcessorEditor)
};

次に、PluginEditor.cppファイルに記載されているプラグイン本体のエディタクラスのコンストラクタに以下のようにAPVTSパラメータを紐づける記載を行います。

    //コンストラクタ
    //[1]以下のように、アタッチメントクラスのreset関数でパラメータを紐づけます。
    tempoSyncButtonAttachment.reset(new ButtonAttachment(valueTreeState, "tempoSyncFlg", tempoSyncButton));
    //[2]コメントアウト
    /*tempoSyncButton.onStateChange = [this] {
        audioProcessor.setTempoSyncState(tempoSyncButton.getToggleState());
    };*/

[1]で、ボタンアタッチメントクラスによって、APVTSパラメータ「tempoSyncFlg」へとボタンの状態とパラメータの値が紐づけられることになります。

また、[2]では、ボタンがおされたときにボタンの状態を取得してプロセッサ側のメンバに渡すというハンドラを定義していましたが、APVTSパラメータへの紐づけにより、プロセッサ側からは、APVTSパラメータの「tempoSyncFlg」の値を確認するだけで良くなりますので、このラムダ式はコメントアウトしました。

音声処理の変更

今まで、音声処理の処理分岐に、tempoSyncStateというprivateなメンバ変数を利用していましたが、これをAPVTSのパラメータに変更しますので、以下の点を修正しました。

DelayTimeCalc関数のif文の条件をAPVTSパラメータ「tempoSyncFlg」へのポインタとしました。値が1の時、trueとなります。

void TheDelayAudioProcessor::DelayTimeCalc(float& val2, float& val3){
    //フラグをAPVTSの値に変更しました。
    if (*tempoSyncFlg == 1) {
//...略...
}

これによって、不要になったメンバとアクセサをコメントアウトしました。

    //[1]
    /*void setTempoSyncState(bool state) {
        bool val = state;
        tempopSyncState = val;
    }*/

//...略...
    //[2]
    //bool tempopSyncState = false;
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次