前回のボリュームが多くて、今回は微妙に物足りないかもしれません
やっとupdateGraph関数も最後
JUCEのいろいろなクラスと、ポインタに悩まされてきたupdateGraph関数ですが、やっと完了しそうです。今回は、ボリュームが少ないのですが、チュートリアルの音声処理はこれで一通り完了となります。本家チュートリアルでは、「Convert the plugin into an application」と、スタンドアロンのアプリに移植する方法が続きますが、また必要になったときにやっていこうと思います。
進めているチュートリアルページは次のページとなります。
こんな人の役に立つかも
・JUCEフレームワークに入門したい人
・VST、AUプラグイン開発の最初の一歩を踏み出したい人
・JUCEのチュートリアルをやっている人
updateGraph関数の最後、スロットのバイパス処理
最後は、スロットのバイパス処理になります。
for文で3回繰り返していますが、これはスロットの数になります。
//スロットのバイパス設定を行います。
for (int i = 0; i < 3; ++i)
//なぜかここにはスロット数が定数なんですよね^^;
{
auto slot = slots .getUnchecked (i);
auto& bypass = bypasses.getReference (i);
//slotに何かしらのノードが設定されている場合です。
if (slot != nullptr)
slot->setBypassed (bypass->get());
}
slotにノードが存在している場合のとき、バイパスの設定処理を行います。bypass変数は、bypassesというAudioParameterBool*のjuceのArrayなので、いわゆるboolの配列になります。この配列から順番に真偽を取得してきて、slot(AudioProcessorGraph::Node)のsetBypassed関数で引数にboolを与えることでパイパスかどうかを設定できます。そのままboolの値を代入すればOKなので、bypassのArrayからget関数で値を取得して、引数として利用しています。
//入力音声のミュート設定を行います。
audioInputNode->setBypassed (muteInput->get());
//slotsからノードのポインタを取得して、slot1Node~slot3Nodeに代入します。
slot1Node = slots.getUnchecked (0);
slot2Node = slots.getUnchecked (1);
slot3Node = slots.getUnchecked (2);
}
プラグインには、入力音声をミュートするかどうか、の設定がありました。これを、音声入力ノード「audioInputNode」の「setBypassed」関数で設定することでプラグインへの音の入力をミュートにすることができます。
次に、slots.getUncheckedで音声処理ノードの「ObjectClassPtr」(ReferenceCountedObjectPtr)を取得しています。オブジェクトへのポインタです。指し示す先は、「AudioProcessorGraph::Node」クラスのオブジェクトになります。
やはり、ポインタが指し示すさきのクラスが何なのかがポイントですね
GitHubでサンプル
今回の動作検証を行った「CascadePlugin」をGitHubリモートリポジトリにPUSHしましたので、cloneして動作確認していただけるかと思います。
>git clone https://github.com/perfectpanda-works/CascadePlugin.git
また、プログラムだけを一部コピペしたり、全体を把握したいという場合は、zip形式でダウンロードもできますので、以下GitHubリポジトリへアクセスしていただければと思います。
プログラムをダウンロードして、理解を深めるツールとしていただけたら幸いです。
とりあえず動きます 笑
GenericAudioProcessorEditorでGUI
後から気づいたのですが、チュートリアルのGUIは、エディターを「GenericAudioProcessorEditor」クラスを利用して生成しているようです。
「PluginProcessor.cpp」のcreateEditor関数を以下のようにGenericAudioProcessorEditorで生成することで、自動的に、今利用しているパラメータでGUIを作成してくれるようです。(自由にGUIを作成する場合は、PluginEditorクラスに実装しなければいけません)
juce::AudioProcessorEditor* CascadePluginAudioProcessor::createEditor()
{
//return new CascadePluginAudioProcessorEditor (*this);
return new juce::GenericAudioProcessorEditor(*this);
}