いったい誰が読むのかさっぱり分からないまま突発的に始まったプログラミング講座もついに第1回を迎えたわけですが、今回は Windows でおなじみのWAVEファイルについてお勉強していきましょう。
えーと、まずWAVEファイルの構造ですが、これはRIFF(Resource Interchange File Format)と呼ばれるものでして、チャンクと呼ばれるブロックと、その中に含まれるサブチャンクと呼ばれるブロックで構成されています。
ではいったいどういうふうになっているかというと、WAVEファイルの場合、
内容 | バイト数 | ||
---|---|---|---|
"RIFF"の4文字 | 4 | RIFFヘッダ | |
RIFFデータサイズ | 4 | ||
"WAVE"の4文字 | 4 | RIFFデータ | |
"fmt "の4文字 | 4 | サブチャンク | |
fmt データのサイズ | 4 | ||
fmt データ | --- | ||
"data"の4文字 | 4 | サブチャンク | |
dataデータのサイズ | 4 | ||
dataデータ | --- |
と言った構造をしています。ちなみにデータサイズの項はリトルエンディアンス(下位バイトから順に格納)になっているという86系のCPUを使ってる人には有り難い仕様です。
ちなみに時々、"fmt "チャンクと"data"チャンクの間に"fact"チャンクというものがあるものがあります。詳しくは知らないのですが、実際の演奏とは直接関係ないので読み飛ばしても構わないはずです。
実はWindowsにはこのRIFFファイルを簡単に扱う「マルチメディア ファイルI/O」というAPI群があります。RzPlayerでも録音部分にはこれを使っていますが、ここでは説明しませんので、興味のある方はがんばってSDKを読みましょう。
ここにはWAVEファイルについての情報が入っています。
以下にその内容を示します
内容 | バイト数 |
---|---|
フォーマットタグ | 2 |
チャンネル数 | 2 |
サンプル/秒 | 4 |
バイト/秒 | 4 |
ブロック境界 | 2 |
ビット/サンプル | 2 |
拡張情報サイズ | 2 |
拡張情報 | --- |
さて、いよいよ肝心のデータ部分です。圧縮がかかったものについてはここでは触れません(私が知りません)。すなわちPCMフォーマットの場合ですね。
まずデータの表現ですが、8bitと16bitの場合で表現方法が違います。8bitの場合は0〜255まで、16bitの場合は−32768〜32767までとなります。早い話しが8bitのときは符号なしで、16bitのときは符号付きで表します。
次にデータの中の格納されかたですが、モノラルの場合はただひたすらそれらのデータが並んでいるだけ、ステレオの場合はまず左側のデータがあってその後に右側のデータが来ます。後はこれの繰り返しですから左右交互にデータが並ぶことになります。さて、ここまでWAVEファイルのフォーマットを見てきたわけですが、いよいよこれを再生する方法です。
OSはWindowsとします。ここまで読んできちんとWAVEファイルの構造を理解していれば再生はそれほど難しいものではありません。
前提としてここに"Sample.wav"というWAVEファイルがあったとします。C言語でこれを再生するルーチンを書くと。
sndPlaySound("Sample.wav", SND_SYNC);
とまあ、このようになりま......
長い説明の割にはくだらないオチだったなぁ。
果して第2回はあるのだろうか、その答えは次回わかります。
ちなみに内容に間違いがあっても私は責任を負いませんのでどうぞよろしく。