LoFiBeats・84分の作業用BGMを作成しました!

JUCEプログラミング、Tutorial: Wavetable synthesis3、ウェーブテーブルのオシレータ実装続き

1_プログラミング

ウェーブテーブルの仕組みでオシレータが動作するように引き続き実装をしていきます。

まずは動作させるところまでいきたいね

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);//ここを変更しました。
//...略...

これでウェーブテーブル方式のオシレータが動作しました。

タイトルとURLをコピーしました