トップ音響信号処理 > WAV形式

WAV形式とは

WAV(ワブ)またはWAVE(ウェーブ)は、 マイクロソフトとIBMにより開発された音声データ記述のためのフォーマットである。 RIFF(Resource Interchange File Format)の一種で、主としてWindowsで使われるファイル形式である。 ファイルに格納した場合の拡張子は、.wavである。 RIFF上の識別子は「WAVE」であるが、拡張子から、WAVフォーマットという呼び名が一般化した。 通常は非圧縮、リニアPCMのサンプリングデータ用のフォーマットとして扱われるが、 WAVはいわゆるコンテナ形式で、データ形式は自由であり、 μ-lawや、ADPCM、MP3、WMAなどの圧縮データを格納することもできる。


WAV ファイルヘッダ情報

4 byte 'R' 'I' 'F' 'F' RIFFヘッダ
4 byte これ以降のファイルサイズ (ファイルサイズ - 8)  
4 byte 'W' 'A' 'V' 'E' WAVEヘッダ。RIFFの種類がWAVEであることを表す
4 byte 'f' 'm' 't' ' ' (←スペースも含む) fmt チャンク。フォーマットの定義
4 byte バイト数 fmt チャンクのバイト数。リニアPCM ならば 16(10 00 00 00)
2 byte フォーマットID リニアPCM ならば 1(01 00)
2 byte チャンネル数 モノラル ならば 1(01 00)、 ステレオ ならば 2(02 00)
4 byte サンプリングレート 44.1kHz ならば 44100(44 AC 00 00)
4 byte データ速度 (Byte/sec) 44.1kHz 16bitステレオならば 44100×2×2=176400(10 B1 02 00)
2 byte ブロックサイズ (Byte/sample×チャンネル数) 16bit ステレオ ならば 2×2 = 4(04 00)
2 byte サンプルあたりのビット数 (bit/sample) WAV フォーマットでは 8bit か 16bit。16bit ならば 16(10 00)
2 byte 拡張部分のサイズ リニアPCMならば存在しない
n byte 拡張部分 リニアPCMならば存在しない
4 byte 'd' 'a' 't' 'a' data チャンク
4 byte バイト数n 波形データのバイト数
n byte 波形データ  

例1: 44.1kHz, 16bit, ステレオ, リニアPCM の場合のヘッダ内容
  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
00 52 49 46 46 -- -- -- -- 57 41 56 45 66 6D 74 20
(内容) R I F F ファイルサイズ - 8 W A V E f m t  
01 10 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00
(内容) 16 1 2 44100 176400
02 04 00 10 00 64 61 74 61 -- -- -- -- -- -- -- --
(内容) 4 16 d a t a データサイズ 以後データ
[出典: http://www.kk.iij4u.or.jp/~kondo/wave/]

例2: 44.1kHz, 8bit, モノラル, リニアPCM の場合のヘッダ内容
  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
00 52 49 46 46 -- -- -- -- 57 41 56 45 66 6D 74 20
(内容) R I F F ファイルサイズ - 8 W A V E f m t  
01 10 00 00 00 01 00 01 00 44 AC 00 00 44 AC 00 00
(内容) 16 1 1 44100 44100
02 01 00 08 00 64 61 74 61 -- -- -- -- -- -- -- --
(内容) 1 8 d a t a データサイズ 以後データ


WAVファイル作成プログラム(1)

44.1kHz, 8bit, モノラル, リニアPCMのWAVファイル出力プログラムを以下に示す。
ダウンロード

このプログラムでは、WAVファイルのヘッダ情報を構造体 WAVHEADER で定義している。これにより、 次のようにして、構造体の要素へのデータのセットが簡単に行える。

    WAVHEADER  wh = { "RIFF", 0, "WAVE", "fmt ", 16, 1, 1, SRATE, SRATE, 1, 8, "data", 0 };
また、ヘッダ情報のファイルへの書込みも次のように、1行で行える。
    fwrite(&wh, sizeof(wh), 1, fpWav);

 ところで、ヘッダファイルmmsystem.hには
typedef struct waveformat_tag {
    WORD    wFormatTag;        /* format type */
    WORD    nChannels;         /* number of channels (i.e. mono, stereo, etc.) */
    DWORD   nSamplesPerSec;    /* sample rate */
    DWORD   nAvgBytesPerSec;   /* for buffer estimation */
    WORD    nBlockAlign;       /* block size of data */
} WAVEFORMAT, *PWAVEFORMAT, NEAR *NPWAVEFORMAT, FAR *LPWAVEFORMAT;
が定義されている。これを使えば、構造体 WAVHEADER の定義は、次のように書ける。
typedef struct {
    char    sRiff[4];          // RIFFヘッダ
    DWORD   nFileSize;         // これ以降のファイルサイズ(ファイルサイズ−8)
    char    sWave[4];          // WAVEヘッダ
    char    sFmt[4];           // fmt チャンク
    DWORD   nFmtSize;          // fmt チャンクのバイト数。リニアPCM ならば 16
    WAVEFORMAT  wavefmt;
    WORD    wBitsPerSample;
    char    sData[4];
    DWORD   nDataSize;
} WAVHEADER;
このときのプログラムを以下に示す。
ダウンロード

構造体の初期化は、変更しなくてもいいが、次のように、wavefmt に当るところをブロック { } でくくった方が 分かりやすい。
    WAVHEADER  wh = { "RIFF", 0, "WAVE", "fmt ", 16, { 1, 1, SRATE, SRATE, 1 }, 8, "data", 0 };
プログラム行数は若干短くなるが、構造体 WAVHEADER の初期化に当り、 構造体 WAVEFORMAT の中身を知らなければならない。最初のプログラムの方が分かりやすいと思われる。
また、構造体の定義を変えたときのプログラムを以下に示す。
ダウンロード

楽譜とWavファイルの例

楽譜とWavファイルの例を以下に示す。 ただし、非圧縮のWavファイルはファイルサイズが大きく非効率なため、zip圧縮ファイルのみをサーバーに置いている。 zipファイルをダウンロードして演奏することも可能であるが、 演奏自体は、別のページでzip圧縮ファイルを直接演奏できるようにしている。
曲名楽譜楽譜ファイルzipファイルWavファイルコメント
通りやんせ楽譜ex0.txtex0.zip
荒城の月楽譜ex1.txtex1.zip

琵琶湖周航の歌楽譜ex2.txtex2.zip

エーデルワイス楽譜ex3.txtex3.zip

ちょうちょう楽譜ex4.txtex4.zip

大きな古時計楽譜ex5.txtex5.zip

きらきら星楽譜ex6.txtex6.zip

グリーングリーン楽譜ex7.txtex7.zip
この楽譜には一か所二つの音符を同時に演奏する部分があるが、(mi3, 48)を省略した。

Wavファイルの16進表示

特にプログラム開発段階で、予想した結果が得られない場合などでは、 出力ファイルの中身を調べることが有効である。 表示に多少時間がかかるため、別ページとした。
ラ(周波数440Hz)1秒間la.wavの16進表示

Wav音声の波形表示

波形表示プログラムを以下に示す。

ダウンロード

440Hz の la.wav の 0.1 秒間の波形を以下に示す。減衰の様子も観測できる。

0.02 秒間の波形を以下に示す。

Wav音声の波形表示(2)

スクロール機能を追加した波形表示プログラムを以下に示す。

ダウンロード