JUCEプログラミング、カスケードプラグインにGUIを自作したい(考察と失敗)

1_プログラミング

GUIの部分がいまいちよくわかっていません

自動で実装されるクラスを利用しているから、わからないんだね

JUCEのチュートリアルの「Plugin」の項目を順番にやってきましたが、いまいちGUIの作り方に疑問が残り、過去のチュートリアルなどを見直していました。とりあえず、一番最初のプラグイン実装をした「GainPlugin」のパラメータ追加方法を参考にしてパラメータを追加してみよう、と考えました。なんだかVlueTreeみたいな管理方法もあったような気がしますが、基本を使いこなせるようにならないといけませんよね^^;

ということで、今回はコンボボックスでパラメータを変更できるように奮闘している様の備忘録になりますm__m

スポンサーリンク

実現したい目標

CascadePluginのチュートリアルのGUIを自力で実装してみたいです。その最初の一つとして、スロット1のプルダウン形式のパラメータのGUIを作成することです。

GUIの実装方法の整理

①いちばん最初の基本的な例

いちばん最初にプラグインチュートリアルで実装した例です。AudioParameterFloatを定義して実装する例です。

GUIをリスナーに紐づけして変更が起こった際に値を取得する、というようなやり方がありました。

②AudioProcessorValueTreeStateを使う例

パラメータの追加、GUIの管理を「AudioProcessorValueTreeState」クラスを利用して改善しています。

今見直すと、どこがどうなっているかいまいちわからなくなりました 笑

③CascadePluginの今までのGUI

ProcessorクラスのcreateEditor関数で「juce::GenericAudioProcessorEditor」クラスを利用すると、設置したパラメータのGUIを自動で並べてくれるというものを利用していました。

//とりあえずは便利なGenericAudioProcessorEditor
juce::AudioProcessorEditor* CascadePluginAudioProcessor::createEditor()
{
    return new juce::GenericAudioProcessorEditor(*this);
}

Pluginチュートリアルに入ってからしばらくはGUIをなおざりにしていました。

実装の方向性

もう一度、基本的なGUIとパラメータのつながりを見ながら実装を試してみたいと思います。一方で、今回目標としているプルダウン形式のGUIの実装例はまだ見ていないので、その点は調べながらCascadePluginとのパラメータへの紐づけへと最適化する必要があります。

過去のプラグインの見直し

いちばん最初のGUIがどのようにパラメータと紐づいていたのかを見直しました。

①GUIオブジェクトの定義と初期設定

スライダーオブジェクト(GUI)「PluginEditor.h」にprivateな変数として定義しています。また、リスナー関数を追加しています。

class TutorialPluginAudioProcessorEditor : public juce::AudioProcessorEditor,
                                           private juce::Slider::Listener     //★[1]リスナー追加
{
public:
    TutorialPluginAudioProcessorEditor (TutorialPluginAudioProcessor&);
    ~TutorialPluginAudioProcessorEditor();
 
    //==================================================================
    // This is just a standard Juce paint method...
    void paint (juce::Graphics& g) override;
 
    void resized() override;
 
private:
    void sliderValueChanged (juce::Slider* slider) override; //★[2]リスナープロトタイプ宣言
 
    //==================================================================
    // This reference is provided as a quick way for your editor to
    // access the processor object that created it.
    TutorialPluginAudioProcessor& audioProcessor;
 
    juce::Slider midiVolume;
//★[3]スライダーのGUIオブジェクト
 
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TutorialPluginAudioProcessorEditor)
};

Editor.cppのコンストラクタにスライダーの初期化

TutorialPluginAudioProcessorEditor::TutorialPluginAudioProcessorEditor (TutorialPluginAudioProcessor& p)
    : AudioProcessorEditor (&p), audioProcessor (p)
{
    setSize (200, 200);
 
    //★[4]スライダーの初期設定
    midiVolume.setSliderStyle (juce::Slider::LinearBarVertical);
    midiVolume.setRange (0.0, 127.0, 1.0);
    midiVolume.setTextBoxStyle (juce::Slider::NoTextBox, false, 90, 0);
    midiVolume.setPopupDisplayEnabled (true, false, this);
    midiVolume.setTextValueSuffix (" Volume");
    midiVolume.setValue(1.0);
 
    addAndMakeVisible (&midiVolume);
    midiVolume.addListener (this);//★[5]スライダーをリスナーに紐づけしています。
}

②「PluginProcessor.cpp」にGUI値を受け取る変数を定義

publicなメンバ変数として、パラメータの数値を受け取る変数を定義しています。

class GainPluginAudioProcessor  : public juce::AudioProcessor
{
public:
    float noteOnVel;

③「PluginEditor.cpp」にリスナーを定義

リスナー関数でProcessorに先ほど定義したnoteOnVel変数にスライダーの値を代入しています。

void TutorialPluginAudioProcessorEditor::sliderValueChanged (juce::Slider* slider)
{
    audioProcessor.noteOnVel = midiVolume.getValue();
}

手順を整理するのは大事ですね。

コンボボックスのGUI表示資料

プルダウン形式で選択するGUIは、「コンボボックス」ということがわかりました。

コンボボックスのチュートリアルもありましたので、パラメータ初期化などは問題なくできそうです。

なにやらコンボボックスのチュートリアルがあるようです。GinPluginの書き方と比較しながら実装です。

検証中のメモ等

いろいろと試してみていて、一度もとに戻そうとして、「GenericAudioProcessorEditor」に戻したらアプリが落ちました。原因としては、GUIの数値を渡そうとしてprocessorSlot1のパラメータをpublicにしていたことです。processorSlot1のパラメータは、privateなメンバ変数にパラメータがないと駄目なようです。

processorSlot1などのAudioParameterChoiceをpublicにするとうまくいかないですし、publicなのもなんだか気持ちが悪いです。

もう少しいろいろと検証してみよう~

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