JUCEの音声処理関数がどのタイミングで処理されるのか、最初はイメージできていませんでした。
AudioProcessorクラスの基本的な動作とかも押さえておくといいのかもね〜
JUCEプログラミングを始めたときに、知っておくとスムーズにチュートリアルなどが進められるであろう知識をまとめる2回目です。今回は、主にオーディオプラグインをProjucerで作成する際のテンプレートのプログラム構成の内容です。
前回の記事の続きとなりますので、こちらの記事もご参照ください。
※DSPをやっている方や、すでにプラグイン開発をされている方には当たり前の内容となりますこと、ご了承ください。
こんな人の役にたつかも
・JUCEプラグインをこれから作成したい人
・JUCEプラグインテンプレートの構造が知りたい人
・JUCEチュートリアルが難しいと感じる人
JUCEプラグインの構成について
全体像
JUCEプラグインのテンプレートを生成すると、
・GUI描画処理などを行う「エディタ」というプログラム
・音声処理を行う「プロセッサ」というプログラム
に分離されています。
具体的には、「〇〇PluginEditor.cpp」と「〇〇PluginEditor.h」がエディタを構成するプログラムファイル、「〇〇PluginProcessor.cpp」と「〇〇PluginProcessor.h」がプロセッサを構成するプログラムになります。
(〇〇には作成したプロジェクト名が入ります。)
基本的に、GUIを作成するために「エディタ」側をプログラミング、音声の処理(音を変化させる)を作成するために「プロセッサ」側をプログラミングする、というイメージです。
テンプレートを作成すると、それぞれEditorクラスの「〇〇AudioProcessorEditor」クラス、Processorクラスの「〇〇AudioProcessor」クラスが作成されています。
この2つのクラスが作成するプラグインの本体クラスになります。
パラメータ
パラメータで音声処理の動作を変化ます。
GUIのスライダー等(GUIコンポーネントと呼ぶことにします。)で操作して、変化させ、その値を音声処理で利用したいです。
このとき、GUIを実装するエディタ側のクラス「〇〇AudioProcessorEditor」から「〇〇AudioProcessor」へ変数の内容を何かしらの方法で渡したり、知らせたりしなければいけません。
このパラメータの紐づけは、一般的なオブジェクト指向プログラミングの手法で行うこともできます。
JUCEでは、こうした音声処理に利用されるようなパラメータに関しては、AudioProcessorValueTreeState(APVTSと省略します)というクラスの機能を利用することで、定型的にエディタとプロセッサを紐づけたパラメータを追加することができます。
このクラスは、使うのに慣れが必要ですが、利用することで、パラメータの追加手順が共通化されて良いかと思います。
チュートリアルでは、パラメータを必ずしもAPVTSクラスを利用して追加していないので、注意が必要です。
APVTSのパラメータの追加手順は、こちらにまとめていますので、慣れるまで毎回この手順を繰り返すと良いかと思います。
音声処理
音声処理は、次の関数が順番に実行されます。この3つの関数は、テンプレートで、AudioProcessorクラスを継承してオーバーライドした状態で準備されています。
①preparedToPlay関数
②processBlock関数
③releaseResources関数
preparedToPlay関数でサンプルレート設定などの音声処理の初期化を行います。その後、アプリ(プラグイン)の起動中、processBlock関数が繰り返し実行されます。
最後に、releaseResources関数が実行されます。メモリの解放などを処理します。
processBlock関数では、音声バッファのブロックが引数として入ってくるので、これを処理することで音声に変更を加えることができます。
この処理の流れは、それぞれの関数にDBG関数で文字列を出力するようにして、どのように文字列が出力されるかを観察すると、挙動がわかりやすいのでお勧めです。
この音声処理部分の流れがイメージできていると、JUCEチュートリアルをやっている時にスムーズに理解できると思います。
デバッグの方法
JUCEプログラム開発で、コンソール出力でデバッグをしたいとき、JUCEで定義されているDBG関数を利用するとプラットフォームに関係なく統一したコンソール出力ができますので、便利です。
DBG("変数1:" << value);
チュートリアルでは、コンソールに出力する方法がいくつか出てきましたが、このDBGを使う方法が一番手軽だと思います。
デバッグ出力に関しては、こちらの記事で模索しましたので、よろしければご参照ください。こちらの記事で、プラグインとして動作している時にプログラムのプロセスにアタッチする方法なども記載しています。
まとめ
・エディタとプロセッサに分離して作成する
・パラメータはAPVTSクラスで実装する
・音声処理はAudioProcessorクラスの構造を理解する
・とりあえずDBGでコンソール出力をする
あまりまとまっていないね・・・