チュートリアルホワイトノイズ・ジェネレーターを作る
このチュートリアルでは、簡単な合成とオーディオ出力を紹介します。このチュートリアルは、JUCE のオーディオ・アプリケーション(およびプラグイン)のコンセプトを理解するための鍵となります。
レベル:中級
プラットフォーム:Windows, macOS, Linux
クラス: AudioAppComponent,AudioSourceChannelInfo,AudioBuffer,Random
スタート
このチュートリアルのデモ・プロジェクトのダウンロードはこちらから:PIP|ZIP.プロジェクトを解凍し、最初のヘッダーファイルをProjucerで開く。
このステップにヘルプが必要な場合は、以下を参照してください。Tutorial: Projucer Part 1: Getting started with the Projucer.
このチュートリアルは、あなたがデジタルオーディオの基本原理を知っていることを前提にしています。特に、オーディオ信号がサンプリングを使ってどのように表現されるかを知っている必要があります。の考え方も知っている必要があります。サンプルレートこの文脈ではサンプリングレート,サンプリング周波数その他類似の用語)。
デモ・プロジェクト
デモプロジェクトはThe Projucer オーディオアプリケーションテンプレートがある。
これは、JUCEで独自のオーディオ・アプリケーションを開発するための出発点として役立ちます。このデモプロジェクトは、ホワイトノイズを合成し、ターゲットデバイスのデフォルトのオーディオハードウェアから再生します。
オーディオ・アプリケーション・テンプレート
このチュートリアルでは、オーディオ出力のみを実装しています。オーディオ入力とオーディオ入力データのリアルタイムオーディオ処理については、他のチュートリアルで説明します。オーディオ・アプリケーション・テンプレートは、GUIアプリケーション・テンプレートとよく似ています:
- について
MainContentComponent
クラスはAudioAppComponentクラスではなくComponentクラスである。 - について
juce_audio_utils
モジュールは、デフォルトでプロジェクトに追加される他のオーディオ関連モジュールに加えて、プロジェクトに追加されます。
Audio Application テンプレートは、ここで提供する例のような単純なアプリケーションに使用できます。また、より複雑なアプリケーション、基本的にはターゲットデバイスのオーディオハードウェアと直接対話する必要のあるアプリケーションにも拡張可能です。JUCEによるオーディオ・プラグインの作成については、他のチュートリアルで説明します。
オーディオ・アプリケーションのライフサイクル
についてAudioAppComponentクラスは抽象基底クラスで、次の3つの機能を持つ。pure virtualオーディオ・アプリケーションのライフサイクルを表す関数は、次のとおりです。マストを派生クラスに実装します:
- AudioAppComponent::prepareToPlay():オーデ ィオ処理が始まる直前に呼び出される。
- AudioAppComponent::releaseResources():オーディオ処理が終了したときに呼び出されます。
- AudioAppComponent::getNextAudioBlock():オーディオハードウェアが新しいオーディオデータのブロックを必要とするたびに呼び出される。
この3つの中で最も重要なのは、おそらくAudioAppComponent::getNextAudioBlock()JUCE オーディオアプリケーションでオーディオを生成したり処理したりするのはここだからです。この仕組みを理解するために、現代のコンピュータがどのようにオーディオを生成するかを少し知っておく必要があります。オーディオハードウ ェアは、オーディオの各秒について、チャンネルごとにある数のサンプルを生成する必要があります。CD品質のサンプルレートは44.1kHzで、これは、再生するためにオーディオハードウェアに送られる、1チャンネルあたり毎秒44100サンプルが必要であることを意味します。オーディオハードウェアには、一度に1サンプルずつ渡されるのではなく、一定のサンプル数を含むバッファ(ブロック)で渡されます。例えば、44.1kHz、ブロックサイズ441の場合、次のようになります。AudioAppComponent::getNextAudioBlock()関数は1秒間に100回呼び出される。
上記の441サンプルというバッファサイズは、説明のために演算をシンプルに保つために使用されている。実際には441というバッファサイズは珍しい。ハードウェアのバッファサイズは、ほぼ間違いなく偶数であり、2の累乗(256、512、1024 など)になる傾向があります。アプリケーションは、以下のような場合に対応できるようにしておくことが重要です。いずれもバッファ・サイズ。サンプル・レートとバッファ・サイズの設定については、以下を参照してください。Tutorial: The AudioDeviceManager class.
基本的に、我々はAudioAppComponent::getNextAudioBlock()のサービスを行っている。オーディオ・コールバックを呼び出します。注意すべき点は、この関数は別のスレッド (オーディオスレッドほとんどの場合)。
JUCEオーディオ・アプリケーションが正しく動作するためには、さらに2つの重要な関数があります。今回は、それらを実装するのではなく、呼び出す必要があります:
- AudioAppComponent::setAudioChannels():必要な入出力チャンネル数を登録するために呼び出す。通常、コンストラクタでこれを行います。この関数を呼び出すと、アプリケーションのオーディオ処理が開始されます。
- AudioAppComponent::shutdownAudio():オーディオシステムをシャットダウンするために呼び出さなければならない。一般的には、デストラクタの中でこれを行います。