次の方法で共有


方法 : エフェクト チェーンの作成

このトピックでは、エフェクト チェーンをボイスに適用することで、そのボイスのオーディオ データのカスタム処理を可能にする方法について説明します。ここでは、XAudio2 の組み込みエフェクトの 1 つであるリバーブ エフェクトを使用します。

ボイスにエフェクトを適用する基本のエフェクト チェーンを作成するには

  1. エフェクトを作成します。

    この例では、XAudio2CreateReverb 関数を使用してリバーブ エフェクトを作成します。

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. データを XAUDIO2_EFFECT_DESCRIPTOR 構造体に入力します。

    チェーンに複数のエフェクトがある場合、各エフェクトには XAUDIO2_EFFECT_DESCRIPTOR 構造体が必要です。

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. データを XAUDIO2_EFFECT_CHAIN 構造体に入力します。

    ここでは、チェーンにあるエフェクトは 1 つのみです。チェーンに複数のエフェクトがある場合には、EffectCount メンバーにはエフェクトのカウントが格納され、pEffectDescriptors メンバーはXAUDIO2_EFFECT_DESCRIPTOR 構造体の配列を指します。

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. SetEffectChain 関数を使用して、エフェクト チェーンをボイスに適用します。

    エフェクト チェーンは、マスター ボイス、ソース ボイス、およびサブミックス ボイスに適用できます。

    pVoice->SetEffectChain(&chain);
    
  5. IUnknown::Release によりエフェクトを解除します。

    XAPO が作成されると、そのリファレンス カウントは 1 になります。SetEffectChain により XAPO が XAudio2 に渡されると、XAudio2 で XAPO のリファレンス カウントがインクリメントされます。クライアントの XAPO へのリファレンスが解放されると、XAudio2 で XAPO の所有権を取得可能になります。XAudio2 に XAPO への参照しか存在しない場合、XAudio2 で使用されなくなるとそれは破棄されます。クライアント コードで XAPO への参照を維持する必要がある場合 (たとえば、後で再利用する場合など)、この手順は省略してください。

    pXAPO->Release();
    
  6. エフェクトに関連付けられているパラメーター構造体がある場合は、入力します。

    リバーブ エフェクトは、XAUDIO2FX_REVERB_PARAMETERS 構造体を使用します。

    XAUDIO2FX_REVERB_PARAMETERS reverbParameters;
    reverbParameters.ReflectionsDelay = XAUDIO2FX_REVERB_DEFAULT_REFLECTIONS_DELAY;
    reverbParameters.ReverbDelay = XAUDIO2FX_REVERB_DEFAULT_REVERB_DELAY;
    reverbParameters.RearDelay = XAUDIO2FX_REVERB_DEFAULT_REAR_DELAY;
    reverbParameters.PositionLeft = XAUDIO2FX_REVERB_DEFAULT_POSITION;
    reverbParameters.PositionRight = XAUDIO2FX_REVERB_DEFAULT_POSITION;
    reverbParameters.PositionMatrixLeft = XAUDIO2FX_REVERB_DEFAULT_POSITION_MATRIX;
    reverbParameters.PositionMatrixRight = XAUDIO2FX_REVERB_DEFAULT_POSITION_MATRIX;
    reverbParameters.EarlyDiffusion = XAUDIO2FX_REVERB_DEFAULT_EARLY_DIFFUSION;
    reverbParameters.LateDiffusion = XAUDIO2FX_REVERB_DEFAULT_LATE_DIFFUSION;
    reverbParameters.LowEQGain = XAUDIO2FX_REVERB_DEFAULT_LOW_EQ_GAIN;
    reverbParameters.LowEQCutoff = XAUDIO2FX_REVERB_DEFAULT_LOW_EQ_CUTOFF;
    reverbParameters.HighEQGain = XAUDIO2FX_REVERB_DEFAULT_HIGH_EQ_GAIN;
    reverbParameters.HighEQCutoff = XAUDIO2FX_REVERB_DEFAULT_HIGH_EQ_CUTOFF;
    reverbParameters.RoomFilterFreq = XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_FREQ;
    reverbParameters.RoomFilterMain = XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_MAIN;
    reverbParameters.RoomFilterHF = XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_HF;
    reverbParameters.ReflectionsGain = XAUDIO2FX_REVERB_DEFAULT_REFLECTIONS_GAIN;
    reverbParameters.ReverbGain = XAUDIO2FX_REVERB_DEFAULT_REVERB_GAIN;
    reverbParameters.DecayTime = XAUDIO2FX_REVERB_DEFAULT_DECAY_TIME;
    reverbParameters.Density = XAUDIO2FX_REVERB_DEFAULT_DENSITY;
    reverbParameters.RoomSize = XAUDIO2FX_REVERB_DEFAULT_ROOM_SIZE;
    reverbParameters.WetDryMix = XAUDIO2FX_REVERB_DEFAULT_WET_DRY_MIX;
    
  7. エフェクトをアタッチするボイスで SetEffectParameters 関数を呼び出して、エフェクト パラメーター構造体をエフェクトに渡します。

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. エフェクトは必要に応じて適宜無効または有効にします。

    エフェクトは DisableEffect を使用していつでも無効にできます。

    pVoice->DisableEffect(0);
    

    エフェクトを再び有効にするには、EnableEffect を使用します。

    pVoice->EnableEffect(0);
    

    DisableEffect および EnableEffect のパラメーターは、チェーン内のエフェクトの有効化または無効化を指定します。

関連トピック

  • XAPO の概要
    新しいオーディオ エフェクトを作成する際に使用する XAPO API の概要を説明します。