Analyzing the Spin "Mini Reverb" part 2
Last updated
Last updated
At the end of part 1, we'd made it all the way through the input all-pass chain. Earlier I had talked about being mystified by the all-pass lengths and how they were determined. I did find a bit of a clue as I was researching the "Schroeder reverb" over at my make-believe buddy Julius O. Smith III's site.
The diagram on the linked page shows a cascade of 3 rather than 4 all-pass sections as in most Spin designs. Smith suggests that the delay line lengths should be mutually prime and of "successive orders of magnitude", e.g. 1051, 337, 113. To be honest I'm not sure what "spanning successive orders of magnitude" means exactly.
If you are going to experiment, I'd say to use lengths in that general region, with each one 2 to 3 times the length of the previous one. As far as picking mutually prime lengths goes, Wolfram Alpha allows us to easily generate prime numbers in a range. There are 278 primes between 100 and 2000. JOS' article also shows an all-pass coefficient of 0.7. Most of the ones I've seen in Spin reverbs are between 0.55 and 0.75. Want to try making up your own all-pass section?
Note also the reference to Schroeder all-pass sections as "impulse diffusers". This is what I meant earlier about them smearing transients time wise.
Let's now look at the next few instructions.
It's informative to draw a diagram of all the delay lines and all-pass filters in the whole design now.
First, we read the end of del2, multiply that by the reverb time constant krt (there's no pot control here), add that to the ACC which already has the output of the input all-pass chain, and then do the all-pass calculation and write the value to the end of all-pass ap1. Note that I am not showing the all-pass calculations directly.
The output of all-pass ap1 then gets written to the input of delay line del1, multiplied by 1.99 (to recover some level), then written to dacl (left output).
A very similar thing happens on the other side. We take the out from the input all-pass chain, which is stored in apout, mix it with the output of the "other" delay line multiplied by krt, and put it through the all-pass daisy chained into del2.
So, there are a few notable design features worth talking about, which may become more obvious when we start looking at larger reverb structures.
The whole reverb is very compact - 22 instructions!
There is no pot control of any parameter
There is no high or low frequency damping (which are typically implemented as 1-pole filters, shelving or not, in series with the all-pass/delay line pairs).
There are only 2 all-pass/delay chains - most larger structures use 4.
There is a criss-cross flow of signal between the left and right sides.
The output of the input all-pass chain is injected into the front of the all-passes on both sides. Later, as we look at 4-pair designs, you'll see that some designs only inject the input into two of the all-pass/delay line pairs, while some go into all 4. I believe the difference comes out in the speed at which echoes "build up". This is a seat of the pants hypothesis.
The output signals come straight off the all-pass sections before they pass through the delay lines the first time. With larger designs you'll see that one technique is to sum multiple taps sprinkled (at random) throughout the delay line.
There is no chorus "smoothing" of the sound.
Some ideas for improving the SpinCAD implementation of this minimum reverb block include:
Add a control input for reverb time. When not connected, it's just at the control panel setting.
Add control panel settings for all all-pass and delay line lengths. Since it's a small design it should be manageable.
Add control inputs for high and low shelving filters in the reverb loop. If not connected, the filters would drop out completely. But it's a very small code size addition to get a lot more control over the sound.