JUCE始めると、デジタルの音声の仕組みについてある程度イメージできるとスムーズだと思います。
丁寧に解説されるところもあるけれど、英語だとイメージがつかみづらいよね~
同じような境遇でJUCEプラグインにこれから挑戦したいというしたいという方の役に立てばと思います。
JUCEに挑戦しようと感じた当初、私の知識レベルは以下のような段階でした。
1.DSPという言葉は知っているけれど、具体的に何をしているのかイメージできない。
2.C++、は触ったことがない。(オブジェクト指向は何となくわかる)
3.DTMの知識で何となく音声を処理するということはわかっている。
1については、JUCEを利用することで、難しい数学的な知識まで掘り下げなくても、DSPモジュールの入力と出力がわかればいろいろとできる幅が広がります。JUCEのドキュメントを読む力を調べながらつけていくことで音声処理を実装することができます。
2については、C++の標準ライブラリやスマートポインタ、autoといったC++特有の実装方法がチュートリアルで出てきますが、その都度使い方を覚えればやっていけるような雰囲気があります。一般的な、オブジェクト指向のプログラミング方法、クラスの作成やクラス間の変数の渡し方など、そういった点がオリジナルのプラグインを作成するうえで必要になってきています。とりあえずは、Projucerのテンプレートでのすでに実装されている関数が何をしているかを覚えて使えれば、小さなプラグインを作成していくことができました。
3については、実際DTM的な考え方があるとかなりここはこうしているのかな?という予想がつきやすいと思います。音声バッファの概念などは特にそうでした。
9か月ほど、JUCEチュートリアルと、個人的な調査を行った結果、JUCEを始める前に知っておくとスムーズに理解が進むだろうなと感じるような知識をまとめていきたいと思います。
※知っている方にとっては、曖昧な表現もあるかと思いますが、どうぞご了承ください。
こんな人の役に立つかも
・デジタルで音声の仕組みを扱う知識が知りたい人
・JUCEチュートリアルをやったけれど、何をしているのか理解できない人
・デジタルの音声に関して知識がなく、JUCEでオーディオプラグインを作りたい人
音声処理の知識
DTMでも一般的な内容なのですが、この内容を厳密に抑えておくかどうかでチュートリアルの理解度も違ってくると思います。
JUCEで実現したい音声アプリケーション(本ブログでは、VSTやAUプラグインを対象にしています)は、入力音に何かしらの処理を施して出力するという基本があります。
デジタルの音声データ
普段、DTMなどで音声を扱う際、音をデジタルデータとして扱います。オーディオインターフェースなどで入力してAD変換されたデジタルデータとしての音は、次のようになっています。
あえて視覚的にグラフ化すると、縦軸に音量(ゲイン)がとられ、横軸に離散的な時間がとられます。離散的な時間といっているのは、サンプリングレートの間隔毎にデータが取得されるため、連続的な時間ではない点に注意です。
実際のAD変換された生データとしては、グラフの下の数値の並びのようになっています。データの並び方向が時間、データの内容が音量ととらえるとグラフのように可視化できる、ということです。
JUCEプログラミングなど、デジタルに扱う音量はゲインと表現されて、一般的に-1.0から1.0という範囲内に収まるようにデータ化されるようです。
サンプリング周波数
サンプリング周波数は、厳密には難しい言葉での定義がありますが、JUCEでアプリを開発する際には、「1秒間に取得する音声のゲインデータの回数」とイメージすると良いと思います。
プログラム内では、「sampleRate」という変数名であったりします。wikipediaにもあるように、サンプリングレート、サンプルレートなどとも呼ばれます。
CD音質等、一般的な44.1kHzのサンプリングレートをイメージすると、次の図のようになります。1秒間に4万4千100回サンプリングされます。
Wikipediaのサンプリング周波数
バッファサイズ
DAWなどでバッファサイズの設定ができますが、これは、先ほどのサンプル数何個分をため込むかという設定になります。
音声をコンピュータなどデジタル機器で処理する際に、音声データサンプルをひとつのブロックにして処理していきます。
そのため、バッファサイズの大きさによって入力音と出力音に時間差に変化がでます。バッファサイズが大きければコンピュータが処理する時間に有余があるので、負荷がかかりませんが、リアルタイムに演奏しながら音声処理(エフェクトなど)をして出力をすると、音に遅れ(レイテンシ)が生じて演奏しづらいです。
JUCEプログラミングでは、DAWなどで設定されたバッファサイズの音声バッファ(音声データの集合体)が入力されてきます。
※私はブログで「音声データサンプルの集合体」のことを、「音声ブロック」、「バッファブロック」、「音声バッファ」など、文脈によっていろいろな言葉を使ってしまいますが、「音声データを処理するためにひとまとめにした音声データの集合」という意味で使っていますので、どうぞ、ご了承くださいm__m