# Adjust treble and bass on Audio in XNA

I am trying to "muffle" the sounds that are being played in my game and the best way I can think of doing this, is by lowering the treble of the sound.

I have looked through all the members of the Song / SoundEffect / SoundEffectInstance classes and I cannot find a way to alter the sounds.

How can I accomplish this?

• I don't 100% know the answer but have you looked into using XACT? Oct 14 '12 at 20:47
• I have not but it appears that it might be the route to go. Oct 15 '12 at 18:18

With XNA you have two approaches: mix your own filters as Bjorn describes in his answer with DynamicSoundEffectInstance (it's fun, try it :) ). The other option is XACT Variables.

Watch this video to see somebody use XACT variables to dynamically change an engine sound over time using pitch. To accomplish what you want, do something similar, but use it to adjust the parameters of a low pass filter (XACT should have it built in).

You can adjust the variables via Cue.SetVariable and Cue.GetVariable. See the MSDN docs for more info. Unfortunately, Microsoft has retired XACT, so all the detailed documentation on the tool has disappeared. But there are still blog posts and videos like the one I linked that can show you how to get stuff done.

• I will take a look into both the DynamicSoundEffectInstance and the XACT Variables. I have heard a lot about XACT, is it generally better or more useful to use XACT instead of the Song/SoundEffect classes? Oct 15 '12 at 18:19
• @KyleUithoven Yes, it's generally more useful. While it has its quirks, XACT is going to give you the most flexibility and control over sound playback in your XNA game. It provides an FMOD/Wwise-like interface that makes it easy to keep your audio playback data-driven. Oct 15 '12 at 18:26
• This XACT tool has worked great. I was able to achieve everything I asked for and more. Thanks! Oct 17 '12 at 19:58

I don't know XNA, but I can give you a generic answer:

What you want is a "low-pass filter" which is a kind of EQ, or equalizer, sometimes simply called an "audio filter". If the system you are using does not have one, you can use a moving average filter: so each sample output will be the average of the previous N inputs (the bigger N is the more "muffling" you will get, but past three or four, you'll be doing a lot of work for not much return).

If the moving average filter isn't sufficient (and it probably isn't), the standard approach is the "digital biquad". I describe how to write your own in this blog entry:

http://blog.bjornroche.com/2012/08/basic-audio-eqs.html

(I describe a bell filter, but a low-pass is simpler.)