解説 wave ファイルフォーマット (1)

waveファイルフォーマットについてまとめたドキュメントを作ろうと思うのだけど、
なかなか一気に作ることができないので、
細かい部分はきちんとドキュメントとしてまとめるときに記述するとして、
とりあえず基本的な部分をblogにまとめていってみようとおもう。

一通り解説が終わったら、それを基にまとめてドキュメントにするし、
補完する内容をまたblogで書いていくと。

今回は wave ファイルフォーマットの概要から。
wave ファイルフォーマットは、リトルエンディアンを前提としている。
Intel系のCPUを使うPCでは、特にそのあたりを意識する必要はない。
従ってPOWER系などビッグエンディアンなCPUで動くプログラムを作るときには、変換する必要がある。


wave ファイルフォーマットは、チャンク方式のファイル構造をしている。

チャンク方式というのは、様々なデータをその種類などでチャンクという固まりにして、チャンクを寄せ集めてひとつのファイルにするもの。
プログラミング的にわかりやすく言えば、構造体の集まりに近いだろうか。
構造体を複数集めて、大きな構造体を作る。その基になっている構造体がチャンクで、大きな構造体がファイル。
構造体はわかりやすく例えであって、実際のプログラミングはそのまま上手くいくわけではないが、考え方としては似ている。

チャンクは構造体として定義できるものが多いが、可変サイズなメンバーがいるので、
例えばmemcpyなどで決まった処理で取得できるというわけではない。

チャンクは、4バイトのIDがあり、その後に各種データが続く構造になっている。
そのため、waveファイルそのものが1つのチャンクでもあるといえる。

多くのチャンクでは、IDの後にそのチャンクのサイズが記述されている。
その場合、そのサイズの後に続くデータの総計サイズが記述されている。

先ほども書いたように、waveファイル自体が一つの大きなチャンクでもある。
また、waveファイルフォーマットは、RIFFファイルフォーマットの1種である。

waveファイルフォーマットの構造は以下のようになっている。

 __________________________
| RIFF WAVE Chunk |
| groupID = 'RIFF' |
| riffType = 'WAVE' |
| __________________ |
| | Chunk | |
| |__________________| |
| __________________ |
| | Chunk | |
| |__________________| |
|__________________________|

groupIDは、必ず 'RIFF' となる。
riffTypeは、必ず 'WAVE' である。

Chunk部分にはいろいろなチャンクが格納される。
必須のものと、任意のものとがある。

必須チャンク
  • Format Chunk
  • Sound Data Chunk

任意チャンクの主なもの
  • Cue Chunk
  • Playlist Chunk
  • Associated Data List
  • Sampler Chunk
  • Instrument Chunk

wave ファイルに格納される各chunkの順番には、特に決まりはない。
ただし、Format ChunkがSound Data Chunkより前にないといけないということだけが唯一の例外になる。
つまり、groupID、riffTypeの後は、Format ChunkがSound Data Chunkより前にあるということ以外、順番は不明であるということ。
最初にSampler Chunkがあるかもしれないし、Format Chunkがあるかもしれない。

プログラムで wave ファイルを読み込むときには、groupIDが 'RIFF' であるか確認し、riffType が 'WAVE' であるか確認し、
その後は、チャンクのIDが何か調べて、チャンクIDに従って適切に処理することになる。


次回は Format Chunk について

カテゴリ:

関連する記事

この記事に関連する記事は、0 件です。

トラックバック

このブログ記事に対するトラックバックURL
http://fakelife.info/mt/system/mt-tb.cgi/49

コメントする


画像の中に見える文字を入力してください。