次の方法で共有


DirectMusic でのエフェクトの使い方

DirectX は、DMO (DirectX Media Object) によるサウンドのエフェクト処理をサポートしている。すべての DirectX アプリケーションで、一連の標準エフェクトが使える。それ以外の DMO もシステムに登録できる。

Waves リバーブ以外のすべての標準 DMO は、DirectSound がサポートしている任意のサンプル レートで、1 つまたは 2 つのチャンネルを使って、8 ビットまたは 16 ビットの PCM データを処理できる。Waves リバーブは 8 ビットのサンプルをサポートしていない。

エフェクトは、オーディオパスの DirectSound バッファにアタッチされる。実行時にアプリケーションでエフェクトを追加・削除・変更するには、バッファに対するインターフェイスを取得し、DirectSound API を使わなければならない。詳細については、「エフェクトの使い方」を参照すること。

DirectMusic Producer で作成したセグメントを、オーディオパス構成を使って演奏している場合は、構成オブジェクトからオーディオパスを作成するとエフェクトが設定される。標準オーディオパスにはエフェクトも保持される。ただし、実行時にカスタム オーディオパスでエフェクトを実装したり、標準オーディオパスにエフェクトを追加したい場合がある。たとえば、標準の WAV ファイルや MIDI ファイルにエフェクトを適用できるように、標準オーディオパスにエフェクトを追加する場合である。

オーディオパスにエフェクトを適用するには、まずパス上のバッファへの IDirectSoundBuffer8 インターフェイスを取得する。次に、IDirectSoundBuffer8::SetFX を使って、そのバッファに 1 つまたは複数のエフェクトを設定する。

バッファ インターフェイスを取得する方法については、「オーディオパスからのオブジェクトの取得」を参照すること。GetObjectInPath の呼び出しで標準オーディオパス バッファを識別する方法については、「標準オーディオパス」のオーディオパスのタイプを参照すること。

次のサンプル コードでは、標準オーディオパスを設定し、パスからバッファを取得し、バッファ上でエコー エフェクトを設定している。

HRESULT SetEchoEffect(IDirectMusicPerformance8 *pPerformance,
    IDirectMusicAudioPath* p3DAudioPath,
    IDirectSoundBuffer8* pDSBuffer)
{
  HRESULT       hr;
 
  // ソース バッファと環境リバーブ バッファを使って標準オーディオパスを作成する。
  // パスをアクティブ化してはならない。
  // バッファが稼働していると、SetFX は失敗する。
 
  if( FAILED(hr = pPerformance->CreateStandardAudioPath(
      DMUS_APATH_DYNAMIC_3D, 64, FALSE, &p3DAudioPath)))
    return hr;
   
  // オーディオパスでバッファを取得する。
 
  if( FAILED(hr = p3DAudioPath->GetObjectInPath(DMUS_PCHANNEL_ALL,
      DMUS_PATH_BUFFER, 0, GUID_NULL, 0, IID_IDirectSoundBuffer8, 
      (LPVOID*) &pDSBuffer)))
    return hr;
 
  // エフェクトを記述する。
 
  DSEFFECTDESC dsEffect;
  dsEffect.dwSize = sizeof(DSEFFECTDESC);
  dsEffect.dwFlags = 0;
  dsEffect.guidDSFXClass = GUID_DSFX_STANDARD_ECHO;
  dsEffect.dwReserved1 = 0;
  dsEffect.dwReserved2 = 0;
 
  DWORD dwResults;
 
  // エフェクトを設定する。
  if (FAILED(hr = pDSBuffer->SetFX(1, &dsEffect, &dwResults)))
  {
    p3DAudioPath->Activate(TRUE);
    return hr;
  }
  // ここで dwResults の値をチェックし、
  // エフェクトが割り当てられているかどうか、またその方法を確認できる。
 
  // パスをアクティブ化する。
 
  p3DAudioPath->Activate(TRUE);
  return hr;
}