Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

WAVフォーマットとヘッダ

「PCMにWAVヘッダを付ける」では、WAVヘッダを紹介しました。

WAVフォーマット(*.wav)は、 ファイルコンテナの一種で音源データを格納するファイル形式ですが、手っ取り早く リニアPCMにWAVヘッダを付けるだけでもWAVファイルとして扱うことが出来ます。

WAVファイルはファイルコンテナ

ファイルコンテナの例としては、WAVフォーマットの他にAIFFがあります(オーディオファイルについてはこちら)。

形式 ファイルコンテナ 備考
WAV Wave File Format (RIFF waveform Audio Format) Windows
AIFF Audio Interchange File Format Mac OS

「PCMにWAVヘッダを付ける」では16kHzモノラルでした。 サンプリング周波数16kHzは音声を目的としたものでしたが、音楽では 44.1kHzや48kHzのステレオが一般的で、PCMの波形を見る時いちいちサンプリング周波数や、ビット数、チャネル数を指定するのはめんどくさいので、 リニアPCM16ビット、サンプリング周波数48kHzステレオのWAVヘッダを用意してみました。

サンプルコード【C言語(リニアPCM16ビット、サンプリング周波数48kHz、ステレオ)

#define WAV_HEADER_SIZE    44
// リニアPCM16ビット、サンプリング周波数48kHz(ステレオ)
char wav_header_template[WAV_HEADER_SIZE] = {
    0x52, 0x49, 0x46, 0x46,  // 'RIFF'
    0x00, 0x00, 0x00, 0x00,  // RIFFチャンクのサイズ(size + 12 + 16 + 8)
    0x57, 0x41, 0x56, 0x45,  // 'WAVE'
    0x66, 0x6D, 0x74, 0x20,  // 'fmt'
    0x10, 0x00, 0x00, 0x00,  // fmtチャンクのバイト数 = 16(リニアPCM)
    0x01, 0x00,              // フォーマット = 1(非圧縮PCM)
    0x02, 0x00,              // チャネル数 = 2 (ステレオ) 
    0x80, 0xBB, 0x00, 0x00,  // サンプリング周波数 = 48000
    0x00, 0x77, 0x01, 0x00,  // バイト/秒 = 96000
    0x04, 0x00,              // ブロックサイズ = 16bit x 2(ステレオ) = 4byte
    0x10, 0x00,              // ビット/サンプル = 16
    0x64, 0x61, 0x74, 0x61,  // 'data'
    0x00, 0x00, 0x00, 0x00   // size (データバイト数)
};

サンプリング周波数16kHzモノラルはこちら

AudacityでWAVファイルを読み込み

例えばAudacityで音源ファイルを読み込む時、 *.pcmを開こうとすると、「ファイルの取り込み時にエラーが発生しました」となり失敗します。*.pcm の場合は、 【ファイル】➞【取り込み】➞【ロー (Raw) データの取り込み】という手順になりますが、*.wavではこの手順がなくなります。

Audacityについてはこちら