Wavファイルのフォーマットと読込

はじめに

ここでは音声ファイルであるWAVファイル(.wav)のフォーマットの説明と簡単な読込サンプルについて解説しています。
WAVファイルについては、「wav フォーマット」などで検索するとすでに他のサイトでも解説されていますので、簡単に説明します。

WAVファイルのフォーマット

WAVファイルはRIFFファイル形式をとっています。
RIFFファイル形式では、そのファイルに必要なデータをチャンクと呼ばれるブロックに分けて保存し、チャンクにFourCCと呼ばれる4Byteの識別子(ID)を付けて管理するファイル形式です。

RIFFファイルについては下記に簡単に記載しております。必要に応じてご参照ください。

今回作成するWAVファイルの読み込み関数のサンプルはこちらからダウンロードできます。 → riffsample_20231210
※Wavファイル以外にもSoundfontファイル読込サンプルなども同梱されています。

WAVファイルのチャンク

WAVファイルのチャンクと階層構造は下記となっています。各チャンクの詳細は後述します。
2つの必須チャンクがあります。

チャンク名 タイプ 必須
/任意
チャンク識別子
(ファイル/LIST識別子)
概要
RIFFチャンク RIFF 必須 RIFF(WAVE) RIFFチャンク、ファイル識別子は「WAVE」となる。
fmt チャンク 一般 必須 fmt
(「fmt 」の最後に空白があるので注意)
音声波形データ(後述のdataチャンク)のデータ形式情報が保存されたチャンク
dataチャンク 一般 必須 data 音声波形データが保存されたチャンク

WAVファイルの各チャンクの説明

WAVファイルの各チャンクについて説明いたします。

fmtチャンク

概要 音声波形データ(後述のdataチャンク)のデータ形式情報が保存されたチャンクになります
必須・任意 必須 チャンクサイズ 16Byte固定
データ部 データ部には下記 構造体が入ります。

(WORD型はunsigned short、DWORD型はunsinged longの再定義となります。)

変数名 意味
WORD formatid 音声波形データ(後述のdataチャンク)のフォーマット形式(圧縮形式)。
「1」(リニアPCM)以外は圧縮等がされている。
WORD chunnelnum 音声波形データのチャンネル数。モノラルなら「1」、ステレオなら「2」となる。
DWORD samplerate 音声波形データのサンプリングレート。44,100Hzなら44100となる。
DWORD datarate 音声波形データの1秒当たりのデータサイズ。
「samplerate * (bitrate / 8bit) * chunnelnum」で算出する。(「samplerate * blocksize」でも可。)
WORD blocksize 音声波形データの1サンプルあたりのデータサイズ。
「(bitrate / 8bit) * chunnelnum」で算出する。
WORD bitrate 音声波形データのビットレート。16bitなら16となる

dataチャンク

概要 音声波形データが保存されたチャンクになります。
必須・任意 必須 チャンクサイズ 音声波形データのサイズになります
データ部 データ部は、fmtチャンクのformatid・chunnelnum・bitrateの内容によって変わります。
formatidが「1」(圧縮されていない音声波形)の場合、下記のようになります。

【例】

fmtチャンクの内容 chunnelnum bitrate 内容
モノラル 8bit 1 8 char型の配列。配列サイズはチャンクサイズと同じ。
モノラル 16bit 1 16 short型の配列。配列サイズはチャンクサイズと同じ。
モノラル 24bit 1 24 3Byteデータ型の配列(C/C++で標準の型はない)。配列サイズはチャンクサイズと同じ。
ステレオ 8bit 2 8 下記 構造体の配列。配列サイズはチャンクサイズの半分。
ステレオ 16bit 2 16 下記 構造体の配列。配列サイズはチャンクサイズの半分。

WAVファイル読み込みサンプル

WAVファイルの読み込みの流れは

  1. fmtチャンクを読み込む
  2. fmtチャンクの内容に合わせてdataチャンクの内容を読み込む

となります。

下記に「44,100Hz 16bit 非圧縮 モノラルorステレオ」のWAVファイルを読み込む関数のサンプルコードを記載します。
説明についてはコード内に記載しているので割愛します。

なお、WAVファイルの読み込みには下記のRIFFの読込を行うクラスを使用していますので、下記もご参照ください。

WAVファイルの読み込み関数のサンプルはこちらからもダウンロードできます。 → riffsample_20231210
※Wavファイル以外にもSoundfontファイル読込サンプルなども同梱されています。

【readWavFile.h】

上記の関数ででWAVファイルを読み込むことができます。
VSTなどで利用するのであれば、下記のようにして32bit浮動小数点型(float)などに変換します。

最後に

WAVのファイルフォーマットとそれぞれのチャンクについての説明は以上になります。

今回作成したWAVファイルの読み込み関数のサンプルはこちらからダウンロードできます。 → riffsample_20231210
※Wavファイル以外にもSoundfontファイル読込サンプルなども同梱されています。

他のファイルの読み込みなどはリンクはこちらにまとめております → メディアファイルの取り扱い

質問はコメント欄や掲示板Twitterでいただけばとおもいます。
また、「この部分を詳しく」などの要望も掲示板Twitterでいただければと思います。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp


コメントを残す