Jump to content


Photo

Incorrect EFX environment size handling

efx reverb openal

  • Please log in to reply
2 replies to this topic

#1 KCat

KCat

    Newbie

  • Member
  • Pip
  • 8 posts

Posted 08 February 2018 - 04:49 AM

Wasn't sure the best way to report or fix this is, but as I was recently trying to build TDM from the SVN source to get OpenAL sound output on Linux with reverb (the latest release doesn't seem to have it), and noticed a small issue in the source. In sound/snd_efxfile.cpp, there is this line which converts the "environment size" preset property to density:
efxf(AL_EAXREVERB_DENSITY, (size < 2.0f) ? (size - 1.0f) : 1.0f);
That's incorrect. The correct way to convert it, based on Creative's own EAX-to-EFX conversion tools and as adopted by the Dhewm3 port, is:
float size = src.ParseFloat();
efxf(AL_EAXREVERB_DENSITY, idMath::ClampFloat(
        AL_EAXREVERB_MIN_DENSITY, AL_EAXREVERB_MAX_DENSITY,
        idMath::Pow(size, 3.0f) * 0.0625f
));
This will help improve the quality of the reverb, making the presets sound closer to the intended response.
 
Hope that's helpful. :)

Edited by KCat, 08 February 2018 - 04:51 AM.

  • Judith, HMart and Anderson like this

#2 grayman

grayman

    Master Builder, Coder

  • Active Developer
  • PipPipPipPipPip
  • 12552 posts

Posted 08 February 2018 - 06:22 AM

Welcome, KCat, and thank you for your post.

 

Someone familiar with the EFX code should be along shortly to deal with this.


  • Anderson likes this

#3 stgatilov

stgatilov

    Lead Programmer

  • Active Developer
  • PipPipPip
  • 889 posts

Posted 06 May 2018 - 11:28 AM

Wasn't sure the best way to report or fix this is, but as I was recently trying to build TDM from the SVN source to get OpenAL sound output on Linux with reverb (the latest release doesn't seem to have it), and noticed a small issue in the source. In sound/snd_efxfile.cpp, there is this line which converts the "environment size" preset property to density:

efxf(AL_EAXREVERB_DENSITY, (size < 2.0f) ? (size - 1.0f) : 1.0f);
That's incorrect. The correct way to convert it, based on Creative's own EAX-to-EFX conversion tools and as adopted by the Dhewm3 port, is:
float size = src.ParseFloat();
efxf(AL_EAXREVERB_DENSITY, idMath::ClampFloat(
        AL_EAXREVERB_MIN_DENSITY, AL_EAXREVERB_MAX_DENSITY,
        idMath::Pow(size, 3.0f) * 0.0625f
));
This will help improve the quality of the reverb, making the presets sound closer to the intended response.
 
Hope that's helpful. :)

 

Thank you very much for your note!

 

I have looked into dhewm3 sources, and it still uses the same linear formula as TDM:

  https://github.com/d...fxfile.cpp#L203

 

To be honest, I do not understand the difference well.

Since AL_EAXREVERB_DENSITY value seems to be in range [0, 1], the two formulas are approximately the same up to a bias of 0.5: the current linear formula has most changes in range [1..2], while the cubic formula has the same change in range [0.5, 1.5]. Of course, the effects tuned for EAX will sound differently on EFX as the result. But we have no builtin presets for EFX, I believe.

And there are only a few missions with EFX settings. In Patently Dangerous, this parameter is set to 1 everywhere. In Volta, it is mostly 1.0, and sometimes 1.8 or 8.0. Clearly, 8.0 is wildly off range with both formulas.


  • Anderson likes this





Also tagged with one or more of these keywords: efx, reverb, openal

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users