We’d like to have some advice regarding setting up a DSP Network for a specific scenario in our game.
The scenario is that we have multiple music tracks (each mapped to a channel) that play simultaneously and that can be faded in/out depending on the game action. Now we want to stop one (or multiple) of these music channels when something happens in the game. More precisely, instead of simply stopping a music channel we want to have a reverb tail that provides an interesting echo for that channel as opposed to, say, simply ramping down its volume.
After reading the documentation about DSP networks and effects, our impression is that we should utilize Send/Return nodes for this purpose. Similar to this example graph, we would create an SFX reverb node, connect that to a return node, and then feed the return node with, let’s say, a second of music from a send node once one of the music channels “dies”. Our assumption is that we would still get the reverb tail for this second of music even when nothing is sent to the return node anymore.
Would you say that this is the correct approach for our scenario? And should we really set up the SFX reverb node ourself or would there be a convenient way to harness the automatic node setup of System::setReverbProperties instead as advised in the DSP white paper?
It sounds good to me! A reverb effect that’s playing out its tail will keep a return alive while it plays out a tail, even after the return has stopped receiving signals, so there shouldn’t be any problems with using this method.
Both methods could work, but personally I reccomend creating the return and reverb DSP yourself. System::setReverbProperties is designed for situations where reverb is applied globally, i.e.: when all or nearly all of your game’s audio is subject to the same reverb. In your case, however, you only want to apply reverb to your music and nothing else in your project, so creating a reverb just for the music makes more sense.
So we needed to come back to this issue and have not found a working solution so far that does what we want.
What we want is to apply a reverb DSP to a single channel only as a tail effect, not permanently. So for example, we want to play the channel normally, then when something happens in the game, we want to mute this channel and at exactly this point get a reverb tail. At a later point in the game, we want to unmute the channel without any reverb effect.
We tried to implement this by adding a reverb DSP to the channel and settings its properties to FMOD_PRESET_OFF. Then, when the situation arises, we simultaneously mute the channel and set the reverb properties to, say, FMOD_PRESET_CONCERTHALL. However, we cannot hear a reverb tail.
It seems our approach only works when there’s some delay between having the reverb active and muting the channel. Do we manually have to setup such a delay or is there a more elegant solution with FMOD functionality?
There’s a couple of ways in which you could potentially avoid having to create a delay.
The simplest option would be to control the wet and dry levels of the DSP instead of changing which preset it uses.
If you are for any reason unable to adjust the wet/dry mix, another option is to use creative signal routing. If you route the signal to two different channel groups, one with a reverb effect and one without, and control the levels of those channel groups such that only one of them is audible at a time, you’ll be able to switch seamlessly between them at any time.