JUCEでアプリケーション開発、音声処理のカスケード8、updateGraph関数1

1_プログラミング

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関数を読み解いていきたいなと思います。

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