意外と今回のプログラムは分量も少なかったです。
これで、シンセのノイズジェネレータを作成したことになるね!
Projuerから作成した新規プロジェクトの枠を基本として、実際に動作するアプリを作成していきます。
今回の記事では、内容の詳細は追わずに、とにかく実装して動作させるという点に集中していきたいと思います。
公式サイトでのチュートリアルページはこちらとなります。
こんな人の役に立つかも
・JUCEフレームワークに入門したい人
・JUCEで音声プログラミングを学びたい人
・JUCEの「Build a white noise generator」チュートリアルを進めている人
MainComponent.hの定義
まずは、今回のプログラムで利用するRandomクラスのオブジェクトをprivateなメンバ変数としてヘッダーファイルに定義します。
class MainComponent : public juce::AudioAppComponent
{
//...略...
private:
juce::Random random;
//←追記します。
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};
JUCEのRandomクラスを利用して、ノイズを発生させるようです。今回のプログラムでは、「nextFloat」関数を利用してランダムなfloatの数値を取得して、ゲイン値を変更してホワイトノイズを作成する機能の一部のように利用しているようです。
Randomクラスのチュートリアルもあります。後々、こちらのチュートリアルもやっていきたいと思っています。
ヘッダーはこれだけですね~
MainComponent.cppの追加
コンストラクタ
コンストラクタでは、アプリの入出力設定を行います。次のようにコンストラクタの中を書き換えました。
MainComponent::MainComponent()
{
setSize(800, 600);
setAudioChannels(0, 2); //←アプリの入出力設定を行います。
}
setAudioChannelsは、アプリの入出力を決めるような関数です。
prepareToPlay関数
音声処理を開始(アプリが始まるタイミングで実行)する関数です。今回は、ログ的なものを出力しているようです。
void MainComponent::prepareToPlay (int samplesPerBlockExpected, double sampleRate)
{
juce::String message;
message << "Preparing to play audio...\n";
message << " samplesPerBlockExpected = " << samplesPerBlockExpected << "\n";
message << " sampleRate = " << sampleRate;
juce::Logger::getCurrentLogger()->writeToLog(message);
}
以前、一度windows.hを利用してメッセージ出力をしていましたが、今回のこのやり方の方がJUCE内部的に便利そう(macにも依存しない)なので、勉強になりますφ(.. )
※20210511追記
後日、デバッグ用のメッセージ出力について、こちらの記事にまとめておりますので、ご参照ください。
getNextAudioBlock
ノイズを生成する今回一番重要なポイントのある関数です。
void MainComponent::getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill)
{
for (auto channel = 0; channel < bufferToFill.buffer->getNumChannels(); ++channel)
{
// Get a pointer to the start sample in the buffer for this audio output channel
auto* buffer = bufferToFill.buffer->getWritePointer(channel, bufferToFill.startSample);
// Fill the required number of samples with noise between -0.125 and +0.125
for (auto sample = 0; sample < bufferToFill.numSamples; ++sample)
buffer[sample] = random.nextFloat() * 0.25f - 0.125f;
}
}
一番したのforループでは、バッファ内をループさせてRandomクラスを利用して値の変更をしているものがうかがえます。処理に関しては、チュートリアルの説明を詳しく読んで理解する必要がありそうです。次回は、この部分をじっくり見ていきたいと思います。
releaseResources
最後に、音声処理終了時に呼び出される関数(アプリの終了のとき)で、ここでメッセージを出力しています。
void MainComponent::releaseResources()
{
juce::Logger::getCurrentLogger()->writeToLog("Releasing audio resources");
}
動作検証
音量の調整ができないアプリなので、最初起動する前に十分に出力音量を小さくしておく必要があります!
プログラムの追記ができたので、動作検証を行ってみます。
シンプルなノイズ発生器ができました。ノイズ、結構落ち着くんです。