ADPCM の概要
ADPCM (Adaptive Differential Pulse Code Modulation) は非可逆圧縮フォーマットであり、圧縮の際に一部のデータが変更され、失われます。ADPCM では、最大 4:1 の圧縮率を実現できます。
XACT および XAudio2 向けの ADPCM の実装には、圧縮サンプル ブロックのサイズを指定する追加機能が提供されています。ADPCM により、オーディオ デザイナーは、サイズ、品質、および変換 (ループ ポイントの配置用) の間で適切に条件を満たした設定を選択できるようになります。
XACT および XAudio2 では、カスタムのサンプル ブロック サイズを提供するために必要な、拡張データ形式をサポートする Microsoft ADPCM コーデックの変更バージョンが使用されています。このような理由から、このバージョンの ADPCM コーデックをサポートしていないオーディオ エンジンでは、XACT および XAudio2 オーディオ データを再生できません。
Windows: ADPCM 圧縮は現在、Windows (XNA Game Studio Express の Windows デプロイメントなど) でのみ使用できます。
ADPCM エンコーディング
オーディオ データは、XACT または AdpcmEncode コマンドライン ツールを使用して、ADPCM にエンコードされます。
XACT
XACT GUI で Wave バンクを作成するときにオーディオ ファイルを ADPCM として自動的にエンコードすることができます。圧縮プリセットを使用して、ADPCM 圧縮を Wave または Wave バンクに適用します。オーディオ データを XACT 用の ADPCM としてエンコードする方法については、「圧縮の事前設定」を参照してください。
AdpcmEncode
オーディオ ファイルを XAudio2 用 ADPCM としてエンコードするには、AdpcmEncode コマンドライン ツールを使用します。
ADPCM デコード
Windows では、XACT と XAudio2 の両方で ADPCM のソフトウェア デコードがサポートされています。
XACT
XACT でサポートされるすべてのエンコーディング フォーマットは、同じ方法でロードおよび再生されます。ADPCM でエンコードされている Wave または Wave バンクを処理する際に、標準のウェーブの再生で追加の手順は必要になりません。XACT でのサウンドのロードおよび再生の例については、「方法 : XACT でのサウンドの再生」を参照してください。
XAudio2
XAudio2 で ADPCM エンコードされたデータを使用するには、ソース ボイスの作成時に、ADPCM 固有の値で ADPCMWAVEFORMAT 構造体を初期化し、それを引数として IXAudio2::CreateSourceVoice に渡す必要があります。XAudio2 でのサウンドのロードおよび再生の例については、「方法 : XAudio2 によるサウンドの再生」を参照してください。
パラメーター
SamplesPerBlock
ADPCM 圧縮は、波形を "ブロック" に分け、各ブロック内の波形のサンプルのバリエーションを予測することで行われます。ブロックのサイズはサンプル単位で数えられます。最小ブロック サイズは 32 サンプルで、最大ブロック サイズは 512 サンプルです。
"ブロック" のサイズが大きいほど圧縮率は高くなり、ファイル サイズはより小さくなりますが、それと引き換えに、サウンド品質が低下し、ループ ポイント調整のための変換が必要になります。
通常、SamplesPerBlock の値を変更する際には、次の取捨選択が必要になります。
SamplesPerBlock の値 | ファイル圧縮 | サウンド品質 | ループ ポイント変換 |
---|---|---|---|
増加 (最大 512) | 増加 | 低下 | 低下 |
低下 (最小 32) | 低下 | 増加 | 増加 |
制限
ADPCM は、交互に並べられたサンプル "ブロック" を使用するため、ADPCM で圧縮された Wave は不完全で、"部分的" なブロックでしかありません。部分的なブロックによって、Wave のループがシームレスでなくなる可能性があるため、ADPCM デコーダーは、この部分的なブロックの残りとして無音を生成します。
XACT で ADPCM 圧縮を使用して Wave を適切にループするには、Wave の長さおよび Wave データのループ ポイントがサンプル ブロックのサイズと一致している必要があります。Wave オーサリング パッケージのほとんどで、Wave の長さおよびループ ポイントをサンプル ブロックに合わせることができます
SamplesPerBlock パラメーターの値は、Wave データおよびループ ポイントを調整する変換に影響します。
未調整の Wave に圧縮を適用しようとすると、ループする再生イベントで Wave が使用されているかどうかによって、エラーまたは警告が表示されます。ループする再生イベントで使用されている Wave は、圧縮できません。ループする再生イベントから Wave を削除し、再度圧縮を適用してください。
適切に調整済みの Wave に ADPCM 圧縮を適用した場合には、調整されていない状態にするように Wave を再編集します。XACT は、警告なしで Wave から ADPCM 圧縮を削除します。さらに、適切にブロックが調整されるように Wave ファイルを再編集し、その Wave ファイルを含む XACT プロジェクトを再度読み込んだ場合、ADPCM 圧縮がまだ適切に適用されていないことを示す警告を表示します。適切に機能するよう復元するには、Wave バンクの Wave を再スキャンします。
Wave がループしないモードでのみ使用される場合、この制限は適用されません。ループする再生イベントの Wave 部分を作成する XACT ツールで変更が行われると、警告が表示され、Wave から圧縮を削除するか、サンプル ブロックを調整するよう Wave を再編集しなければ、ループできなくなります。
XACT では、ADPCM 圧縮を使用する Wave は 128 サンプル以上の長さで、128 サンプル未満の長さのループを含まず、サンプル レートが 1 ~ 50 kHz である必要があります。
ADPCM ファイル構造
ADPCM ファイルは、次のチャンク タイプを含む標準の RIFF ファイルです。
チャンク FCC | 説明 |
---|---|
RIFF | データ セクションの最初の 4 バイトに値 WAVE のファイル タイプを含む標準の RIFF チャンクと、残りのデータ セクションにファイルの内容を含むその他のチャンク。 |
fmt | ADPCM ファイルのフォーマット ヘッダーを格納します。このチャンクのデータは、ADPCMWAVEFORMAT 構造体に対応します。Xbox 360 上では、fmt チャンクからロードされたデータは、バイト スワップして Windows と Xbox 360 間のエンディアンの差異を相殺する必要があります。 |
data | エンコード済みの ADPCM オーディオ データを格納します。XAudio2 で ADPCM を使用する場合、データ チャンクの内容がバッファーに読み込まれ、XAUDIO2_BUFFER 構造体の pAudioData メンバーとしてソース ボイスに渡されます。データ チャンクの内容は、バイト スワップする必要はありません。 |
smpl および wsmp | ADPCM ファイルのループ情報を含むオプションのチャンク タイプ。XAudio2 で ADPCM を使用する場合、smpl または wsmp チャンクに含まれる値を使用して、XAUDIO2_BUFFER 構造体の LoopBegin、LoopLength および LoopCount メンバーにデータを入力します。Xbox 360 上では、smpl チャンクからロードされたデータは、バイト スワップして Windows と Xbox 360 間のエンディアンの差異を相殺する必要があります。 |
XAudio2 で RIFF ファイルからのデータを解析およびロードする例については、「XAudio2 BasicSound サンプル」を参照してください。XACT で ADPCM ファイルをロードする場合、ファイルのロードおよび解析の詳細は、XACT エンジンで処理されます。詳細については、「方法 : XACT でのサウンドの再生」を参照してください。