気温がかなり上がってきましたね。私の好きな季節は「冬」なので、だんだんと嫌~な季節と言えます。何が嫌かというと、暑さがです。女性は涼しげな服装が出来て羨ましいのですが、私は仕事上お会いする方々の関係で常にスーツです。霞が関に終日いるような場合は涼しい服装で行きますが、あまり崩したくない私はどうしても人よりは暑く感じる服装になってしまいます。
さて、音データを作成して再生する方法について紹介していきたいと思います。Windowsに限ったことではありませんが、多くのシステムが音データのフォーマットとしてRIFF (Resource Interchange File Format)を使用しています。このフォーマットは、WAVEデータの他に様々なマルチメディアデータのフォーマットとして使用されています。
具体的には、データの先頭にあるヘッダーの中で何のデータをなのかを示す識別子があり、これにより判別します。
以下は、この後に紹介しるWAVEファイルを生成するプログラムの中で定義しているヘッダーの構造体です。
[StructLayout(LayoutKind.Sequential, Pack = 1)]
protected struct WaveHeader
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] RiffIdentifier;
public uint TotalSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] WaveIdentifier;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] FormatDefinition;
public uint FormatSize;
public ushort FormatID;
public ushort ChannelCount;
public uint SamplingRate;
public uint DataRate;
public ushort BlockSize;
public ushort SamplingSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] DataIdentifier;
public uint DataSize;
}
RiffIdentifierには常に”RIFF”をASCII文字のバイトコードでセットします。また、ここで使用するのはWAVEデータなので、WaveIdentifierには、”WAVE”を同じくASCII文字のバイトコードでセットします。この他、把握しておいた方が良いのは、FormatIDでしょうか。FormatIDは、PCMデータのフォーマットの種類を示す数字です。例えば、PCMであれば0x0001、ADPCM(G.723)であれば、0x0014といった具合です。他のIDに興味のある方は、Windows SDK、Visual Studioとともにインストールされるmmreg.hファイルを探してみてください。「WAVE form wFormatTag IDs」として一覧がまとめてあるので参考になると思います。
この他、SamplingRateは44,100が一般的に使用されています。これはCDのサンプリングレートと同じですね。ChannelCountは、モノラルなら1、ステレオであれば2といったように、音源数をセットします。この中で厄介なのが、DataRate、DataSizeでしょうか。
DataRateは、この名前の通り転送レートです。ステレオ、サンプリングレートが44,1KHz、サンプリングサイズが16ビットの場合は、2[チャンネル] x (16 / 8 [ビット]) x 44100となります。8[ビット]で割っているのは、転送レートがバイト単位。一方で、サンプリングサイズはビットなので、8で割ってバイトに変換をしています。
DataSizeは、WaveHeaderのサイズにその後に続くデータサイズを足したものとなります。逆に言えば、データサイズが確定しないことには、この情報は確定しないということになります。リアルタイムで録音するようなアプリの場合は、録音終了後にヘッダー情報を更新しなくてはなりません。
次回は、正弦波を作ってデータとして書き出すコードを見てみたいと思います。