Analyzing the Spin "Mini Reverb" part 1

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.

// 
mem api1 122
mem api2 303
mem api3 553
mem api4 922
mem ap1 382
mem del1 8500 ;input = left output
mem ap2 4732
mem del2 7234 ;input = right output

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).

equ krt 0.7          ; adjust reverb time
equ kap 0.625    ; adjust AP coefficients
equ apout reg0  ; holding reg input AP signal

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.

rdax adcl,0.25 ;read inputs, 
rdax adcr,0.25 ;attenuate, sum and 
rda api1#,kap ;do 4 APs
wrap api1,-kap
rda api2#,kap
wrap api2,-kap
rda api3#,kap
wrap api3,-kap
rda api4#,kap
wrap api4,-kap
wrax apout,1 ;write to min, keep in ACC

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.

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:

Last updated