Open5

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

okuokuokuoku

いやこれ超難しくない。。?

いわゆる3Dオーディオをやる上で重要なものにリバーブのシミュレーションがある。

XAudioやAndroid、CRI Audioのような一般的なオーディオミドルウェアはI3DL2リバーブを採用している。I3DL2リバーブは本質的にモノラルのエフェクトになるが、WindowsはWindows10でXAudio2のリバーブモデルを拡張し、いわゆるshoeboxモデルを実現できるようにしている。

OpenALはCreativeのリバーブモデルを採用しており、これはI3DL2リバーブとは内容が異なる。

https://zenn.dev/link/comments/1928939af74535

そもそも、AppleのPHASEのように細かい調整を提供していないケースもある ...が、Appleの場合はAudioUnitsにもリバーブがあるのでそちらを使えば良い気はする。

okuokuokuoku

XAudio2およびI3DL2

https://learn.microsoft.com/en-us/windows/win32/api/xaudio2fx/ns-xaudio2fx-xaudio2fx_reverb_parameters

https://github.com/FNA-XNA/FAudio/blob/16f86bffec36b6e82e5c93d5f04ebc4ee4f980ab/include/FAudioFX.h#L85-L110

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 などのパラメタを足して、"壁までの距離"を表現できるようになっている。

okuokuokuoku

パラメタの比較

とりあえず適当に比較してみる。。ディケイとか共通しているパラメタを適当に合わせればそれっぽくなるのではないだろうか。。

一旦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;
okuokuokuoku

I3DL2系リバーブ

XAudio2のリバーブはI3DL2の拡張となっている。FAudioにマッピングがある。

https://github.com/FNA-XNA/FAudio/blob/16f86bffec36b6e82e5c93d5f04ebc4ee4f980ab/src/FAudioFX_reverb.c#L1735-L1803

I3DL2の各パラメタの意味は例えばCRIのドキュメントにある:

https://game.criware.jp/manual/native/adx2/latest/criatom_tools_atomcraft_dsp_effect_i3dl2_reverb.html

ただし、AndroidのI3DL2リバーブ https://developer.android.com/reference/android/media/audiofx/EnvironmentalReverb はOpenSL ESベースなので HFReference にあたるパラメタが無く、5kHzに固定されている。