ヘッダ部分
ADDRESS | +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F | 0123456789ABCDEF |
0000000000 0000000010 0000000020 |
52 49 46 46 E0 3A 00 00 57 41 56 45 66 6D 74 20 10 00 00 00 01 00 01 00 22 56 00 00 22 56 00 00 01 00 08 00 64 61 74 61 BC 3A 00 00 |
RIFF.:..WAVEfmt ........"V.."V.. ....dataシ:.. |
ど頭でRIFF宣言をしています。
その後、04〜07までがデータサイズを表しています。
データサイズは右から左で書かれています。
例の場合は E0 3A 00 00 は 00003AE0 となり、15072byteと云うことになります。
データサイズはそのファイルのファイル長からRIFF宣言とファイルサイズを指定しているバイト数(8byte)を引いた値になります。
ファイルサイズが28624byteならばデータサイズは28616byteになります。
もしくは、書き込んだ音声データ(ヘッダを除いたデータ)のバイト数に32(10進数)を足しても同じことになります。
その次は、ファイル形式がWAVEであると宣言しています。
それからfmt と記し、そこからフォーマットチャンクになると宣言しています。
このフォーマットについては、実際のデータからそのままコピーしてくるといいでしょう。
わかっているのだけ書いておくと、10にはフォーマットに使っているデータ長を表しているみたいです。
14は01で固定みたいです。
16にはモノラルかステレオの区分がモノラル:1、ステレオ:2でかかれているみたいです。
18〜19にはサンプリング周波数が記されているみたいです。11 2B だと11.025kHz、44 ACだと44.100kHzみたいです。
1C〜1Eにはサンプリング周波数×チャンネル数×bit/8の値が入ってるみたいです。簡単に言うと、8bit/monoならまんま。8bit/stereoまたは16bit/monoなら2倍。16bit/stereoなら4倍した値が入るみたいです。
20には次式で求まる値でデータブロックの大きさを記しているみたいです。式は、チャンネル数×bit/8 です。
ステレオ・16bitなら、2×16÷8=4、となるみたいです。
22には8bitなら08、16bitなら10が入るみたいです。
詳しいことはよくわかりません。すんまそん。
以下に代表的なもののフォーマットを書いておきます。
コピーして使ってください。
22.050kHz,8bit,Mono | 10 00 00 00 01 00 01 00 22 56 00 00 22 56 00 00 01 00 08 00 |
22.050kHz,8bit,Stereo | 10 00 00 00 01 00 02 00 22 56 00 00 44 AC 00 00 02 00 08 00 |
22.050kHz,16bit,Mono | 10 00 00 00 01 00 01 00 22 56 00 00 44 AC 00 00 02 00 10 00 |
22.050kHz,16bit,Stereo | 10 00 00 00 01 00 02 00 22 56 00 00 88 58 01 00 04 00 10 00 |
44.100kHz,8bit,Mono | 10 00 00 00 01 00 01 00 44 AC 00 00 44 AC 00 00 01 00 08 00 |
44.100kHz,8bit,Stereo | 10 00 00 00 01 00 02 00 44 AC 00 00 88 58 01 00 02 00 08 00 |
44.100kHz,16bit,Mono | 10 00 00 00 01 00 01 00 44 AC 00 00 88 58 01 00 02 00 10 00 |
44.100kHz,16bit,Stereo | 10 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00 04 00 10 00 |
そして、フォーマットチャンクの後には一般的に、DATAの宣言が行われます。
24〜27に data と書かれ、その後4バイトにデータブロックの大きさが書かれます。
データブロックの大きさは、ファイルの大きさからヘッダ部分を引いた値になります。
この場合だと、2Dバイト目からデータブロックになるので、ファイルの大きさから44(2C)を引いた値になります。
そして、ヘッダが終わった2Dからデータブロックがのんべんだらりと続きます。
しかし、フォーマットチャンクの後にfactチャンクが来るものもあります。
factチャンクは著作権情報などと云った情報が書き込まれるチャンクです。
このfactチャンクはファイルを作成する時には特に必要ありませんので、そのままdata宣言してかまいません。
市販のソフトにて作成されたWAVEデータを読み込む際にはfactチャンクが存在している可能性があるので、読み込む際にはdata宣言を行っているブロックを検出し、その後からデータの読み込みを始めた方が無難です。
以下に実際にfactチャンクが存在するヘッダの一例を載せておきます。
サウンドレコーダーを使用して作成されたデータです。
ADDRESS | +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F | 0123456789ABCDEF |
0000000000 0000000010 0000000020 0000000030 |
52 49 46 46 DA BA 06 00 57 41 56 45 66 6D 74 20 12 00 00 00 01 00 02 00 44 AC 00 00 88 58 01 00 02 00 08 00 00 00 66 61 63 74 04 00 00 00 54 5D 03 00 64 61 74 61 A8 BA 06 00 |
RIFFレコ..WAVEfmt ........Dャ..・.. ......fact....T] ..dataィコ. |
サウンドレコーダーで作られたWAVEデータは見ての通り、factチャンクが存在している他、フォーマットチャンクのデータ長も18バイトになっています。
もちろん、データブロックの開始は3Aからになっています。
データブロック
更に気をつけないといけないのは、int型で読み込んだ場合、8bitの場合だと0〜127(00〜7F)まではそのまま使えます。
しかし、128〜255(80〜FF)はそれぞれから256を引いた値、-128〜-1を使用することになります。
この点に気をつければ何も怖いことはありません。
16bitにも似たようなことが言えます。
0-32767(0000-7FFF)はそのままで、32768-65535(8000-FFFF)はそれぞれから65536を引いた値、-32768〜-1を使用することになります。
データとしては、右から左に流れて書かれているので、実際には FF 7F までがまんま、00 80 からが65536を引いた値を使うことになります。