I did a bit of searching on this site but surprisingly, I didn't find much relevant information, and my knowledge of DSP is very very limited.

My goal is quite simple : I want to program an algorithmic reverb in C++ which sounds really good. Or more exactly, the best option would be to let the end user choose the trade-off between quality and cpu-usage.

From what I found out so far is that, to create a reverb, you must feed the dry signal into a early reflections algorithm, then to a late reflections algo. Is this correct ?

Now, I found an extensive article on the late reflections part, using Feedback Delay Network (REDUCING ARTIFICIAL REVERBERATION REQUIREMENTS USING TIME-VARIANT FEEDBACK DELAY NETWORKS). From what I've read, FDN is a high quality, not too expansive (cpu wise) way of simulating the late reflexions. Furthermore, I guess you can control the quality/cpu charge trade-off by changing the number of delay lines.

However I have absolutely no idea of how to program the early reflections algo (remember ? I'm really ignorant in the DSP domain).

It would sound logical to me to use a kind of multi delay, which has the advantage to be easy to program and computationally inexpensive. But that sounds too simple to be true.

Furthermore, my instinct tells me that one or several filters must be included somewhere in the signal path.

Could some one please clarify this topic a bit for me ?

Two notes :

  • I'm not after a convolution reverb at all. I don't really care about the realism of the reverb, but instead I want a good sounding, tweakable, not to cpu-hungry reverb.
  • Also, the coding part isn't what worries me, I'd ask on stackoverflow otherwise. It's really the DSP part, and just that part, which I'm after :)

You need to generate early reflections with a few taps of delays (= convolution with the sum of a handful of diracs) ; and the "tail" with what is usually implemented with a network of all-pass (AP) and comb filters.

The first part is trivial to implement but difficult to get to sound right. It might help to look at the positioning of peaks at the head of pre-recorded impulse responses to get an idea of what kind of responses are "natural". It's hard to make it easily parametrizable by a few settings, though you could get away with it by offering a bunch of presets for this part to get an "hybrid" reverb à la Virsyn Reflect.

The tail is where algorithmic reverbs shine (no pun intended), since it is easy to parametrize. The grandfather of algorithmic reverbs is Schroeder's algorithm. Note that it only generates a "tail", not early reflections - you could augment it with a few taps of delays to give it a head. It does not sound very good (very "grainy") but it's a decent start - with that you have something to mess with and it helps understanding the impact of each parameter. Many praised algorithmic reverbs, especially those from the 80s (Lexicon, Eventide, Publison) are just finely tuned topologies of all-pass filters and comb filters. I suspect this involved a lot of trial and error by trained ears who got very good at figuring out how changes in parameters or topology would sound, rather than any scientific approach. Here is another interesting read - showing Keith Barr's favorite reverb topology. The original midiverb might not be your definition of "high quality algorithmic reverb", but it sounded sweet, and it puts thing in perspective to know it was made with a "dsp" only capable of MACs with coefficients of 0.5...

Valhalla room is my favorite software algorithmic reverb - take some time to read its developer's blog to find inspiration about the kind of things that help getting it right.

  • 2
    $\begingroup$ Forgot to mention Freeverb as a more modern variant (with code available, can be found eg in the csound, or ladspa codebase) of Schroeder's algorithm. $\endgroup$ – pichenettes Jul 4 '12 at 21:12
  • $\begingroup$ Very interesting ! I love Valhalla products too (ValhallaShimmer shines, no pun intended either :) ) . Why do you mention convolution for early reflexion ? Shold a normal delay multitap delay suffice ? $\endgroup$ – Dinaiz Jul 4 '12 at 22:36
  • 1
    $\begingroup$ I mentioned convolution because "multitap delay" is just a particular kind of convolution (with a few non-null coefficients, so it can be computed the naive way and without the artillery associated with "dense" convolutions). Anyway, as Hilmar pointed, a multitap delay might be a bit too naive and after a few reflections, so temporally spreading (= low-pass filtering) the echo will sound more natural. This can be done with a multi-tap delay with a simple LP for each tap ; or by directly computing the whole early reflections part of the reverb with a convolution engine and preset IRs. $\endgroup$ – pichenettes Jul 4 '12 at 23:42

Making a good sounding reverb is NOT easy. Feedback delay networks are definitely the way to go. The original Schroeder algorithms with all passes and comb filters suffers from "spectral thinning" which makes it metallic sounding. You need to dial in frequency dependent attenuation on the different delay lines that's representative of the reverb time (as a function of frequency). Early reflections can be done through a tapped delay line also with some frequency dependent attenuation and a few diffusers to de-correlate them. Doing stereo also requires some means of de-correlation.

There is a fairly good open source implementation floating around, it's called GVerb and it's used in, for example, Audacity. A google search should get you to a (legal) copy of the source code.

  • $\begingroup$ From your post it sounds easy ! Well at least I can understand it, except the part about de-correlation. What do you exactly mean by that ? Also about the frequency dependant attenaution, I guess you mean throwing out some filters and fine-tuning by ear it's frequencies for every line. What kind of filter are we talking about though ? HP ? LP ? BP ? Thanks ! $\endgroup$ – Dinaiz Jul 4 '12 at 22:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.