カスケードプラグイン、引き続き、音声処理プログラミングに入っていきます。
だんだんと本来やりたいところに近づいてきたね
引き続き、エフェクトを数珠繋ぎできるようなVSTプラグインの作成を行っていきます。前回の記事までで、一つの音声処理ではなく、AudioProcessorGraphというクラスで、プラグインにノードという概念を取り入れることで、チャンネルストリップのようにいくつかの音声処理をつなぎ合わせていくことができるようになりました。
今回のチュートリアルからは、DSP(デジタル信号処理)というより本格的な処理モジュールを利用することになります。
進めているチュートリアルは次のページの「Implementing different processors」になります。
こんな人の役に立つかも
・JUCEフレームワークに入門したい人
・VST、AUプラグイン開発の最初の一歩を踏み出したい人
・JUCEのチュートリアルをやっている人
DSPモジュールを有効にする
チュートリアルを進めていたのですが、DSPモジュールを追加しないと、エラーになるのですね^^;
これに気づくのに結構時間がかかりました・・・
ということで、以下のサイトを参考に、DSPモジュールをプロジェクトに追加して、DSPを利用できるようにしました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9SlVDRSUzQSUyMERTUCUyMG1vZHVsZSVFNCVCQSU4QiVFNSVBNyU4QiVFMyU4MiU4MSZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzM0EzQzNDJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9OTZlOGU2OWEzMmExNTFjZjQwNjFjYWVkMjY4ZTI4MDM&mark-x=120&mark-y=96&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDBBb2dpcmktbTJkJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz05ZGJkMmVjMzE5ZGFjMWJlZjEwMDU4NDRhODllMGEzYQ&blend-x=120&blend-y=500&blend-mode=normal&s=e6a8f83a87bb89e9fca09f42e4f14728)
Projucerにて、プロジェクトにDSPモジュールを追加します。
![](https://panda-clip.com/wp-content/uploads/2020/10/fig1-21.png)
ツリーの中を確認すると、DSP関連のプログラムが追加された模様です。
![](https://panda-clip.com/wp-content/uploads/2020/10/fig2-21.png)
これで、プログラムに赤線なみなみがなくなり、一安心です。
ベースクラスの作成
チュートリアルでは、「オシレータ」「ゲイン」「フィルター」という3つの音声処理のエフェクトを作成していきます。
そのために、基本となるクラスを「ProcessorBase」として作成しておきます。このクラスを継承して個別のエフェクトを作成することで、毎回同様の記載となる関数などの記述を省くことができます。
「PluginProcessor.h」にAudioProcessorクラスを継承したProcessorBaseクラスを追記します。
#pragma once
#include <JuceHeader.h>
//以下のクラスを追加しました。
class ProcessorBase : public juce::AudioProcessor
{
public:
//==============================================================================
ProcessorBase() {}
//==============================================================================
void prepareToPlay(double, int) override {}
void releaseResources() override {}
void processBlock(juce::AudioSampleBuffer&, juce::MidiBuffer&) override {}
//==============================================================================
juce::AudioProcessorEditor* createEditor() override { return nullptr; }
bool hasEditor() const override { return false; }
//==============================================================================
const juce::String getName() const override { return {}; }
bool acceptsMidi() const override { return false; }
bool producesMidi() const override { return false; }
double getTailLengthSeconds() const override { return 0; }
//==============================================================================
int getNumPrograms() override { return 0; }
int getCurrentProgram() override { return 0; }
void setCurrentProgram(int) override {}
const juce::String getProgramName(int) override { return {}; }
void changeProgramName(int, const juce::String&) override {}
//==============================================================================
void getStateInformation(juce::MemoryBlock&) override {}
void setStateInformation(const void*, int) override {}
private:
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ProcessorBase)
};
中身を見てみると、今までチュートリアルで作成してきたプラグインクラスと同じ構成になっていることがわかります。
prepareToPlayや、processBlockといったプラグインの基本的な関数の最もシンプルな状態を記載しています。
一つ一つの音声処理のクラスは、マトリョーシカのように大きな音声処理のプロセスに小さな音声処理のクラスがたくさん連なっているイメージでしょうか。
とりあえず、今回はここまでとさせていただきます。以下の作業を行いました。
①DSPモジュールをプロジェクトに追加しました。
②音声処理のベースクラスを追加しました。