ASのSoundクラスをいじってみた

アプリを作ろうとSoundクラスをいじってみたのでログ残す。

まずはSoundクラスにある例をそのまま書いてみた。sin波をそのまま出力するサンプルらしい。

Sound sample - wonderfl build flash online


おー、音が鳴った!

しかし、イマイチ仕組みがよくわからんのでもう少し調べてみる。

音とは?

まずは音とはなんぞやと考えてみる。
音とは、波である。こいつは1秒間に何回か振動している。単純なサイン波であれば、0から始まって1まで緩やかにカーブして-1まで落ち、また0に戻る、アレ。この波のY軸の値をスピーカーに渡すと、スピーカーがそれに沿って振動して音を出してくれるらしい。

デジタル化すると?

その音を処理するためには、アナログのままだとコンピューターが認識できない。ので、数値で表さなければならない。この処理のことをクオンタイズ(量子化)というらしい。つまり、f(x) = sin(πx/2) で表せる連続な点の集まりを、コンピューターは式のままでは認識できないので、f(0) = 0、 f(1) = 1、f(2) = 0、f(3) = -1 .... という風に、不連続な点として書きだしてく必要がある。この波形のデータはPCMデータと呼ばれ、これに適切なヘッダ情報を付けた場合にWAVファイルとなる。
サンプリングレートっていうのは、いわゆるこのPCMデータの数のことで、例えば 44.1 KHz ならば1秒間に 44100 ものデータを処理する。

ActionScript で書くと?

flash.media.Sound クラスは play() すると、SampleData を要求するので、SampleDataEvent の data に PCM データを書きこんでいく。そうすると音が出てくるっていう仕組みらしい。ドキュメントを読むと、その PCM データのバッファは 2048〜8192 までで、2048 未満の場合はそれ以降は出力終了ステータスになり、SampleData を要求しなくなる。
Sound クラスのサンプリングレートは 44.1 KHz っぽいので、ちょうど 0.1 秒だけ音を鳴らすために必要なデータの個数は 4410 個となる。それが本当かどうか、ちょっと試してみた。

Sound sample rate test - wonderfl build flash online


うん、10〜100ミリ秒あたりでちょっと揺らぎはでるものの、概ね1秒おきに音が鳴ってるみたい。自分でBPM等を計算して音を出力したい場合は、このあたりを参考にしてバッファの数を調整するか、カウントをどこかで保持しておいて、それにそって音を出力するといいのかも。