coal: リバーブパラメータのマッピング

いやこれ超難しくない。。?
いわゆる3Dオーディオをやる上で重要なものにリバーブのシミュレーションがある。
XAudioやAndroid、CRI Audioのような一般的なオーディオミドルウェアはI3DL2リバーブを採用している。I3DL2リバーブは本質的にモノラルのエフェクトになるが、WindowsはWindows10でXAudio2のリバーブモデルを拡張し、いわゆるshoeboxモデルを実現できるようにしている。
OpenALはCreativeのリバーブモデルを採用しており、これはI3DL2リバーブとは内容が異なる。
そもそも、AppleのPHASEのように細かい調整を提供していないケースもある ...が、Appleの場合はAudioUnitsにもリバーブがあるのでそちらを使えば良い気はする。

XAudio2およびI3DL2
AndroidはOpenSL ES由来の実装になっており、この辺の説明はOpenSL ESの仕様書 https://registry.khronos.org/OpenSL-ES/specs/OpenSL_ES_Specification_1.0.1.pdf SLEnvironmentalReverbItf
にある。
The reverb controls exposed by this interface are based on the I3DL2 guidelines [I3DL2], with the restriction that the high-frequency reference level is fixed at 5 kHz.
XAudio2は PositionLeft
PositionRight
などのパラメタを足して、"壁までの距離"を表現できるようになっている。

Creative EAX
XAudio2のリバーブが幾何学的な形状を直接表現しているのに対して、EAXリバーブはPanとして方向性を持っているものの、全てを時間で指定させている。そもそもOpenALはspeed of soundすらコンフィギュレーション可能となっている。。

パラメタの比較
とりあえず適当に比較してみる。。ディケイとか共通しているパラメタを適当に合わせればそれっぽくなるのではないだろうか。。
一旦XAudio2も完全に表現できるOpenAL拡張を用意してプリセットを聞きつつ比較するのが良いかな。
対応するものがないもの
- XAudio2
float WetDryMix;
uint8_t RearDelay;
uint8_t SideDelay;
uint8_t PositionLeft;
uint8_t PositionRight;
uint8_t PositionMatrixLeft;
uint8_t PositionMatrixRight;
float RoomFilterFreq;
float RoomFilterMain;
float RoomFilterHF;
float RoomSize;
まず RoomFilter って何だよ。。
- EAX
#define AL_EAXREVERB_REFLECTIONS_PAN 0x000B
#define AL_EAXREVERB_LATE_REVERB_PAN 0x000E
#define AL_EAXREVERB_ECHO_TIME 0x000F
#define AL_EAXREVERB_ECHO_DEPTH 0x0010
#define AL_EAXREVERB_MODULATION_TIME 0x0011
#define AL_EAXREVERB_MODULATION_DEPTH 0x0012
#define AL_EAXREVERB_AIR_ABSORPTION_GAINHF 0x0013
#define AL_EAXREVERB_ROOM_ROLLOFF_FACTOR 0x0016
#define AL_EAXREVERB_DECAY_HFLIMIT 0x0017
ゲイン系
// ★ この辺は XAudio2には対応するものがない
#define AL_EAXREVERB_GAINHF 0x0004
#define AL_EAXREVERB_GAINLF 0x0005
#define AL_EAXREVERB_GAIN 0x0003
#define AL_EAXREVERB_REFLECTIONS_GAIN 0x0009
#define AL_EAXREVERB_LATE_REVERB_GAIN 0x000C
float ReflectionsGain;
float ReverbGain;
ディレイ
#define AL_EAXREVERB_REFLECTIONS_DELAY 0x000A
#define AL_EAXREVERB_LATE_REVERB_DELAY 0x000D
uint32_t ReflectionsDelay;
uint8_t ReverbDelay;
ディケイ
#define AL_EAXREVERB_DECAY_TIME 0x0006
float DecayTime;
インパルス密度(Density)
#define AL_EAXREVERB_DENSITY 0x0001
float Density;
ディフュージョン
#define AL_EAXREVERB_DIFFUSION 0x0002
uint8_t EarlyDiffusion;
uint8_t LateDiffusion;
フィルタ
フィルタは壁の素材 -- どのような周波数帯域を吸音するかの表現に用いられる。
#define AL_EAXREVERB_DECAY_LFRATIO 0x0008
#define AL_EAXREVERB_DECAY_HFRATIO 0x0007
#define AL_EAXREVERB_HFREFERENCE 0x0014
#define AL_EAXREVERB_LFREFERENCE 0x0015
uint8_t LowEQGain;
uint8_t LowEQCutoff;
uint8_t HighEQGain;
uint8_t HighEQCutoff;

I3DL2系リバーブ
XAudio2のリバーブはI3DL2の拡張となっている。FAudioにマッピングがある。
I3DL2の各パラメタの意味は例えばCRIのドキュメントにある:
ただし、AndroidのI3DL2リバーブ https://developer.android.com/reference/android/media/audiofx/EnvironmentalReverb はOpenSL ESベースなので HFReference
にあたるパラメタが無く、5kHzに固定されている。