Microsoft Windows と Xbox 360 の XACT 実装の違い

シニア オーディオ スペシャリスト、Scott Selfon 著

ゲーム ディベロッパー グループ

  • はじめに
  • XACT のファイル形式とプラットフォーム
  • XACT オーサリング ツールからの配置
  • ウェーブ バンクの相違
  • その他のコンテンツおよびオーサリングに関する違い
  • XACT の初期化と試聴に関する相違
  • リソース管理に関する相違
  • リアルタイム デジタル シグナル処理と XACT
  • キューのプロパティのクエリ
  • まとめ

はじめに

Microsoft クロスプラットフォーム オーディオ作成ツール (XACT) により、サウンド デザイナーやプログラマは、Xbox 360® と Microsoft® Windows® の両方で動作するタイトルに同じコンテンツおよびコード ベースを使用できるようになります。これは、同一のバイナリ ウェーブ バンクが両方のプラットフォームで利用できるということではありません。これらのプラットフォームには違いがあります。このホワイト ペーパーでは、その相違点と、異なるターゲット プラットフォームにおける統合および配置のプロセスについて説明します。相違点だけでなく類似点についても理解することで、コンテンツをより効率的に作成し、複数のプラットフォームに迅速に配置できるようになります。

Xbox 360 開発キット (XDK) および Microsoft® DirectX® ソフトウェア開発キット (SDK) に付属する XACT ドキュメントには、このホワイト ペーパーで説明されている概念、インターフェイス、および手法の多くに関するより詳しい情報に加え、プラットフォーム間における API の相違点についてのコメントが記載されています。

XACT のファイル形式とプラットフォーム

最下位のプラットフォーム レベルにおける Windows CPU と Xbox 360 CPU 間の重要な形式上の相違点はバイト順です。Xbox 360 ではビッグエンディアン システムが、Windows ではリトルエンディアン システムが採用されています。このエンディアンの違いは、バイナリ データ ファイルを 2 つの プラットフォーム間で変換する必要があることを意味します。XACT では、特定のプラットフォーム用にコンテンツをビルドおよび配置するときに、この処理が自動的に行われますが、バイト順が異なるということは、特定の ウェーブ バンク、サウンド バンク、またはグローバル設定ファイルの他の要素がすべて同じであったとしても、両方のプラットフォームで同じバイナリ ファイルは使用できないことを意味します。

XACT オーサリング ツールからの配置

XACT では、現在の配置ターゲット プラットフォームが明確に表示され、コンテンツ作成者がターゲット プラットフォームを簡単に切り替えることができます。現在のターゲットは [表示](View) メニューで選択でき、XACT タイトル バーに表示されます。

図形 1.  XACT で現在 Windows 用のビルドを実行していることを示す 2 つのインジケーター (わかりやすくするために赤い丸を付けています)

Bb924650.wp_XACT_indicator(ja-jp,VS.85).jpg

 

さらに、XACT では、ビルドされたコンテンツのディレクトリ構造からも、ターゲットが Windows であるか Xbox であるかがすぐにわかるようになっています。デフォルトでは、Windows ベースのコンテンツはすべて "Win" ディレクトリに配置され、Xbox 360 ベースのコンテンツはすべて "Xbox" ディレクトリに配置されます。これらの設定は、プロパティ ページで確認することができ、必要に応じて特定のウェーブ バンクやサウンド バンクに合わせて変更することもできます。

図形 2.  Wave バンクの Windows および Xbox 360 用の配置プロパティ。ファイル名は同じです (必ずしも同じである必要はありません)。この 2 つのバージョンは、Win フォルダーと Xbox フォルダー (現在のプロジェクト ファイルのパスを基準とする相対ディレクトリ) に配置されます。

Bb924650.wp_wave_bank_deploy(ja-jp,VS.85).jpg

ウェーブ バンクの相違

Xbox 360 用 XACT と Windows 用 XACT の間の最も明白な相違として、圧縮ターゲットが挙げられます。Xbox 360 は、プラットフォーム固有の XMA 形式のためのカスタム ハードウェアを備えているため、ほとんどの (もしくはすべての) Wave コンテンツが必然的に Xbox 360 上で XMA 圧縮されます。Windows では、ハードウェアによる圧縮システムがなく、XMA で複数の音声を扱うと負荷が非常に高くなります。したがって、多くの場合 Windows では処理負荷の低い ADPCM (Adaptive Differential Pulse Code Modulation) 形式が利用されます。

既定では、XACT Wave コンテンツにはどちらのプラットフォームでも PCM が使用されます (ただし繰り返しになりますが、エンディアンは配置プラットフォームによって変わります)。圧縮の設定には、XACT 圧縮プリセットを使用できます。

図形 3.  [圧縮プリセット](Compression Presets) プロジェクト ツリー ノードを右クリックし、[新規圧縮プリセット](New Compression Preset) をクリックして圧縮プリセットを作成する

Bb924650.wp_compression_presets(ja-jp,VS.85).jpg

 

コンテンツ作成者は、Xbox 360 と Windows に対して別個のターゲット形式を設定できます。ここで、最初の相違点が明白になります。

機能 XMA (Xbox 360) ADPCM (Windows)
圧縮レベル ユーザーが品質設定 (1 ~ 100 の範囲) を指定して、圧縮率と効果のバランスを調整できます。 "ブロックあたりのサンプル数" で、ある程度の圧縮制御 (ヘッダー データの周波数) を行うことができます。おおまかに 3.5:1 ~ 3.9:1 の間の比率で圧縮が行われます。
ループ ポイント コーデックが、ループ ポイントを (サンプル補間/デシメーションを介して) 必須の 128 サンプル境界に自動的に "固定" します。 ユーザーは、ブロックあたりのサンプル数設定に合わせて Wave ループ ポイント (または最初から最後までのループの場合は全長) を手動でオーサリングする必要があります。
マルチチャンネル マルチチャンネル PCM Wave (WAVEFORMATEX) は XMA 圧縮できます。(注 : 現在、マルチチャンネルに関しては、XMA2 形式の採用は保留中であり、最初から最後までのループのみがサポートされています。) 現在、モノラルおよびステレオのみがサポートされています。

圧縮以外には、Xbox 360 用 ウェーブ バンクと Windows 用 ウェーブ バンクとの間にオーサリング上の相違はありません。どちらのプラットフォームでも、AIFF および PCM ソースが任意のサンプリング レートでサポートされます。Wave バンクのストリーミングに関しては、2 つのプラットフォームによる相違はありません。Windows 上でストリーミングを行う場合、ハード ドライブからでも光ディスクからでも特別な形式の変更や設定は必要ありません。

その他のコンテンツおよびオーサリングに関する違い

コンテンツ作成者がはっきり認識できるオーサリングに関する相違点は、他にはあまりありません。当然のことながら、Xbox 360 XMA コンテンツを試聴するには、Xbox 360 開発キットまたはテスト キットに搭載されている XMA ハードウェアが必要になります。逆に、ADPCM 圧縮されたコンテンツを試聴するには、Windows XACT エンジン上でのローカルな試聴が必要になります。PCM ターゲットのオーディオ データは両方のプラットフォームで等しく試聴できます。

プラットフォーム間で考えられるもう 1 つの違いは、リバーブの使用に関する点です。これについては、プログラマの視点から以降詳しく説明します。Xbox 360 タイトルでは、XAudio によって作成されたリバーブに加え、他のデジタル シグナル処理 (DSP) エフェクトも使用することができます。Windows ベースのタイトルでは、現在、コンテンツ作成者によって作成されたリバーブのみに制限されており、他の DSP エフェクトは利用できません。それぞれのプラットフォームで CPU のパフォーマンスは異なっても、リバーブ エフェクト自体は音響上同一である点に注目してください (提供されるのは Eventide の 2016 リバーブと同じアルゴリズムを採用しさらに強化が加えられた Princeton Digital 2016/360 リバーブです)。

XACT の初期化と試聴に関する相違

Audio Console アプリケーション (Xbox 360 用および Windows 用) による試聴に関しては、Xbox 360 では視覚エフェクトと統計情報が表示され、Windows バージョンでは表示されないという違いがあるものの、実質的にはどちらのプラットフォームでも同じです。XACT ライブラリを使用してコンパイルされたタイトルに接続してリアルタイム試聴を実現する方法は、2 つのプラットフォームで多少異なります。Xbox 360 で静的にリンクされるライブラリを使用する場合、コンテンツに接続して試聴/監視するには xacta.lib または xactad.lib ("a" は試聴 (auditioning) のサポートを示します) を使用してタイトルを明示的にリンクする必要があります。Windows の場合、エンジンのインスタンス化呼び出しである XACTCreateEngine を使用して、このエンジン インスタンスでの試聴を有効にするかどうかを指定するフラグ (XACT_FLAG_API_AUDITION_MODE) を渡すことができます。

当初、Xbox 360 用の XACT には、"フラットな" XACT 初期化呼び出しである XACTInitialize が用意されていました。Windows (および Xbox 360) では複数のインスタンスを使用できるため、この関数は Windows ではサポートされていません。したがって、この関数を新しい Xbox 360 タイトルで使用することはできません。代わりに、XACTCreateEngine 呼び出しを使用してユーザーが 1 つまたは複数の XACT エンジン インスタンスを設定できるようにした後、IXACTEngine::Initialize を使用して特定のエンジン インスタンスを構成します。これらの呼び出しは、両方のプラットフォームでサポートされています。

Windows ベースのデバイスでは複数のオーディオ レンダラーが共存できるため、Windows には Xbox 360 のような単独のオーディオ レンダラーには不要な拡張メソッドが複数あります。IXACTEngine::InitializepRendererID パラメーターを受け取り、これによって、どのデバイスでこの特定の XACT エンジン インスタンスを再生するかをタイトルで指定できます。Xbox 360 ではこのパラメーターは無視されます。

Windows でのみ利用できるこれらの追加インターフェイスを使用すると、使用できるレンダラーおよびそのプロパティをタイトルで確認できます。

メソッド 説明
IXACTEngine::GetRendererCount システムで検出されたオーディオ レンダラーの数を返します。
IXACTEngine::GetRendererDetails 渡されたインデックスで識別されるオーディオ レンダリング デバイスに関する詳細を返します。

リソース管理に関する相違

Windows 用 XACT と Xbox 360 用 XACT のどちらでも、それぞれのタイトルで使用されるメモリー システム割り当て方法に加えて、プラットフォームによって最適化されたメモリー システム割り当てがサポートされます。XACT によってタイトルのメモリーが自動的に解放されるシナリオ (たとえば XACT_FLAG_API_CREATE_MANAGEDATA がエンジン初期化処理または Wave バンクの作成処理に渡されたときなど、タイトルによって指定されている場合のみ) では、このようなプラットフォーム固有のメモリー システムの割り当てを使用する必要があります。

Xbox 360:  Xbox 360 では、メモリーを XMemAlloc によって割り当てます。

Windows:  Windows プラットフォームでは、メモリーを CoTaskMemAlloc によって割り当てます。

リアルタイム デジタル シグナル処理と XACT

Xbox 360:  XACT では、コンテンツ主導型の基本的なリアルタイム DSP がサポートされます。現在、XACT でサポートされているグローバル リバーブは 1 つだけで、サウンド デザイナーだけがグローバル リバーブを主導できます (つまり、コンテンツ側で変更をリバーブに適用する必要があるということで、これは実装が困難です)。Xbox 360 では低レベルの XAudio ライブラリに (グローバルな DSP 処理、サウンド単位の DSP 処理、および任意のサブミックス DSP 処理が可能な) フル装備の DSP パイプラインが用意されているため、Xbox 360 には、Windows 用にはない XACT 拡張機能があります。現在、Windows 上での DSP は、単独のリバーブによるネイティブ XACT DSP のサポートだけに制限されています。

次の表に、XACT で DSP エフェクトを使用するためのメソッドを示します。これらのメソッドは、Xbox 360 上でのみ使用できます。

メソッド 説明
IXACTCue::SetVoiceOutput キューの出力を最大 3 つの XAudio 音声に転送します。
IXACTCue::SetVoiceOutputVolume IXACTCue::SetVoiceOutput で以前に設定された音声のボリュームを調整します。

同様に、XAudio ライブラリにおける任意の DSP と信号ルーティングのサポートにより、Xbox 360 用 XACT では、X3DAudio ライブラリを 3D 配置シミュレーション用に利用できます。たとえば、リアルタイムの距離ベースのフィルターが、閉鎖フィルターおよび障害物フィルターに加えて利用できます。

XACT 固有の DSP 機能およびこれらの Xbox 拡張機能の詳細については、『XACT 3D とリバーブの統合』ホワイト ペーパーを参照してください。

キューのプロパティのクエリ

Xbox 360 のローンチ タイトルでのニーズに応えて、XACT キュー インスタンス オブジェクトの透過性が高まりました。キュー インスタンスのクエリを使用することで、オフライン (またはゲーム内) XACT プロジェクト ファイル分析/解析を確立したり、サウンド デザイナーとプログラマの間で大規模な情報交換をしたりする必要がなくなります。また、たとえばどのバリエーション設定が選択されたかといった、オーサリング時にはわからない情報をゲームで判定することが可能になります。たとえばマルチトラック サウンドの最初のトラックに制限されていたり、必ずしもすべてのオブジェクト データが示されるわけではないなど、この情報は不完全なため、Windows では現在このクエリは公開されていません。より多くのキュー インスタンス状態情報が表示されるような、より完全で洗練されたソリューションはまだ完成していません。

次の表に、XACT でキュー インスタンス情報をタイトルに返すためのメソッドを示します。このメソッドは、Xbox 360 上でのみ使用できます。

メソッド 説明
IXACTCue::GetProperties キューのプロパティを取得します。

まとめ

これまでいくつかの一意なメソッドとコンテンツの相違点について説明してきましたが、XACT によるオーサリングとその使い方はどちらのプラットフォームでもほぼ同じです。個別の圧縮ターゲットを設定すること以外、ほとんどのコンテンツ作成者およびプログラマは、Xbox 360 と Windows の間で違いをほとんど認識しないでしょう。さらに、XACT は両方のプラットフォームのソフトウェア レイヤーであるため、新しく公開される機能でも、このレベルの機能および API の同等性が保たれます。