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なのもなんだか気持ちが悪いです。
もう少しいろいろと検証してみよう~