JUCEプログラミング、Processing audio input、ホワイトノイズ変調アプリを動作させる

以前やっていたAudioチュートリアルの続きが進められます。

いきなりホワイトノイズジェネレータが出てきたので寄り道したんだね~

このチュートリアルのベースとなるプログラムはチュートリアルのSynth項目で作成するホワイトノイズジェネレータになります。次のGitHubリポジトリにベースとなるプログラムを配置していますので、このプログラムを前提としてチュートリアルを進めていきたいと思います。

GitHub
GitHub - perfectpanda-works/WhiteNoiseGenerator02 Contribute to perfectpanda-works/WhiteNoiseGenerator02 development by creating an account on GitHub.

ホワイトノイズジェネレータは以下の記事で作成しましたので、ご参照ください。

ぱんだクリップ
JUCEプログラミング、WhiteNoiseGenerator1、チュートリアルの導入部分 | ぱんだクリップ ホワイトノイズを発生させたいと思います。 前衛かっΣ 「Build a white noise generator」のチュートリアルを進めていきます。いくつかのチュートリアルで基本となるチュー...

こんな人の役に立つかも

・JUCEフレームワークに入門したい人

・JUCEで音声プログラミングを学びたい人

・JUCEの「Processing audio input」チュートリアルを進めている人

目次

作成するアプリの概要

このチュートリアルを行うと、入力音声をホワイトノイズで変調させた音を得ることができます。

プログラム的には、ホワイトノイズジェネレータのgetNextAudioBlock関数を変更して作成します。

動作時の音声入力が必要となります。私は、ノートパソコンについているマイクと、イヤホンを接続して検証しました。ハウリングが起こらないように、出力音声はヘッドホンやイヤホンが良いと思います。

アプリの見た目は、ホワイトノイズジェネレータと全く同じになります 笑

これで、声をマイクで入力すると、ホワイトノイズで変調された声が出力されました。

初めての本格的なエフェクトができました。ちょっと感動です。

プログラミング

ベースとなるプログラムは、記事冒頭で記載した、ホワイトノイズジェネレータとなります。

コンストラクタ

MinComponent.cppのコンストラクタの「setAudioChannels」関数を次のように変更しました。

    setSize(800, 600);
    setAudioChannels(2, 2); //←入力を2チャンネルで受けるように変更しました。
}

単純に一つ目の引数を2にするだけです。

getNextAudioBlock関数

getNextAudioBlock関数の中身を次のように変更しました。

void MainComponent::getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill)
{
    auto* device = deviceManager.getCurrentAudioDevice();
    auto activeInputChannels = device->getActiveInputChannels();
    auto activeOutputChannels = device->getActiveOutputChannels();
    auto maxInputChannels = activeInputChannels.getHighestBit() + 1;
    auto maxOutputChannels = activeOutputChannels.getHighestBit() + 1;

    auto level = (float)levelSlider.getValue();

    for (auto channel = 0; channel < maxOutputChannels; ++channel)
    {
        if ((!activeOutputChannels[channel]) || maxInputChannels == 0)
        {
            bufferToFill.buffer->clear(channel, bufferToFill.startSample, bufferToFill.numSamples);
        }
        else
        {
            auto actualInputChannel = channel % maxInputChannels; // [1]

            if (!activeInputChannels[channel]) // [2]
            {
                bufferToFill.buffer->clear(channel, bufferToFill.startSample, bufferToFill.numSamples);
            }
            else // [3]
            {
                auto* inBuffer = bufferToFill.buffer->getReadPointer(actualInputChannel,
                    bufferToFill.startSample);
                auto* outBuffer = bufferToFill.buffer->getWritePointer(channel, bufferToFill.startSample);

                for (auto sample = 0; sample < bufferToFill.numSamples; ++sample)
                    outBuffer[sample] = inBuffer[sample] * random.nextFloat() * level;
            }
        }
    }
}

この変更を行い、声が変調されるのを楽しみました 笑

次回は、音声処理の内容を詳細に追いたいと思います。

よかったらシェアしてね!
目次
閉じる