ウェーブテーブルの仕組みでオシレータが動作するように引き続き実装をしていきます。
まずは動作させるところまでいきたいね
JUCEチュートリアル、Synthの項目、「Wavetable synthesis」を進めていきます。「Wavetable Oscillator」の項目の実装続きです。前回までで、「WavetableOscillator」クラスの実装が完了しました。今回は、MainComponent.cppの実装となります。
公式ドキュメントからダウンロードできる該当サンプルは、「WavetableSynthTutorial_02.h」となります。
こんな人の役に立つかも
・JUCEでプログラミングの勉強をしている人
・JUCEチュートリアル「Wavetable synthesis」を勉強している人
・JUCEでウェーブテーブルの仕組みを実装したい人
MainComponent.cppの実装
コンストラクタ
コンストラクタでは、ウェーブテーブルにサイン波を生成するcreateWavetable関数の実行を追加しました。
MainContentComponent()
{
cpuUsageLabel.setText ("CPU Usage", juce::dontSendNotification);
cpuUsageText.setJustificationType (juce::Justification::right);
addAndMakeVisible (cpuUsageLabel);
addAndMakeVisible (cpuUsageText);
createWavetable();//追加しました。
setSize (400, 200);
setAudioChannels (0, 2); // no inputs, two outputs
startTimer (50);
}
createWavetable関数
ウェーブテーブルにサイン波のデータを作成します。私は、cppファイルの一番下に追加しました。
void MainComponent::createWavetable()
{
//[1]ウェーブテーブルのバッファを準備します。
sineTable.setSize(1, (int)tableSize);
auto* samples = sineTable.getWritePointer(0);
//[2]サイン波作成の計算に必要な変数を作成します。
auto angleDelta = juce::MathConstants<double>::twoPi / (double)(tableSize - 1);
auto currentAngle = 0.0;
//[3]サイン波サンプルデータの作成です。
for (unsigned int i = 0; i < tableSize; ++i)
{
auto sample = std::sin(currentAngle);
samples[i] = (float)sample;
currentAngle += angleDelta;
}
}
[1]の処理では、AudioSampleBufferクラス(floatのAudioBufferクラス)のsineTableに「setSize」関数でバッファサイズを設定します。バッファのチャンネル数は1としています。そして、samples変数にsineTableのポインタを取得します。
[2]では、サイン波を生成するための変数を作成します。以前と同様、「angleDelta」は増加するラジアンなので、128サンプル毎に何ラジアン進むのかを格納します。また、currentAngleは初期値0で、angleDelta毎に進むことでサイン波のサンプル値を求める際に利用します。
[3]では、ウェーブテーブルのサンプル数(今回は128回)分ループさせます。ループ毎にcurrentAngleをangleDeltaラジアン分増加させて1周期分128サンプルのサイン波データ(ゲイン値)をウェーブテーブルのバッファに格納します。
prepareToPlay関数
前回のウェーブテーブルを利用しないサイン波オシレータクラスから名前を変更しましたので、作成するウェーブテーブルオシレータクラスの名称に変更しておきます。
void MainComponent::prepareToPlay (int samplesPerBlockExpected, double sampleRate)
{
auto numberOfOscillators = 200;
for (auto i = 0; i < numberOfOscillators; ++i)
{
//auto* oscillator = new SineOscillator();
auto* oscillator = new WavetableOscillator(sineTable);//ここを変更しました。
//...略...
これでウェーブテーブル方式のオシレータが動作しました。