以前やっていたAudioチュートリアルの続きが進められます。
いきなりホワイトノイズジェネレータが出てきたので寄り道したんだね~
このチュートリアルのベースとなるプログラムはチュートリアルのSynth項目で作成するホワイトノイズジェネレータになります。次のGitHubリポジトリにベースとなるプログラムを配置していますので、このプログラムを前提としてチュートリアルを進めていきたいと思います。
ホワイトノイズジェネレータは以下の記事で作成しましたので、ご参照ください。
こんな人の役に立つかも
・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;
}
}
}
}
この変更を行い、声が変調されるのを楽しみました 笑
次回は、音声処理の内容を詳細に追いたいと思います。