DirectX Audioについて

ここでは、DirectX Audioの機能とプログラミングの概要について、簡単に解説する。

概要

DirectX Audioは、DirectXのサウンド系機能を提供するコンポーネントである。
DirectX Audioは「DirectSound」「DirectMusic」の2つの機能から構成されている。これらはDirectX7までは独立した別々の機能だった(DirectSoundはWAVEファイルを、DirectMusicはMIDIファイルを再生)が、DirectX8では機能の統合が図られ、「DirectX Audio」というカテゴリにまとめられた。

具体的にはDirectMisicが改良され、MIDIデータだけでなくWAVEデータもMIDIデータとして同様に扱うことができるようになったこれにより、オーディオを再生するプログラムを作成するユーザは、DirectMusicだけを扱えばよくなったため、プログラミングが容易になった。

機能

DirectX Audioは、主に次のような機能を提供する。

  1. MIDIやWAVEデータの再生とキャプチャ
  2. 複数のサウンドの同時再生
  3. ファイルやリソースからのサウンド・データの読み込み
  4. オーディオ・スクリプトにより再生方法の外部定義
  5. ダウンローダブル・サウンド(DLS)による実行環境に依存しない音色でのMIDI再生
  6. 3Dサウンドによる立体的な音響効果を伴った再生
  7. ピッチの変更、リバーブなどのエフェクトを加えた再生
  8. 16を超える(事実上任意)数のMIDIチャネルをサポート
  9. インタラクティブな再生

このように、DirectX Audioの機能は非常に多彩だが、ここでは赤で示した基本的な部分のみを使用する。

用語

DirectX Audioのプログラミングで使用する様々な用語について、最低限必要なものを簡単に紹介する。

▽オーディオ・データ(ソース)

DirectX Audioが再生できる基礎的なデータをオーディオ・データ(ソース)と呼ぶ。標準で扱えるデータは次のとおり。

  1. スタンダードMIDIファイル
  2. オーディオ圧縮マネージャ(ACM)でサポートされているフォーマットの圧縮されたWAVEファイル、および非圧縮WAVEファイル
  3. DirectMusic Producerなどで作られたセグメント・ファイル
  4. DirectMusic Producerなどで作られたスクリプト・ファイル

いずれの場合も、独立したファイルとしてだけでなく、リソース・データとして用意することもできる。ここではWAVEファイルとMIDIファイルを独立したファイルとして扱う方法を解説する。

▽ローダー(DirectMusicLoader8)

オーディオ・データを読み込むために使用する。ローダーはキャッシュにより検索やロードを効率よく行うことができる。通常、アプリケーションではローダーのインターフェイスをグローバルに1つだけ作成する。
オーディオ・データはファイルのほか、リソースからもロードできる。

▽セグメント

ローダーによってロードされたオーディオ・データはセグメントにカプセル化して扱う。一般に、セグメントは1つのファイルなど、再生される1つの単位をあらわす。
セグメントを再生するたびに、セグメント情報(DirectMusicSegmentState8)が作られる。このインターフェイスを通じて、セグメントの再生状態やオーディオ・パスを取得できる。

▽オーディオ・パス(IDirectMusicAudioPath8)

オーディオ・パスとは、パフォーマンスからシンセサイザへのサウンドの流れを制御するものである。オーディオ・パスにはサウンド・バッファなどの複数のオブジェクトが含まれる。オーディオ・パスに含まれているサウンド・バッファなどを操作することにより、ボリュームや各種エフェクト、3Dサウンドなどの設定が行える

▽DLSコレクション/バンド

シンセサイザが音色を再生するには、その音についての情報が必要である。その情報はDLSコレクションに格納されている。DLSコレクションはバンドに関連付けられ、バンドがダウンロードされたときにシンセサイザにダウンロードされる。

1つのシンセサイザしか使わないほとんどのアプリケーションでは、すべてのバンドをパフォーマンスにダウンロードすればよい。

▽パフォーマンス(DirectMusicPerformance8)

パフォーマンスはソースからシンセサイザまでのデータの流れ全体を管理する。通常、アプリケーションではパフォーマンス・オブジェクトをグローバルに1つだけ作成する。

▽シンセサイザ

WAVE以外のMIDIデータなどはシンセサイザでWAVEデータが作られ、再生される。DirectMusicでは、デフォルトのソフトウェア・シンセサイザとしてMicrosoft Software Synthesizerを使うことができる。

プログラミングの手順

DirectX Audioにおける再生は、次のような流れになる。

1.COMの初期化
DirectX Audioを使う前に、CoInitalize関数でCOMを初期化する。
2.パフォーマンスの作成と初期化
CoCreateInstance関数を使って、IDirectMusicPerformance8のオブジェクトを作成する。作成したIDirectMusicPerformance8のオブジェクトは、IDirectMusicPerformance8::InitAudioメソッドを使って初期化する。この際、必要に応じてデフォルトのオーディオ・パスを設定する。
3.ローダーの作成と初期化
同じくCoCreateInstance関数を使って、IDirectMusicLoader8のオブジェクトを作成する。作成したIDirectMusicLoader8オブジェクトはIDirectMusicLoader8、::SetSearchDirectoryメソッドを使ってファイルの検索パスを設定しておく。
4.セグメントのロード
作成したDirectMusicLoader8オブジェクトを使ってオーディオ・データを読み込み、オーディオ・データをカプセル化するIDirectMusicSegment8オブジェクトを作成する。必要に応じて、セグメントの作成に使うオーディオ・パスも作成しておく。
5.バンドのダウンロード
セグメントを再生するため、バンドをパフォーマンスかオーディオ・パスにダウンロードする。この結果、DLSデータがセグメントにロードされる。ダウンロードには通常、IDirectMusicPerformance8::Downloadメソッドを使う。
6.セグメントの再生/停止
IDirectMusicPerformance8::PlaySegmentExメソッドに、再生したいDirectMusicSegment8オブジェクトと、必要に応じてオーディオ・パスを指定して再生を開始する。セグメントの再生を途中で停止するには、IDirectMusicPerformance8::StopExメソッドを使う。
7.再生中セグメントの停止
プログラムを終了する前に、IDirectMusicPerformance8::Stopメソッドで再生中のすべてのサウンドの再生を停止する。その後、IDirectMusicPerformance8::CloseDownメソッドを実行してクリーンアップ処理を行う。
8.オブジェクトの開放
クリーンアップ処理の後で、確保したすべてのオブジェクトのReleaseメソッドを呼び出して開放する。
9.COMの使用終了
CoUninitialize関数でCOMの使用を終了する。

授業で使用するプログラムについて

上記処理をいちいち既存のプログラムに追加するのは面倒なので、ラッパー関数としてNKC_DAudio.cppというソースファイルにまとめた。授業ではこのファイルをプロジェクトに追加して使用することにする。
次章では、NKC_DAudio.cppの組み込み方法を解説する



NEXT(NKC_DAudio.cppファイルの組み込み)