カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

WAVEFORMATEX構造体

このセクションではWAVEFORMATEX構造体の使い方について解説します。

以下にWAVEFORMATEX構造体のコードを示します。

typedef struct tWAVEFORMATEX
{
    WORD        wFormatTag;         /* format type */
    WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */
    DWORD       nSamplesPerSec;     /* sample rate */
    DWORD       nAvgBytesPerSec;    /* for buffer estimation */
    WORD        nBlockAlign;        /* block size of data */
    WORD        wBitsPerSample;     /* number of bits per sample of mono data */
    WORD        cbSize;             /* the count in bytes of the size of */
                                    /* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;

各構造体のメンバーについて解説します。

フォーマットタグ

    WORD        wFormatTag;         /* format type */

フォーマットタグはウェーブデータがどのような形式で格納されているのかを指定します。

代表的なものに非圧縮のPCM形式があります。これはA/Dコンバーターの出力を何の加工もせず、そのまま記録したものです。8Bitや16Bitなどの整数で表現されます。データサイズが大きくなる欠点がありますが、再生・演算・表示などすぐに使えるため多用されます。

また波形を高精度で表現したい場合、float(単精度浮動小数点)を用いることも可能です。浮動小数点を用いる場合、最大最小を±1.0の範囲で表現します。

圧縮形式としては電話などで用いられる、A-law・μ-law形式などがあります。これはレベル軸を対数で圧縮したもので、小さな音の音質が改善されます。

圧縮形式には様々な方式が提案されていて“mmreg.h”の中に数多くのタグが定義されています。個々の圧縮フォーマットの詳細は、本書の範囲を超えるので扱いません。

フォーマットタグの一例を示します。これらは、“mmsystem.h”および、“mmreg.h”の中で、以下の用に定義されています。

シンボル コード 意味
WAVE_FORMAT_PCM 0x0001 PCM
WAVE_FORMAT_IEEE_FLOAT 0x0003 float
WAVE_FORMAT_ALAW 0x0006 8-bit ITU-T G.711 A-law
WAVE_FORMAT_MULAW 0x0007 8-bit ITU-T G.711 μ-law
WAVE_FORMAT_EXTENSIBLE 0xFFFE サブフォーマットで定義
詳しくはセクション「WAVEFORMATEXTENSIBLE構造体」を参照して下さい。

チャネル数

    WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */

チャネル数を示します。同時再生すべきデータの数です。以下に例を示します。

チャネル数 意味
1 モノ
2 ステレオ
4 4チャンネルステレオ
6 5.1チャンネル
8 7.1チャンネル

従来はモノとステレオしかありませんでしたが、近年サラウンドステレオなど多チャンネルステレオが普及してきました。多チャンネルを扱うにはスピーカーの位置指定など特別なコードが必要です。

詳しくはセクション「多チャンネルステレオ」を参照して下さい。

サンプリング周波数

    DWORD       nSamplesPerSec;     /* sample rate */

サンプリング周波数です。単位は、Hz。

詳しくはセクション「サンプリング周波数」を参照して下さい。

データ転送量

    DWORD       nAvgBytesPerSec;    /* for buffer estimation */

1秒当たりのデータ転送量です。以下の計算式で求めることができます。単位は、Byte。1秒の音を録音・再生するためにnAvgBytesPerSecバイトのバッファが必要となります。

    nAvgBytesPerSec = nSamplesPerSec * nChannels * wBitsPerSample / 8;

ブロックアライン

    WORD        nBlockAlign;        /* block size of data */

1サンプル点のデータが途中で分割されないための最小単位です。また、1サンプル点のデータを収容するのに必要なメモリサイズをも意味します。単位は、Byte。

nBlockAlignには以下の関係があります。

    nBlockAlign = nChannels * wBitsPerSample / 8;

nBlockAlignに関して次の点に注意して下さい。

コンテナサイズ

    WORD        wBitsPerSample;     /* number of bits per sample of mono data */

1チャネル当たり1サンプル点のデータを収容するのに必要なメモリサイズです。単位は、Bit。必ず8の倍数でなければなりません。PCMの場合、8Bit、16Bit、24Bit、32Bitなどが用いられます。圧縮方式によってはこの数値が定数で表現できない場合もあり、その場合wBitsPerSampleがゼロという設定も可能です。

wBitsPerSampleの解釈には歴史的な経緯があります。詳しくはセクション「コンテナサイズと有効データサイズ」を参照して下さい。

拡張サイズ

    WORD        cbSize;             /* the count in bytes of the size of */

WAVEFORMATEX構造体を拡張する場合、追加するエリアのサイズを指定します。単位は、Byte。WAVEFORMATEXTENSIBLEの場合、cbSizeは22になります。またPCM方式は拡張エリアを必要としないので、cbSizeはゼロとします。

WAVEFORMATEX構造体の拡張については、セクション「WAVEFORMATEX構造体とWAVEFORMATEXTENSIBLE構造体」を参照して下さい。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ