JUCEフレームワークのちょっとした理解にもつながりました。
AudioAppComponentクラスは便利だね
JUCEのチュートリアルプログラムでは、音声処理を使わない(MIDIのみ利用しているアプリ)では、「GUI」のテンプレートを利用していたり、音声処理が入ると「Audio」のテンプレートを利用したりしています。
理解を深めるために、あえて「Audio」テンプレートでMIDIのチュートリアルアプリを実装してきましたので、今回は、この「Audio」テンプレートから音声処理をコメントアウトして音声処理の動作を停止させたいと思います。
この記事は、過去にやってきたMIDIのノートオンを発生させるアプリのチュートリアルをベースにしています。
MIDIのアプリを実装してきたチュートリアル記事はこちらです。
Projucerの「GUI」と「Audio」テンプレートの違い
「GUI」テンプレートでは、作成していくMainComponentクラスは「JUCE::Component」を継承しています。一方「Audio」テンプレートでは、「juce::AudioAppComponent」を継承しています。
そのため、「Audio」テンプレートで作成するとGUIテンプレートと比較して次の点が多い状態です。
①デストラクタ内の「shutdownAudio()」処理
②prepareToPlay関数
③getNextAudioBlock関数
④releaseResources関数
そのため、プログラムに次の変更をすると、「GUI」テンプレートで作成した状態と同様になります。
MIDIアプリに変更を加える
以前チュートリアルで作成したAudioテンプレートベースのMIDI発生アプリを変更していきます。記事冒頭のリンクでご紹介したアプリです。
MainComponent.h
ヘッダーファイルの変更点は以下の2点です。
class MainComponent : public juce::Component// : public juce::AudioAppComponent
//←[1]Componentの継承に変更します。
{
public:
MainComponent();
~MainComponent() override;
//[2]音声処理をコメントアウトします。
/*void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override;
void getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill) override;
void releaseResources() override;*/
//...略...
MainComponent.cpp
cppファイルも同様に2点の変更を行いました。
//...略...
//[1]デストラクタのshutdownAudioをコメントアウトします。
MainComponent::~MainComponent()
{
//shutdownAudio();
}
//[2]音声処理関連の関数3つをコメントアウトします。
/*
void MainComponent::prepareToPlay (int samplesPerBlockExpected, double sampleRate){}
void MainComponent::getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill)
{
bufferToFill.clearActiveBufferRegion();
}
void MainComponent::releaseResources(){}*/
//...略...
なんとなく、Projucerで色々と初期設定ができるのですが、正直、実際どのようなプログラムが追加されたか、など知っておかないと後々に困ってきそうな気もしました^^;
これで、Audioが必要なくなったら、停止することもできるし、開発途中で方向転換もすぐできそうです。
ちゃんと設計して作ろう・・・
読み込まれるモジュールの違い
GUIテンプレートと、Audioテンプレートでは、読み込まれるモジュールに違いがあります。
MIDIのチュートリアルでは、GUIテンプレートで新規作成しようとすると、Mモジュールが足りずにビルドエラーとなることがあります。
そのため、プロジェクトを新規作成する場合、MIDI関連のチュートリアルでは、Audioをベースに作っていくのが良いと考えています。
左がAudioのテンプレート、右がGUIのテンプレートでそれぞれ読み込まれるモジュールです。不要なモジュールの取捨選択はもう少し慣れてきたら行っていきたいと思います。
Midiキーボードに関するクラス「MidiKeyboardComponent」は「juce_audio_utils」モジュールに属するので、MIDI関連のチュートリアルはAudioテンプレートにすると、チュートリアルに集中して取り組むことができると思います。