サウンドファイルとは拡張子がWAVやPCM、MP3、WMA、OGG・・・というようにいろいろなものが存在します。
そしてこれらのデータは通常2種類のデータに分かれます。
まず1つめが未圧縮データと呼ばれるもので、音声データがそのまま記録されたファイルです。
そしてもう1つが音声データを圧縮したファイルです。
DirectSoundが扱えるのは未圧縮データのみなので、MP3やWMAはそのままでは再生出来ないという事になります。
ただしMP3やWMAといった圧縮ファイルは元は未圧縮の音声データなので、
圧縮されたデータをデコードさえ出来ればDirectSoundでも間接的に再生させることが出来ます。
ここではこの未圧縮データとはどういう形式なのかについて詳しく説明します。
まず音声の基本は空気の振動です。
これは小学校でも習うので詳しくは説明しません。
ではこの空気の振動がどのようにPCに記録されているのかというと、
実はよく分かっていない人が多いのではないのでしょうか?
音声を録音するということは普通はマイクを使って録音しますが、
この録音するという処理はAD変換と言って、アナログ(マイク)をデジタル(量子化ビット)に変換する処理です。
音声の基本は空気の振動と言いましたが、これは下のような波形を指します。
横軸が時間で縦軸が空気の圧力です。
そしてこの空気の変動をデータ的な大きさに変換することで、その瞬間の空気の圧力を記録します。
この瞬間の空気の圧力をある一定のタイミングで連続的に記録したものが音声のデータとなります。
データを記録する際にこの圧力の大きさを1バイト(0~255)で表すのか、
2バイト(0~65535)で表すのかにより、同じ時間を記録した際のデータサイズが大きく変わります。
当然この圧力を細かく分解出来たほうが音質が良くなります。
(デジタルでは、この分解量以上の細かさは切り捨てされるため、
この切捨てされたところがあとでノイズとなってしまい、
かすれた音に聞こえたりシャーという音が混じったりします。)
ちなみにデータを取得することをサンプリング(sampleのing形)といい、
このデータを1秒間に何個取得するかを定義するのがサンプリングレートと言います。
とある人が録音したい音の一番高い周波数の2倍の速度でサンプリングすれば、
元の波形に100%戻すことが出来ることを発見しました。
ではよーく考えてみましょう。
人間の可聴範囲(聞き取れる周波数帯)は20Hz~20000Hzと言われています。
人によっては22KHz(22000Hz)まで聞こえる人もいるそうです。
ということは人間が聞き取れる音を全て記録したい場合、その2倍の速度でサンプリングすれば良いと言うことです。
さて、CDの音質は44KHzであるということをなんとなく知っていると思いますが、
これを2で割ってみるとちょうど人間の可聴範囲に収まっているということが分かります。
つまりCDの44KHzとはきちんと決められた値なんです。
( ・∀・)つ〃∩ヘェーヘェーヘェー
参考までに下にそれぞれの周波数のWAVファイルを作ってみました。
データは5秒間の物になりますが、使用しているスピーカーや音量によっては全然聞こえないこともあります。
これは人間にも可聴範囲があるのと同じく、スピーカーにも鳴らせる範囲が存在するためです。
(正確には周波数ごとに聞き取れる音量が違います。逆に同じ音量でも低音と高音では強さが違うように感じます。)
20Hz | 60Hz | 100Hz | 200Hz | 300Hz | 400Hz | 500Hz | |
800Hz | 1000Hz | 2000Hz | 4000Hz | 6000Hz | 8000Hz | 10000Hz | |
12000Hz | 14000Hz | 16000Hz | 18000Hz | 20000Hz |
日本人が会話で使用するのは100~4000Hz位です。
そしてこの辺の音が良く聞こえます。
ちなみに英語などの外国語はこれより上の周波数範囲を使っていますが、
日本人が英語の聞き取りが苦手なのはこの周波数に鳴れていないためです。
そのためよくクラシックを聞けば良いと言いますが、これは高い周波数がいい感じで混ざってるからだそうです。
それと1000HzはよくTVの放送終了時にピーと鳴っている音です。
結構高周波のように聞こえますが実は全然低かったりします。
人間は通常14000Hzから18000Hzまでの間が鳴っているかどうかが分かる程度の音です。
16000Hz以上は人によっては全然聞こえなかったりします。
特に年齢を重ねるとさらに聞こえが悪くなるようですが逆に若い人ほど高周波が聞こえるので、
これを利用して携帯の着信音を17000Hzくらいのモスキート音にすることで、
授業中に着信があっても先生には聞こえないのでバレないという使い方もあるようですw
ではアナログデータをデジタルに変換する基本が分かったところで、
ここではWAVデータと言うのはどのようにデータが格納されているのかを説明します。
上のほうでデジタルに変換する時は、その時その時の空気の圧力をデータに変換すると説明しました。
そしてその分解能が8bitか16bitというように、細かければ細かいほどきれいな波形が表現出来ます。
8bitというのはつまり1バイトです。(1bitを8つまとめて1バイトと表現する)
16bitとはつまり2バイトになります。
そしてWAVデータとはこのバイト列をただ並べただけのデータとなります。
1つのサンプルにつき8bitでは1バイトを使うため、1秒間のデータを保存するには、
CD音質、つまり44KHzでは44100バイトを使うことになります。(44Kは正確には44100Hzです)
16bitでは1サンプルが2バイトのため、1秒間では44100x2バイトとなり、88200バイトを使います。
なお上では説明しませんでしたが、通常CDはステレオとなり片方ごとに波形が別々に記録されます。
この時の1サンプルとは、左と右を合わせて1つ分としてまとめたものです。
ということは8bitステレオだと1サンプルに付き2バイトとなります。
そして16bitステレオの場合は4バイトを使うことになります。
これらのフォーマットが未圧縮時の音声データということになり、
WAVファイルの中身やDirectSoundでのバッファの内容もこの形式で処理されます。
最後にCD音質(16bitのステレオ、44KHz)で1秒間のデータは何バイトかを計算するには、
「(周波数) × (解像度 / 8) × (モノ=1:ステレオ=2)」 という式を使います。
するとこの場合は44100Hz × (16bit / 8) × 2 = 176,400バイトのデータ領域が必要になります。
よく考えるとこれだと10秒足らずでフロッピーの容量を超えてしまいます(FDはおよそ1.44MB)。
ゲームで使用するサウンドは1分から2分、多いと3分以上といった長さのものを鳴らす必要があるため、
これらをロードするということはかなりのメモリを消費すると言うことになります。
※仮に3分の曲の場合は30MBとなる
拡張子がWAVとなっているファイルは基本的に上記のデータが格納されているファイルです。
ただし規約があり、このサウンドはどのような種類のサウンドなのか、
長さはどれくらいあるのかなどの情報がファイルの先頭の部分に記録されます。
そして通常これをWAVヘッダと呼び、その形式も決まっています。
WAVファイルをロードするための関数はWindowsに用意されています。
これを利用することで容易(かどうかは微妙ですが)にWAVファイルを扱うことが出来ます。
ちなみに、WAVファイルには未圧縮データの他にMP3形式やACM形式といった圧縮形式のデータも格納することが出来ますが、
このようにどのような形式のものでも格納出来るようなフォーマットをコンテナといいます。
※コンテナとはいろいろなものを詰め込める箱のようなイメージです
次の章では実際の読み込みルーチンについて説明します。