当たり前ですが、複数のオーディオ処理をつなげて複雑なエフェクトを作成するので、プラグインのオリジナリティには必須になってきますね。
プラグイン内部でもエフェクト処理と同じ考え方でプログラムを作るんだね
チャンネルストリップのように、いくつかのエフェクト処理などを数珠繋ぎ(カスケード、またはデイジーチェーンと表現されます)して音声処理を行うために、「AudioProcessorGraph」というクラスを利用することができるようです。
チュートリアルでやる内容の概要と、プロジェクトの準備をまとめました。(プログラミングは少し長くなりますので、ヘッダーファイルを記載するところまでをやりました。)
公式のドキュメントは次のリンクとなります。
https://docs.juce.com/master/tutorial_audio_processor_graph.html
こんな人の役に立つかも
・JUCEフレームワークに入門したい人
・VST、AUプラグイン開発の最初の一歩を踏み出したい人
・JUCEのチュートリアルをやっている人
音声処理をカスケードする
JUCEでは、「AudioProcessorGraph」というクラスを利用することで、次の図のように、ノードを接続する考え方で複数のオーディオ処理を連結して、すべての処理を通した出力を得ることができるようです。
音声処理ノード1は、ゲイン処理を行い、音声処理ノード2はフィルタ処理を行う、といったように処理毎にノードとしてプログラミングしていくようなイメージでしょうか。
DAWのエフェクト挿入するようなイメージですね~。
実際には、DSP(デジタル信号処理)など、もっと高度なチュートリアルで音声処理ノード内の処理は学ぶ必要があるね
今回のチュートリアルでは、あらかじめ準備された、フィルター処理などを追加していく模様です。
チュートリアルプログラミングの準備
新規にプロジェクトを作成
今回のチュートリアルを進めるにあたり、「CascadePlugin」というプロジェクトを新規にProjucerで作成しました。テンプレートは「Plug-In」の「Basic」を選択し、Project Nameを「CascadePlugin」としています。
※Path to Modulesのところは、JUCEをインストールしたフォルダの「modules」を指定します。私の環境で、設定の初期値が6.0.1にいつも指定されてしまっているので、ここは手動で最新のmodulesフォルダを選択しています。もしそうなっている場合、ちょっとだけ注意が必要かと思います。
プロジェクトの作成~ビルドまでの一連の流れは、こちらの記事もご参考ください。
ヘッダーファイルへの変数の追加
「PluginProcessor.h」にusingを追加します。
private:
//追加
using AudioGraphIOProcessor = juce::AudioProcessorGraph::AudioGraphIOProcessor;
using Node = juce::AudioProcessorGraph::Node;
C++には、「using」の記載の仕方にいくつか用途があるようです。
今回は、「juce::AudioProcessorGraph::AudioGraphIOProcessor」と型宣言するものを、単に「AudioGraphIOProcessor」と記載するだけでOKという使い方になりますね。(エイリアス宣言)
「AudioProcessorGraphクラス」の「AudioGraphIOProcessor」と「Node」を利用して先ほどの図のような接続の関係図(グラフ)をプログラミングしていきます。
Private変数の追加追加
privateなメンバ変数として、AudioProcessorGraphクラスのオブジェクトである「mainProcessor」と、その他、オーディオ入出力のNode、MIDIの入出力のNodeをメンバ変数として定義しました。
private:
using AudioGraphIOProcessor = juce::AudioProcessorGraph::AudioGraphIOProcessor;
using Node = juce::AudioProcessorGraph::Node;
//先ほどに引き続き以下のプログラムを追加しました。
std::unique_ptr<juce::AudioProcessorGraph> mainProcessor;
Node::Ptr audioInputNode;
Node::Ptr audioOutputNode;
Node::Ptr midiInputNode;
Node::Ptr midiOutputNode;
中途半端なのですが、この後のプログラミングが長くなりますので、今回は、ヘッダーファイルにメンバ変数を準備するところまでとさせていただきます。
今回のチュートリアルは一息が長いです・・・