Analyzing the Spin "Mini Reverb" part 1
Last updated
Last updated
The Mini Reverb is available in the "Code snippets" table at the top of this page of "Free DSP Programs" offered by the vendor of the FV-1. Let's dive right in.
All of these statements are defining buffers for the audio to travel through as it goes through the reverb. Let's see how long each one of those is time wise at a 32768 Hz sampling rate.
Next up, two constant declarations and a register allocation (for later, we don't know what it's for yet).
The code starts doing something below. The left and right analog to digital convertor inputs are read, each attenuated by 12 dB (0.25), and added together.
From there, they go to a chain of 4 all pass filters. Each one of these is handled by a rda/wrap pair of instructions.
Here's a couple links to Julius O. Smith's site where he shows the fundamental structure and analysis of an all-pass filter.
All-pass filters in general.
An all-pass filter from two comb filters is the structure implemented by the rda/wrap instruction pair.
Notice that a single value of kap is used for every stage. This is not necessary, it just makes life a bit easier. I think you'd be hard pressed to easily detect minor differences in the allpass coefficient. If you DO wish to mess with the AP coefficient for each block, make sure to keep the pairs equal for a given buffer and note that they have opposite signs in the wrap vs. rda instruction.
We finally see that the register called apout is used to hold the value spit out by the last all-pass in that chain.
Here's the structure so far. The delay line lengths are proportionally represented by the vertical height of the blue bars. Each one of those is an all-pass filter with the feed-forward and feed-backward paths using the same coefficient of 0.625.
The longest delay in the all-pass chain is about 28 msec long, about what you might encounter in a chorus pedal. In other words, it's very short, and quite likely to be under the threshold for the Haas effect where you can actually hear it as an echo.
Implementation in SpinCAD Designer
By the way, this structure is used in the "All-Pass" block under the "Reverb" menu. The SpinCAD Builder code is here.
Input Gain should be self explanatory. With high settings for the "All-Pass" coefficient, you can get distortion, which usually sounds like sharp clicks. If this happens to you, reduce the input gain.
All Pass Stages goes between 2 and 4. The lengths are quite different than in the example above. I must have taken these lengths from a different block. It would be ideal to be able to adjust each one. The lengths are: 156, 223, 332, and 448. The longest ones are allocated first. e.g. if you select "2" you get 332 and 448. Is this adjustment a valuable feature? It's hard to say. Now that I think of it, it might be more useful to simply offer a block with 4 all passes and the ability to set each one's length. I've never used anything below 4, and the amount of delay RAM used is so small that there's not much to be gained by trying to make it less.
All Pass is the coefficient, which is the same for all stages. At the moment, it goes between 0.25 and 0.98. I'd like to change this to go from -0.98 to 0.98. I have a theory I'd like to test about changing the sign of the coefficient.
All Pass Filters
By now, you've certainly heard about all-pass filters. Wow, they pass all frequencies at the same level! Huh? What's the point of that? The big point of all-pass filters in reverbs is that they smear sharp transients in time while preserving all of the energy in the input signal.
A mathematical impulse signal is defined as having zero width, infinite height, and an area of one. Whoa, how do you figure that? Well, don't worry about it too much. Since we can't really generate a signal like that, we'll do the best we can by creating a short "click" in Audacity. This will let us demonstrate in a qualitative rather than super-accurate way what the bank of all-passes does here.
The click makes details of reverb decay and tone stand out so much better than sustaining notes that I can't believe that anyone ever demonstrates a reverb any other way. Of course, that would be too boring and not allow us to get carried away by the grimacing wankitude of 90% of guitar effects demos.
Why?
Perhaps you are wondering what the significance is of the specific all pass lengths in this small reverb and the SpinCAD All Pass block. Perhaps you are wondering even more where all the other numbers came from as well. The real answer is "I don't know"! To read Keith Barr's notes on the Spin Semi web site, you'd have to believe that he set these all "by ear".
Unfortunately Keith is no longer with us, having passed away a year or two before I even became aware of the FV-1. So we can't ask him. I'm sure it was informed by his pioneering work on the Alesis MIDIVerb, NanoVerb, etc. products. I can't even imagine it but it must have been something to take part in! If there's ever a guy I wish I could have talked to...
Over the years I've looked at many of the reverb examples offered up by Spin, but a step-by-step method to develop a reverb based on a specific set of criteria has never been given directly. Will I discover something new as I pass through it all once again? Who can say? I do have some ideas though.
Here are some useful notes from the Spin Site:
Spin ASM Manual - search for "WRAP"