updateGraph関数が今回のプラグインの中心的な存在かもしれません。
これを読み解いて、もっと自由にプラグインが作成できるようになりたいね
前回まで、とりあえずオシレータ、ゲイン、フィルターの3つの処理を実装して、動作を確認することができました。(GUIとかはなく、DAWのパラメータ表示で直操作していますが^^;)
前回では、updateGraph関数について詳しくみていなかったので、処理の要部となるupdateGraph関数についてみていきたいと思います。
進めいているチュートリアルページはこちらの「Connecting graph nodes together」の項目となります。
こんな人の役に立つかも
・JUCEフレームワークに入門したい人
・VST、AUプラグイン開発の最初の一歩を踏み出したい人
・JUCEのチュートリアルをやっている人
updateGraph関数の全体像
まずは、updateGraphがどのようになっているか整理します。
※スロットという言葉をいつの間にか使います^^;これは、オシレータ、ゲイン、フィルターのノードを設置する場所になります。先の図、プラグインのインターフェースのスクリーンショットを見ていただけると、イメージがつかみやすいかと思います。
呼び出し元と挙動
updateGraphはプラグインのprocessBlock関数から呼び出されています。そして、updateGraphが呼び出されることで音声処理の各ノード(今回は3つあるスロットに選択した処理である、オシレータ、ゲイン、フィルターを各ノードといっています。)が接続されることになります。
updateGraphの3機能
updateGraph関数は次の図のように3つの機能を実現するプログラムに分かれています。
①スロットの処理の変化を取得
①の処理で、3つあるスロットに変化があったかを検出しています。プラグインには、次の図のようにSlot1~3までがありますので、この設定を変化させたかどうか、という点を見ることになります。
②ノードの再接続処理
実際に、「mainProcessor」(AudioProcessorGraphクラスのオブジェクトのスマートポインタとして定義されています。)へノードを設定するための処理となります。
③スロットのバイパス処理
最後に、スロットがバイパス指定されているかのフラグを確認して、バイパス指定されていれば、ノードをバイパスするように指示しています。
プログラムの詳細に入る
まずは、スロットが変化したかどうかを検出するプログラムになります。
void updateGraph()
{
//↓ここから①の処理になります。
//1.いくつかのローカルな変数を準備しています。
bool hasChanged = false;
//2.現在のスロットに格納されているノードとバイパス状態を配列として取得します。
juce::Array<juce::AudioParameterChoice*> choices{ processorSlot1, processorSlot2, processorSlot3 };
juce::Array<juce::AudioParameterBool*> bypasses{ bypassSlot1, bypassSlot2, bypassSlot3 };
//3.スロットにノードを追加します。
juce::ReferenceCountedArray<Node> slots;
//privateなメンバ変数slot1Node~slot3Nodeを設定します。
slots.add(slot1Node);
slots.add(slot2Node);
slots.add(slot3Node);
1.では、bool型の変数「hasChanged」を定義して、falseを代入しています。後程スロット変化があった場合trueとして、変化があったことのフラグとします。
2.で、choicesとbypassesという配列(juceのArrayクラス)を定義します。配列には、choicesには、スロットのAudioParameterChoiceクラスであるprocessorSlot1~3を入れます。
そのため、AudioParameterChoiceのポインタを格納する配列としています。定義したprocessorSlot1~3のインスタンスのアドレスを取得してここに格納するようなイメージでしょうか。(AudioParameterChoiceクラスのオブジェクトとしてprocessorSlot1~3はすでにコンストラクタ内で初期化されています。)
同様に、bypassesはAudioParameterBoolクラスのオブジェクトへのポインタの配列(JUCEのArray)となっています。
3.では、ReferenceCountedArrayクラスの「slot」という変数を準備しています。slotに、addメソッドでノードを追加します。(slot1Node~slot3NodeはNode::Ptrのオブジェクトで、privateなメンバ変数として定義しています。)
JUCEのクラスだらけ・・・
クラスのリファレンスを参照していると、ブラウザのタブがどんどんと増えていきます 笑
ちょっとクラスの森に迷い込みつつありますので、今回はこのあたりにしたいと思います^^;次回も整理しながら、updateGraph関数を読み解いていきたいなと思います。