WAVE ファイルフォーマット

 一般的に知られている WAVE 形式のファイル。これは実は結構複雑だったりする。と言うのもこの WAVE 形式とでも内部データのフォーマットが複数存在するからである。今回はその WAVE フォーマットについて調べた内容を書いてみます。
●基本構造
1.RIFF ヘッダ
 まず WAVE フォーマットは RIFF 形式で構成されています。この RIFF 形式と言うのは複数のチャンク(後述)を連結し一つのファイルになっています。RIFF 形式のファイルヘッダは以下の様な構造です。
struct RiffHeader {
  uint32_t riff;
  int32_t  size;
  uint32_t type;
};
各フィールドの説明は以下。
フィールド名 サイズ 説明
riff 4 RIFF 形式のファイルを示す 'RIFF'
size 4 riffsize を除くサイズ(ファイルサイズ - 8)
type 4 音声データの場合は 'WAVE'
この RiffHeader はファイルの先頭に必ずあります。ちなみに AVI の場合は type'AVI ' が指定されます。RiffHeader の次にチャンクが並びます。チャンクには複数の種類が存在します。
  • fmt チャンク(必須)
  • data チャンク(必須)
  • fact チャンク(オプション)
  • cue チャンク(オプション)
  • plst チャンク(オプション)
  • list チャンク(オプション)
  • labl チャンク(オプション)
  • note チャンク(オプション)
  • ltxt チャンク(オプション)
  • smpl チャンク(オプション)
  • inst チャンク(オプション)
fmt チャンクと data チャンクは必須項目です。それ以外のチャンクはオプションです。特に無くても問題はありません。では次に各チャンクの説明をします。
2.fmt チャンク
このチャンクは必須です。このチャンクでは格納されている波形データに関する基本パラメータが記述されています。
struct FormatChunk {
  uint32_t id;
  int32_t size;
  int16_t format;
  uint16_t channels;
  uint32_t samplerate;
  uint32_t bytepersec;
  uint16_t blockalign;
  uint16_t bitswidth;
};
struct FormatChunkEx {
  FormatChunk formatChunk;
  uint16_t extended_size;
  uint8_t extended [];
};
各フィールドの簡易説明は以下。
フィールド名 サイズ 説明
id 4 チャンク識別子 ('fmt ')
size 4 idsize を除くチャンクデータサイズ
format 2 波形データのフォーマット(後述)
channels 2 使用チャンネル数
samplerate 4 サンプリング周波数(Hz)
bytepersec 4 平均データ割合
blockalign 2 データのブロックサイズ
bitswidth 2 1 サンプルあたりのビット数
extended_size 2 拡張データサイズ
extended n 拡張データ
の様な感じです。標準的な次はそれぞれの詳細な説明を行います。
id には固定の 'fmt ' が指定されます。リトルエンディアンで格納されていますので 16 進数では 0x20746D66 になります。
format は波形データのデータフォーマットが指定されます。実際に指定される値は次のいずれかです。
定義名 説明
WAVE_FORMAT_UNKNOWN0x0000Microsoft Corporation
WAVE_FORMAT_PCM0x0001Microsoft PCM format
WAVE_FORMAT_MS_ADPCM0x0002Microsoft ADPCM
WAVE_FORMAT_IEEE_FLOAT0x0003Micrososft 32 bit float format
WAVE_FORMAT_VSELP0x0004Compaq Computer Corporation
WAVE_FORMAT_IBM_CVSD0x0005IBM Corporation
WAVE_FORMAT_ALAW0x0006Microsoft Corporation
WAVE_FORMAT_MULAW0x0007Microsoft Corporation
WAVE_FORMAT_OKI_ADPCM0x0010OKI
WAVE_FORMAT_IMA_ADPCM0x0011Intel Corporation
WAVE_FORMAT_MEDIASPACE_ADPCM0x0012Videologic
WAVE_FORMAT_SIERRA_ADPCM0x0013Sierra Semiconductor Corp
WAVE_FORMAT_G723_ADPCM0x0014Antex Electronics Corporation
WAVE_FORMAT_DIGISTD0x0015DSP Solutions, Inc.
WAVE_FORMAT_DIGIFIX0x0016DSP Solutions, Inc.
WAVE_FORMAT_DIALOGIC_OKI_ADPCM0x0017 Dialogic Corporation
WAVE_FORMAT_MEDIAVISION_ADPCM0x0018 Media Vision, Inc.
WAVE_FORMAT_CU_CODEC0x0019Hewlett-Packard Company
WAVE_FORMAT_YAMAHA_ADPCM0x0020Yamaha Corporation of America
WAVE_FORMAT_SONARC0x0021Speech Compression
WAVE_FORMAT_DSPGROUP_TRUESPEECH0x0022DSP Group, Inc
WAVE_FORMAT_ECHOSC10x0023Echo Speech Corporation
WAVE_FORMAT_AUDIOFILE_AF360x0024Audiofile, Inc.
WAVE_FORMAT_APTX0x0025Audio Processing Technology
WAVE_FORMAT_AUDIOFILE_AF100x0026Audiofile, Inc.
WAVE_FORMAT_PROSODY_16120x0027Aculab plc
WAVE_FORMAT_LRC0x0028Merging Technologies S.A.
WAVE_FORMAT_DOLBY_AC20x0030Dolby Laboratories
WAVE_FORMAT_GSM6100x0031Microsoft Corporation
WAVE_FORMAT_MSNAUDIO0x0032Microsoft Corporation
WAVE_FORMAT_ANTEX_ADPCME0x0033Antex Electronics Corporation
WAVE_FORMAT_CONTROL_RES_VQLPC0x0034Control Resources Limited
WAVE_FORMAT_DIGIREAL0x0035DSP Solutions, Inc.
WAVE_FORMAT_DIGIADPCM0x0036DSP Solutions, Inc.
WAVE_FORMAT_CONTROL_RES_CR100x0037Control Resources Limited
WAVE_FORMAT_NMS_VBXADPCM0x0038Natural MicroSystems
WAVE_FORMAT_ROLAND_RDAC0x0039Roland
WAVE_FORMAT_ECHOSC30x003AEcho Speech Corporation
WAVE_FORMAT_ROCKWELL_ADPCM0x003BRockwell International
WAVE_FORMAT_ROCKWELL_DIGITALK0x003CRockwell International
WAVE_FORMAT_XEBEC0x003DXebec Multimedia Solutions Limited
WAVE_FORMAT_G721_ADPCM0x0040Antex Electronics Corporation
WAVE_FORMAT_G728_CELP0x0041Antex Electronics Corporation
WAVE_FORMAT_MSG7230x0042Microsoft Corporation
WAVE_FORMAT_MPEG0x0050Microsoft Corporation
WAVE_FORMAT_RT240x0052InSoft Inc.
WAVE_FORMAT_PAC0x0053InSoft Inc.
WAVE_FORMAT_MPEGLAYER30x0055MPEG 3 Layer 1
WAVE_FORMAT_LUCENT_G7230x0059Lucent Technologies
WAVE_FORMAT_CIRRUS0x0060Cirrus Logic
WAVE_FORMAT_ESPCM0x0061ESS Technology
WAVE_FORMAT_VOXWARE0x0062Voxware Inc
WAVE_FORMAT_CANOPUS_ATRAC0x0063Canopus, Co., Ltd.
WAVE_FORMAT_G726_ADPCM0x0064APICOM
WAVE_FORMAT_G722_ADPCM0x0065APICOM
WAVE_FORMAT_DSAT0x0066Microsoft Corporation
WAVE_FORMAT_DSAT_DISPLAY0x0067Microsoft Corporation
WAVE_FORMAT_VOXWARE_BYTE_ALIGNED0x0069Voxware Inc.
WAVE_FORMAT_VOXWARE_AC80x0070Voxware Inc.
WAVE_FORMAT_VOXWARE_AC100x0071Voxware Inc.
WAVE_FORMAT_VOXWARE_AC160x0072Voxware Inc.
WAVE_FORMAT_VOXWARE_AC200x0073Voxware Inc.
WAVE_FORMAT_VOXWARE_RT240x0074Voxware Inc.
WAVE_FORMAT_VOXWARE_RT290x0075Voxware Inc.
WAVE_FORMAT_VOXWARE_RT29HW0x0076Voxware Inc.
WAVE_FORMAT_VOXWARE_VR120x0077Voxware Inc.
WAVE_FORMAT_VOXWARE_VR180x0078Voxware Inc.
WAVE_FORMAT_VOXWARE_TQ400x0079Voxware Inc.
WAVE_FORMAT_SOFTSOUND0x0080Softsound, Ltd.
WAVE_FORMAT_VOXARE_TQ600x0081Voxware Inc.
WAVE_FORMAT_MSRT240x0082Microsoft Corporation
WAVE_FORMAT_G729A0x0083AT&T Laboratories
WAVE_FORMAT_MVI_MV120x0084Motion Pixels
WAVE_FORMAT_DF_G7260x0085DataFusion Systems (Pty) (Ltd)
WAVE_FORMAT_DF_GSM6100x0086DataFusion Systems (Pty) (Ltd)
WAVE_FORMAT_ONLIVE0x0089OnLive! Technologies, Inc.
WAVE_FORMAT_SBC240x0091Siemens Business Communications Systems
WAVE_FORMAT_DOLBY_AC3_SPDIF0x0092Sonic Foundry
WAVE_FORMAT_ZYXEL_ADPCM0x0097ZyXEL Communications, Inc.
WAVE_FORMAT_PHILIPS_LPCBB0x0098Philips Speech Processing
WAVE_FORMAT_PACKED0x0099Studer Professional Audio AG
WAVE_FORMAT_RHETOREX_ADPCM0x0100Rhetorex, Inc.
IBM_FORMAT_MULAW0x0101IBM mu-law format
IBM_FORMAT_ALAW0x0102IBM a-law format
IBM_FORMAT_ADPCM0x0103IBM AVC Adaptive Differential PCM format
WAVE_FORMAT_VIVO_G7230x0111Vivo Software
WAVE_FORMAT_VIVO_SIREN0x0112Vivo Software
WAVE_FORMAT_DIGITAL_G7230x0123Digital Equipment Corporation
WAVE_FORMAT_CREATIVE_ADPCM0x0200Creative Labs, Inc
WAVE_FORMAT_CREATIVE_FASTSPEECH80x0202Creative Labs, Inc
WAVE_FORMAT_CREATIVE_FASTSPEECH100x0203Creative Labs, Inc
WAVE_FORMAT_QUARTERDECK0x0220Quarterdeck Corporation
WAVE_FORMAT_FM_TOWNS_SND0x0300Fujitsu Corporation
WAVE_FORMAT_BZV_DIGITAL0x0400Brooktree Corporation
WAVE_FORMAT_VME_VMPCM0x0680AT&T Labs, Inc.
WAVE_FORMAT_OLIGSM0x1000Ing C. Olivetti & C., S.p.A.
WAVE_FORMAT_OLIADPCM0x1001Ing C. Olivetti & C., S.p.A.
WAVE_FORMAT_OLICELP0x1002Ing C. Olivetti & C., S.p.A.
WAVE_FORMAT_OLISBC0x1003Ing C. Olivetti & C., S.p.A.
WAVE_FORMAT_OLIOPR0x1004Ing C. Olivetti & C., S.p.A.
WAVE_FORMAT_LH_CODEC0x1100Lernout & Hauspie
WAVE_FORMAT_NORRIS0x1400Norris Communications, Inc.
WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS0x1500AT&T Labs, Inc.
WAVE_FORMAT_DVM0x2000FAST Multimedia AG
WAVE_FORMAT_INTERWAV_VSC1120x7150?????
WAVE_FORMAT_EXTENSIBLE0xFFFE
これだけ大量にありますが、実際に確認した事のあるフォーマットは数種類だけです(;´Д`)
と言うよりメーカー製の WAVE 形式のファイルって存在するのか不明です…。
channels には波形データのチャンネル数が指定されます。これは format の種類によって使用出来る値に制限があります。標準的なモノとしてはステレオもしくはモノラルです。ステレオの場合は LRLR… の様に左チャンネルと右チャンネルが交互に格納されています。
samplerate にはサンプリング周波数が指定されます。ここには kHz ではなく Hz の値が指定されます。例えば 44.1kHz の場合ならば 44100 が指定されています。
bytepersec には秒間の平均データバイト数が指定されます。この値も format によって解釈が変化します。16 ビットステレオリニア PCM でサンプリング周波数が 44.1kHz ならば 44100x2x2 が指定されます。
blockalign にはデータのブロックサイズが指定されます。16 ビットステレオリニア PCM の場合は特にブロック単位で区切られてはいないので、チャンネル数とデータバイト数(2x2)が指定されます。他の MS-ADPCM 等ではブロック単位で圧縮されますのでこの値はそのブロックサイズが指定されます。
bitswidth には 1 サンプルあたりの使用するビット数が指定されます。16 ビットリニア PCM の場合は 16 が指定されます。MS-ADPCM では 4 ビットが指定されます。
extended_size には拡張データのサイズが指定されます。リニア PCM の場合はこの領域と exnteded は存在しません。
3.data チャンク
このチャンクは必須です。って言うか、波形データの無い WAVE ファイルって意味がわかんねぇッス。
struct DataChunk {
  uint32_t id;
  int32_t size;
  uint8_t waveformData [];
};
各フィールドの簡易説明は以下。
フィールド名 サイズ 説明
id 4 チャンク識別子 ('data')
size 4 idsize を除くチャンクデータサイズ
waveformData [] n 波形データ(サイズは可変)