Reverb circuits

311 views
Skip to first unread message

Keith W Blackwell

unread,
Mar 21, 2011, 2:10:23 AM3/21/11
to Analog Box
Adding a bit of ambiance is such a common need, that I figure it might
be of general interest to share some reverb circuits. Unfortunately,
I have so many I've created that when I go to look for one, I have too
many to choose from. Some allow setting many params, and some are
more simple. I've also found that some well-timed multi-tap delays
are often more desirable than true reverbs. And simulating a real
acoustic space seems to work better by combining multi taps for short
reflections and some multi-taps of a traditional all-pass/comb
arrangement that help spatialize and discretize some of what we want
to hear.

So does anyone else enjoy doing this? Or is just my own weirdness? I
mean, perhaps you prefer to just throw in a VST effect when you need
some reverb, and be done with it. I prefer to keep my ABox circuits
as independent as possible. Getting a reverb to work well takes a lot
of difficult tuning, otherwise you get these dominating frequencies
that resonate like a big bottle. Sometimes I just go with that, and
put in band-reject filters to tame those hot spots. Easier than
tuning. :-)

--
Keith W. Blackwell

Keith Blackwell

unread,
Mar 21, 2011, 2:29:48 AM3/21/11
to analo...@googlegroups.com
Allow me to post this relatively huge circuit that uses a little music bot to push sounds into a reverb of your choosing. You push a button to cycle through the available reverb circuits. I think it shows pretty well which ones generally sound ok and which are crappy.

The best, IMO, is one based on the famous "Freeverb" algorithm, which can find quickly with a search. I started with the identical parameters, but I'm not sure that this particular instantiation has any variation between L and R as it should (can't remember). The nice thing about freeverb is its balance, which allows you to pump it up to very long reverb time, like 10 seconds or more.

If you find something you like in there, and improve on it, please oh please share the improvements back with me, or with all of us. I'm sure there is plenty of room to improve. Many of these circuits use filters within them, and those can become overloaded a bit easily if the gain structure is not set up correctly within the circuit, resulting in "nasty", "glitchy" sounds.

--
Keith W. Blackwell


ReverbKeithDemo.ABox2

Keith Blackwell

unread,
Mar 21, 2011, 2:35:20 AM3/21/11
to analo...@googlegroups.com
Following up on the niceness of the freeverb-based circuit (which, by the way, is *not* an exact emulation, as I departed from freeverb in a few aspects), I decided to enrich the sound with some early reflections and some longer multi-taps.

I had some early-reflection circuits I had worked up before, but couldn't find the one I really wanted. So I just used this "Spreader" circuit instead. And likewise, I used a multi-tap that includes a bit of modulation inside it, and put that after the freeverbs. I also threw in the same surround encoder I had just posted.

I like the sound of this. Now, admittedly, the voice I'm using in the demo has a sharp transient attack that really lets you hear some of the early reflections, and that can be distracting. That can be good or bad, depending on your goal. But most voices aren't like that.

There are some aspects of this that I suspect are still incorrect, so if you notice something that was not wired that definitely should have been, let me know. Likewise, any improvements welcomed, please.

The reverb fx in itself is a closed cell circuit, but I have it in a circuit with music to act as a demo.

--
Keith W. Blackwell

KeithReverb_freebased_Demo.ABox2

John Paul Burtell

unread,
Mar 21, 2011, 9:38:33 AM3/21/11
to analo...@googlegroups.com
Thanks for these circuits!
 
I haven't worked on developing reverb nearly as much as I would like - perhaps these can serve as a jumping off point.
 
I usually go with an IR reverb, but that poses it's own unique set of challenges as well (i.e. requires decent IR's, can be difficult to get early reflections to sound good, etc.). I actually enjoy loading non-spatial sounds to get interesting ambient effects.


--
You received this message because you are subscribed to the Google Groups "Analog Box" group.
To post to this group, send email to analo...@googlegroups.com.
To unsubscribe from this group, send email to analog-box+...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/analog-box?hl=en.


Keith W Blackwell

unread,
Mar 21, 2011, 12:33:16 PM3/21/11
to Analog Box
I use impulse response convolution a lot in Cool Edit Pro. I enjoy
creating my own synthetic impulse responses to convolve with.

How do you do it in ABox? I assume FFT multiplication or something
like that? And you have to use a File block, which I cannot. Maybe
that's why I've never gotten that far. Perhaps you could share a
circuit.

One of the weaknesses of the File block is that you cannot really use
it within another group and expect it to be reusable since there is no
way to parametrize the name.

--
Keith W. Blackwell

Andy Turner

unread,
Mar 21, 2011, 4:50:36 PM3/21/11
to Analog Box
After many lackluster attempts to make reverbs (equivalent to many of
your earlier ideas by the way), I finally grew accustomed to really
simple echos. Merely wiring the output of a generator back into the
offset input (with an attenuator of course) at least got a 23ms echo
and added some space to the mix.

Spent quite a bit of time trying to _remove_ 'verb from existing
material. But since there's no objective way to measure it, I don't
know if I succeeded or not.

In theory, convolution is the magic bullet for all that. And, in
theory, FFT can greatly speed up convolution. And, in theory, and as
you've surmised, FFT multiplication is how it's done. Actually doing
that in ABox, however, is another matter ... I'll defer the specifics
of FFT/Convolution to the text books.

In the junkyard, is an expedition into such matters,
<http://www.andyware.com/abox2/library/_junkyard_/convolvers/>

if you the off-line archive, sort the directory list by time.
<http://sites.google.com/site/analogbox2/download/abox_library.zip>

convolver_01 through convolver_11 appear to lead to a working result.
The rest of it i forget (sorry :-(. Looks like modularization was
attempted. Then correlation, autocorrelation, and finally a cepstrum.

The convolver_512_group, a couple months later, might be useful.

I too came to the conclusion that getting the IR right was next to
impossible. Then moved on to spatial model/ray tracing style.

Rune Lund Sørensen

unread,
Apr 25, 2015, 4:41:39 PM4/25/15
to analo...@googlegroups.com
I've been trying real hard to do proper reverb for some time without too good results. Either it sounds like a mess of delays or it takes up way too much CPU. Recently came across some ancient designs from the seventies involving series of allpass filters and combs in paralel (Schroeders reverb -> https://ccrma.stanford.edu/~jos/pasp/Schroeder_Reverberators.html ). Thought I'd try it out with andy's premade filters, and it turns out it sounds really well. Here's a mono and a stereo implementation following one of Schroeders designs. The only problem I have now is doing comb filtering with longer delays than 1024 samples...
Verb1.ABox2
Stereo.ABox2

Keith Blackwell

unread,
Apr 25, 2015, 10:33:06 PM4/25/15
to analo...@googlegroups.com
On 4/25/2015 2:41 PM, Rune Lund Sørensen wrote:
I've been trying real hard to do proper reverb for some time without too good results. .... Thought I'd try it out with andy's premade filters, and it turns out it sounds really well.
Yeah, it makes a good small-room ambiance as is.

The only problem I have now is doing comb filtering with longer delays than 1024 samples...
Some of Andy's jambots and example circuits have some amazingly good implementations that are both simple and pleasant-sounding.  One that has inspired me a lot was one from jambot11, mainly because of how ridiculously simple it was.  But I can never leave things "simple".  :-)  So I must have 20 or 30 reverb implementations laying around, so many that I can never remember which ones sounded really good and which ones were never tuned, etc. (so I always pick one of the more recent ones or just build a new one).

The "EON" reverb that John posted here has proven very useful to me in many jambots.  In one particular case, I was annoyed at how impulsive sounds would end up having "too distinct" echoes bouncing around, so I put some all-pass filter stages in front of it, and very much liked the result.

I notice a few things that I would change in your circuit, and went ahead and tried them.  Well, of course, I always modify and play with *any* analog box circuit I like.  :-)  I used an existing "jambot" I had messed with recently to test it, and I just remapped the final outputs to come from the new reverb instead of the modified "eon" reverb that I had sitting there already. 

To get longer reverb, each comb can be replaced with a multi-stage comb, where each of several delays feeds the next, but without much (if any) feedback, and all have their outputs summed.  This way, you get a multi-tap comb filter that is much more complex.  If you look at the reverb in jambot 11, you'll see that is what it is doing, very simply.  But I also like to let the inputs in such a chain include varying amounts of the prior stage and a stage somewhere before that, possibly even the original.  It doesn't really help that much, but gets denser early reflections at the risk of getting some resonant tones that you have to watch out for.

The All-Pass likewise could be more than 3 stages. 

I tried dropping my pre-existing blocks for doing such things in the place of your comb and all-pass blocks, using your same numbers.  In the case of the multi-comb's, the input value is really just a multiplier for pre-set delay amounts of the multiple stages inside, so that seemed like a valid approach.  For the all-pass, I went ahead and added 3 more stage values (but didn't try to tune them), and I lowered the overall feedback parameter. 

I did *not* go so far as to provide a "Diffusion" input parameter, which in my other circuits has been used to blend between the all-pass output and the non-all-passed (raw) signal (thus letting you choose how much such diffusion you want).  I also did *not* add any low-frequency low-amplitude warbling to the existing multi-comb filter's DO (delay offset), which is what that input pin is intended for.  If you use such a "chorus" effect, it can warp the tones a bit, but usually it can help overall and tends to avoid having too-strong resonant frequencies in the result, and is a standard technique in reverb design.

I finally noticed the feedback control at the front, and when trying it I got a lot of DC that destroyed the output.  So I put in a subtracted-RC-style high pass filter on each feedback line.  You can also place partial filtering there to shape the longer reverb spectrum, especially to emphasize the 400Hz -- 2kHz range, which sounds more natural, but I didn't bother with that. 

The final things, for me, are to control the stereo imaging and mix conveniences, and I only went about half-way.  Instead of doing L-R straight through, I changed it to use something more like mid-side on the inside, then recombine to get L-R.  I usually prefer to have one L chain, one R, chain, and then a separate chain (or two) for mid (or mid and side), and then let the final mix have a stereo-width control.  But I didn't bother here.  My multi-comb blocks already had alternate outputs for "begin-weighted" (instead of the more normal end-weighted) mixes, so I used those differently in the final output to get a slightly-more balanced sound stage.  Well, different, anyway.  I like having the Wet/Dry ratio controlled from the outside, so I added that.

It doesn't sound half bad.

Check it out.  If you try switching the output lines back to the "Full EON" box that I originally had in the circuit, you'll definitely need to lower the wetness dramatically.

And by the way, for others looking at this, the "pluck oscillator" that is being demoed in the original test circuit was based on a discovery recently that by using division to modulate frequency instead of multiplication or addition, I could get some nicely-complex sounds that otherwise tend to take a lot more stages of FM.  So I had tried to see if I could get a good piano sound out of it.  I thought it sounded more like a guitar originally, and added the pluck-effect to the base frequency just for fun.  The sequencer is just a modified version of the old Pentamonic I posted previously, but with enough changes that it isn't as limited to the pentatonic as it used to be (plus, I made the scales more minor, instead).

SimpleStereoReverb_Modified.ABox2
Keith_PluckOsc+Solo_Demo2.ABox2

John Paul Burtell

unread,
Apr 27, 2015, 8:02:47 AM4/27/15
to analo...@googlegroups.com
Can't wait to check these out. Thanks for circuits.

Also, Keith I have a "slightly" modified version of EON that I use now. It still works pretty well for large space sounds, and it's still a good idea to put filtering before it, but I mainly use it as a time domain audio "freezer". With the circuit set to full wet, if you turn the feedback to full while simultaneously cutting the input (I usually use an envelope set to around 0.3 or 0.5 seconds) it has a freezing effect. It can be useful if you're into ambient/drone music, or just looking for a different kind of effect.

Anyway, thanks again Rune and Keith - you can never have too many reverbs.

--
You received this message because you are subscribed to the Google Groups "Analog Box" group.
To unsubscribe from this group and stop receiving emails from it, send an email to analog-box+...@googlegroups.com.

To post to this group, send email to analo...@googlegroups.com.
eon.ABox2

Keith Blackwell

unread,
Apr 27, 2015, 11:16:33 AM4/27/15
to analo...@googlegroups.com
On 4/27/2015 6:02 AM, John Paul Burtell wrote:
Also, Keith I have a "slightly" modified version of EON that I use now. It still works pretty well for large space sounds, and it's still a good idea to put filtering before it, but I mainly use it as a time domain audio "freezer". With the circuit set to full wet, if you turn the feedback to full while simultaneously cutting the input (I usually use an envelope set to around 0.3 or 0.5 seconds) it has a freezing effect. It can be useful if you're into ambient/drone music, or just looking for a different kind of effect.

That's a fabulous use.  I haven't had much need for such a thing, but would use it if only I was regularly patching real external performances through my computer!  Thanks for sharing.  I look forward to modifying it yet more.  :-)

--
Keith

John Paul Burtell

unread,
Apr 27, 2015, 11:54:01 AM4/27/15
to analo...@googlegroups.com
I hope you can get some use out of it. I forgot to add that if you are freezing rhythmic material or sounds with sharp attacks, you may want to turn the "smooth" level all of the way up. :D

Rune Lund Sørensen

unread,
Apr 29, 2015, 9:05:42 AM4/29/15
to analo...@googlegroups.com
>One that has inspired me a lot was one from jambot11, mainly because of how ridiculously simple it was.

Just tried to find that in the 'junkyard' to no avail... can someone point me to it? (transcending the 1024 limit has been bugging me for a long time, as I've been experimenting with physical modelling using delay lines)

For the sake of sharing, I'm attaching an older reverb I did. It's based on the monkey typewriting principle. Passing more or less arbitrary values to a huge amount of delay modules until it sounds good :P

In other words, it's deliberately uncontrollable (apart from scaling the pseudo random values) but rather 'seeded' until you get a sound you like. In the attached module there are two versions based on the same principle. The first stage module has explanatory text for each knob.

The second circuit showcases an implementation of the same reverb, and some of my accidentally nice percussion models done with delay lines. I'm also kinda proud of my string section :P
reverb.ABox2
PercusiONE.ABox2

Keith Blackwell

unread,
Apr 29, 2015, 10:41:13 AM4/29/15
to analo...@googlegroups.com
On 4/29/2015 7:05 AM, Rune Lund Sørensen wrote:
>One that has inspired me a lot was one from jambot11, mainly because of how ridiculously simple it was.

Just tried to find that in the 'junkyard' to no avail... can someone point me to it? (transcending the 1024 limit has been bugging me for a long time, as I've been experimenting with physical modelling using delay lines)

http://www.lightfield.com/abox2help/gallery.html

Since these are in descending order, #11 is near the end of the list.  When you get it, pan to the bottom left corner.

--
Keith W. Blackwell

Keith Blackwell

unread,
Apr 29, 2015, 10:45:15 AM4/29/15
to analo...@googlegroups.com
But by the way, if you are wanting to get *less* than 1024 samples in a feedback loop, it's impossible.  I tried doing some waveguide stuff, human voice simulation using connected tubes, and various other things, but they are impossible.  One potential avenue you might try is to use something like Faust to create the basic DSP circuit and have it automatically generate a Windows-suitable VST plug-in from it, and then use that within an ABox2 circuit.  I started down this path but got bogged down on trying to get Faust to work on Windows.

--
Keith

Andy Turner

unread,
Apr 29, 2015, 11:06:20 AM4/29/15
to analo...@googlegroups.com
Jambots can be found here: <http://lightfield.com/abox2help/gallery.html>
Or here in the abox_examples.zip:
<https://sites.google.com/site/analogbox2/download>

Rune Lund Sørensen

unread,
Apr 29, 2015, 11:10:30 AM4/29/15
to analo...@googlegroups.com
>But by the way, if you are wanting to get *less* than 1024 samples in a feedback loop, it's impossible.  I tried doing some waveguide stuff, human voice simulation using connected tubes, and various other things, but they are impossible.  One potential avenue you might try is to use something like Faust to create the basic DSP circuit and have it automatically generate a Windows-suitable VST plug-in from it, and then use that within an ABox2 circuit.  I started down this path but got bogged down on trying to get Faust to work on Windows.

I've tried a similar solution (also messing around with acoustic assymetric tube models and such, using the algortihm described here: https://ccrma.stanford.edu/~jos/pasp/Ideal_Acoustic_Tube.html#21393 ). I used Synthedit (under linux btw, which is a challenge in itself). The test plugins I created were dysfunctional, so I gave up. For now. I'll have a look at Faust.

I did however manage to produce some really scary sounds with the Kelly-Lochmann model :)

Keith Blackwell

unread,
Apr 30, 2015, 1:17:55 AM4/30/15
to analo...@googlegroups.com
On 4/29/2015 7:05 AM, Rune Lund Sørensen wrote:
For the sake of sharing, I'm attaching an older reverb I did. It's based on the monkey typewriting principle. Passing more or less arbitrary values to a huge amount of delay modules until it sounds good :P

That PercusiOne jambot is very, very good.  It seems to cycle through instrumentation variations that keep it interesting, and the sounds are all quite good and pleasant, and wonderfully mixed.  Thanks for sharing.  At this point, I think it is probably the most "listenable" (for long periods of time) jambot in my collection.  :-)

Since I brought up jambot11, I thought I should also share one jambot that resulted from me modifying it.  Not much is left of the original.  What the comments say is supposed to be a "string section" is really more like a bandoneon or accordian.  But you could tweak some of the filters and such to make it sound more like strings.  I just thought it sounded kind of interesting in this form.  The acoustic bass isn't quite as stable as I would prefer, but it still comes pretty close to sounding like what it should.  The reverb is essentially what was there to start with, plus a whole bunch of complications intended to help stereoize and extend it, and I just now threw an allpass diffusor in front of it.  Any of the other circuits we've been tossing around for reverbs would probably be better.

Warning:  the spanning tree algorithm is greatly challenged by this circuit since it has not got enough sub-circuitry boxed up.  After you load it, ABox2 may seem to go out to lunch for quite some time before it finally finishes preparing the circuit and begins to play music.  If any of you folks who are so much better at keeping things simple had created this instead of me, it probably wouldn't have that issue.
--
Keith W. Blackwell

Strings_From_jambot_11_KeithMod.ABox2

Keith Blackwell

unread,
Apr 30, 2015, 1:25:57 AM4/30/15
to analo...@googlegroups.com
On 4/29/2015 11:17 PM, I wrote:
Since I brought up jambot11, I thought I should also share one jambot that resulted from me modifying it. 
Sorry, I should have turned the reverb output back down to about -4db before sending this.  I had turned it up when adding the diffusion pre-stage to test it.  Not that it makes all that much difference, but ... that's how I would have preferred to have it set, anyway.  There are lots of things to tweak here.

--
Keith


Keith W Blackwell

unread,
Apr 30, 2015, 12:36:17 PM4/30/15
to analo...@googlegroups.com
On Wednesday, April 29, 2015 at 7:05:42 AM UTC-6, Rune Lund Sørensen wrote:
I'm also kinda proud of my string section :P

Okay, so that one has me a bit baffled.  Can you start a new thread to explain how the lower level oscillator blocks actually work?  It's a very nice result.  But I'm thinking that it could take a lot of time to figure out what's going on in there, unless you offer a bit of high-level guidance first.  :-)  It probably doesn't belong in this Reverb thread, though.

By the way, my strings_from_jambot11 modified jambot that I just posted can be made to behave much more nicely (no spanning tree delay) if the reverb section is put into its own group, and the "strings" post-filtering section is put into it's own group (it's easy to do since there are limited ins and outs in each case).  I might as well just attach it here to save everyone the trouble, especially since the original version I posted earlier gives you this unavoidable annoying delay at start-up (this one does not have that problem).

Andy, it might be nice to get some newer circuits added to the gallery for future ABox2 newbies to learn from.  I'm sure I could agree to have some of my circuits included, and others might as well, but I also know that a lot of my circuits have mistakes in them and might be all that exemplary (not to mention, some of them are too messy to decipher in their present state).  Might it be worth posting a call for that?  Would you offer to act as editor, to ensure that appropriate comment labels are put in where needed, etc.?  Or might some other ABox2 expert be able to provide that oversight?  I can't help but think of this because Rune's PercussiOne circuit is at least as superb as the others already in the gallery.

--
Keith W. Blackwell
 
Strings_From_jambot_11_KeithMod.ABox2

Rune Lund Sørensen

unread,
Apr 30, 2015, 12:48:22 PM4/30/15
to analo...@googlegroups.com
Hey Keith - Glad you liked the JamBot. I'm reposting a cleaned up version with some explanatory labels added. String patch is also roughly explained.

Your acoustic bass has me completely baffled. I've been trying to do something like that for ages. I'm starting an instrument patch thread for exchange of techniques and modules ;)

Also, I thought about using google drive for sharing circuits. Create a neo-junkyard. It would have to be moderated, but we could do that ourselves... AFAIK we're less than a handful posting here anyway...
PercusiONE mkII.ABox2

Andy Turner

unread,
Apr 30, 2015, 1:40:05 PM4/30/15
to analo...@googlegroups.com
Rune: PercusiONE -- WOW!! -- Please take a bow :-)

Keith and Rune (and everybody else too): Ya, I think it's time to see
about getting ABox2 it's own website/domain again. I'm not very web
savy, so any input would help. Maybe a thread should be started here
to gather ideas and make a plan.

I'm imagining something with a few fixed pages, a nicely cross
referenced wiki for reference + gallery presentations, and a forum for
miscellaneous less formal discussion.

Keith Blackwell

unread,
Aug 1, 2015, 1:33:16 PM8/1/15
to analo...@googlegroups.com
I've been occasionally dinking around with trying to simplify some reverb circuit ideas and avoid having the result be one of those that explode when you feed them the wrong note :-).  So I took some of my modules from an earlier experiment and modified them and combined them in a different way than before.  This one I called "Yet Another Long Reverb".  It does not resort to the high-gain shenanigans of the EON circuit (which I love), though I may have included some dynamic feedback somewhere -- maybe not.  I can't remember.  I think it's mostly more classical construction, except done in analog box, of course.  The idea is that there are two basic building blocks that are perhaps unusual, plus normal mixing circuitry using standard fare. 



One block is the blended multi-tap, filling the role of the parallel comb filters in classic reverb design.  Instead of feeding the output of each delay into both the next delay and a mixer input, I like to have each go into a multiplexer blending between that and the original input going into that delay block (or something else from earlier in the chain) before feeding that into the next delay block and some sort of mix-down circuit.  The reason this is useful is that you can vary the amount of that blend across all the little multiplexers.  That gives you a single control that can change the effect smoothly and gradually from a smaller space to a larger space.  The delay positions are not changing, but their relative balance is, which is good enough to get the effect when you have enough of this stuff going on.

But one blended multi-tap is not enough, I think.  To get reasonably long reverbs, you need one of these built from shorter delays (like single delay blocks in each stage) and one or two built from longer delays (with stacks of a few or several delay blocks).    But you can still use that single parameter to control the blend balance in each -- I call it the "room size" parameter.  But as with many such settings, you may find that only a subset of the full range of possible values is actually useful.

This time I was a little more disciplined at getting values for the delays that were integral and prime.  But just using primes isn't any guarantee of anything, because the differences between primes are always even, which essentially doubles the chances that some of these intervals between resulting impulses will be the same in multiple places, giving rise to resonant frequencies that can ruin the whole thing.  But I found it wasn't too bad to get the primes spread out such that this didn't happen too much.  And for all I know, there might still be some errors somewhere, some non-prime delay values (typos or otherwise), but nevertheless it is sounding pretty good.

The other block of course is to use a sequence of All Pass filters.  I have had a combo block for a long time that I've used for that, and have rebuilt such things a few times.  I think most of the ones I use have been 6 or 7 stages long.  Again, each stage uses a prime for the delay amount. The combo blocks in this circuit have 2 separate chains to use across two separate outputs, each chain having different primes from the other.  

The one thing I've done that might be a bit weird there is to try to allow for bypassing the all-passes somewhat, not by reducing the R value, but by using multiplex/de-multiplex routing that allows you to have a variable blend of all-pass-filtered and not-so-all-pass-filtered sound.  The control for that ends up being kind of like a "diffusion" parameter in a reverb algorithm, or a "smoothness" parameter (as opposed to "perception" or noticeable echos resulting).  But it is the higher R values with the all-pass filter that gves you that lingering reverb effect that keeps it out there, going and going.

Am I repeating myself?  Have I said all this sort of thing before?  If so, sorry.  I just thought I would share this latest circuit because it seems much more well-behaved and reasonably tuned than a lot of the others I've tried; and now I'm wanting to explain it so you can make sense out of it.

Here, I combined 3 different depths of "blended multi-tap":  short, medium, and long.  Interestingly, it seemed to work better to put the short after the medium.  I also threw the long along a different route.  There is a lot one could do with experimenting in how to blend the output and mix feedback through such a circuit, and I've probably built dozens of these over time with completely different and complex configurations.  Some sound decent.  Many are unstable.  Once I had this one seeming to be doing a good job, then the next challenge came with how to work out a stereo effect.

One classic way to do stereo in/out is to simply change the delay amounts between them.  Okay, that's easy.  But not if you want to keep the values prime!  And I found that if I used non-prime values anywhere (usually by accident), I would always end up with nasty ringing when the circuit was properly triggered.  So in this circuit, I went back into each blended multi-tap and set it up to allow an extra input parameter to switch it between any of 3 different sets of values for the delays.  If the input is 0, you get the default delay primes, and if it is positive, you get a different set of delay primes, and if it is negative, yet another.  The adjustments tend to be rather small values (and of course, always even).  That let's me have 3 different instances with slightly different sound, but still close.  I may have even allowed that input parameter to be used to set the number of samples for some inter-stage delay somewhere, but I can't remember if I kept that in the final circuit.

It's this "long reverb" circuit that includes a bit of filtering.  The only thing I really insist on having for filtering is a high-pass to eliminate any DC buildup along the feedback lines.  But most natural-sounding reverbs have significant low-pass going on in one or more places in the circuit.  Unnatural reverb with no high frequency roll-off has lots of uses, though.  I kept it fairy simple, except that I let a single control parameter vary between a min and max for both the upper limit and the lower limit.  Well, they are not really "limits" since I'm only using a single stage filter.  But I also threw in a damper here and there. Good sounding acoustic spaces often have the most unfiltered sound in the 1KHz region (very *broad* region), so I tried to aim for that while still letting the control sweep across a reasonable range.

I decided to allow the feedback lines be routable to the outside of the block if desired (with a default being an internal patch when you don't supply any values to the feedback input pin).  That way, you can have different blocks feeding back across to each other, even mixing some of their own feedback with that of other blocks.  Rather than depending too much on extreme feedback values, which tends to cause a lot of headaches with resonant explosions, I decided to rely more on extended delays to lengthen the reverb time.  But the feedback is still important.

So then, the stereo part was relatively obvious, except I had all these outputs, and needed to find a reasonable way to mix them to get a decent-sounding output.  Some of the outputs I mix fully to one output channel and then I throw a bit of its negation to the other output channel, for wider separation of that set of outputs, but here I didn't add a small delay (a few up to 17 samples) as you might for binaural effects or surround sound encoding.  Other outputs might need to be blended more to get more presence in the center.  All that is fine and well, but ... I thought I probably needed yet another block.  So I added a third one besides the one handling the left input and another handling the right input.  This extra one just takes the blend of the left and right, and then it's reverb output ends up being somewhat more narrowly mixed into the final output (not quite mono, but with reduced separation).  Is it really needed or helpful?  I don't know.  But it seems okay.  The only issue is that it might be pushing this reverb into becoming a cpu hog.  But the circuits I've tried it with didn't have any problem with it, probably because I was replacing even larger reverb circuits previously there.  :-)

Now, with all that explained, have a look and and a hook (...it up to your favorite reverb-testing source, whether that's a file block or a microphone wave input block or a jambot circuit or a special impulse and noise generator with spectral display on the output, or whatever) and a listen, and let me know what adjustments you find work best to make it sound better.  As it sits, it does *not* use any warble/chorus effect, which is another way to get diffusion effects and avoid resonant frequencies.

As is often the case, I find that raw control parameters between -1 and +1 often need to be remapped to other ranges, sometimes with an adjustment curve (so the unconnected pin that has a 0 value will end up providing a more reasonable "default" value within the circuit).  That leads to various formula blocks here and there.  To avoid using the sqrt() function, as in sqrt(a/2+1), I might instead let the curve be shaped a bit differently and do 1-((0.5-a/2)*(0.5-a/2)), but split that across three steps (formula for 0.5-a/2 or equivalently (1-a)/2, then a multiply block to square the first formula's output, then another formula to subtract the square from 1).  I'm sure this can be confusing when you see this kind of stuff in my circuits, but if you hook up a control to the input and and a display of some kind on the output, you can quickly see what the general effect is.    There isn't that much going on here because I left the circuit as a group with 2 ins and 2 outs and no external controls.  So if you want to have pins for those, simply add them and label them before doing the "create closed" box.

One that is especially weird is a "compensation" for overall volume that I tried to achieve in the final circuit -- I have a wetness control parameter (vs. dry) that is itself mapped within each subblock (might have been more efficient to map it first, once), and if the control goes to all dry, then the sound is much louder.  When going all wet, the reverb can be significantly quieter.  So I added some additional gain in the last stage before output, where the amount is based on a formula that maps that wetness through a curve.  It isn't perfect, by any means, but it seems to help keep things sounding more consistent.  I also added a saturation effect there, which was probably a bad idea (you can turn the saturation down to 0 to bypass it).

None of this is particularly unusual, insightful, or clever, and I've already posted lots of circuits that do these sorts of things.  But I'm just trying to make sense of it in case you try to understand what you're seeing and it's seeming a bit too complex. Despite being nothing new, in that sense, it still is a pretty decent sounding reverb.  Maybe not as long as I would prefer for special uses, but still long enough for most "normal" cases.

--
Keith W. Blackwell

Keith_YetAnother_LongReverbX3.ABox2

Rune Lund Sørensen

unread,
Aug 1, 2015, 4:24:53 PM8/1/15
to Analog Box

 Hi Keith (and others).

Did a short test run on your long-verb with some percussive sounds. Claves sound good (short high pitched sine with slightly modulated pitch- it's in the PercusiONE circuit). Snare not so much- The noise part of the snare sound generates lowfrequency warbling comb sounds. This could probably be avoided by tuning the delays.

Generally speaking, the reverb has an echo tail which is kind of reverse of classic reverb design- distinct echoes first, diffused tail after- and with sharp percussive sounds it can get scratchy. 'l have to try it out with some instruments though. I figure this will be good for pads and maybe basslines too...?

Now, since I'm writing a post here, I might as well share some of my own experiments from over the past months. 

First off there's the 'BarrVerb' named after Keith Barr who worked at Alesis. The topology is really simple. Four stages of AP+AP+Delay with in and out taps in a feedback loop ( https://valhalladsp.files.wordpress.com/2010/08/rev_algo1.jpg ) - this can be tuned to sound really nice, albeit not too 'realistic'. You could at a multitap delay before the input to simulate early reflections.

Next up is 'Nestor' - an experiment with nested allpass filters. I've used Schroeders design, and method of devicing coefficients (all Schroeders allpass series' delay values seem to be primes approximately 1/3 smaller than the previous one).

The nests are connected in serial and paralel at the same time, with a crossfade controlling the mix of the two. This topology can produce a very rich tail with little to no ringing. Again, if you want realism, add multitaps before the input for early reflections. (technical note on the nests: in order to circumvent the 1024+ samples feedback delay, extra compensatory delay modules are added to the feedforward path)

The next experiement I've mentioned before - the combination of scattering junctions and allpass nests. This is a highly unstable combo :P But it can produce an almost inifinite tail. Try it with short sines to get that 'das boot' sound ;) - I've also found that it's usefull for creating cymbal sounds- exiting the circuit with a short burst of filtered noise or similar ;)

Finally, I tried to do Dattorro's plate (/tank) verb in abox. (see https://ccrma.stanford.edu/~dattorro/EffectDesignPart1.pdf ). One of the many challenges were creating allpass loops at above 1024 samples, with multiple tap outtakes. The circuit siffers from the all too familiar lowfrequency comb sound, caused by the 1024 sample delay on feedback I suppose- I've tried to compensate for that in the block constructions, but somehow it persists... This can sound really good in a mix though- Listen to the attached jambot for an example (also features the junkverb on maritime sonar and cymbals :P ).

Now, if I could get one wish granted from Andy, it would be a delay line object with a feedback/resonance pin like the delay object, but not limited to 1024 samples, and a tap-out object with just a sample length pin- just like you can do with memory buffers, but with the resonance feature - That, or a comprehensive guide on how to do feedback in a memory buffer w.o. the 1024 sample latency. This would make the construction of larger reverbs (and physical models of stuff) so much easier, and less prone to that evil 1024 sample comb sound...

Oh and before I end this post- a bit about tuning delay lines... I've found that modifying Schroeders supposed algorithm (Prime -> *0.33 & nearest prime -> * 0.33 & nearest prime etc), can yield good results. Going with the golden ratio instead of 0.33 is a winner ;) At one point I tried to make a prime module, but I gave up. Used txt files with tables instead.
BarrVerb.ABox2
Datorro Plate.ABox2
Datorro Plate mkII.ABox2
JunkVerb vX.ABox2
Nestor.ABox2
VerbDemo.ABox2

Keith Blackwell

unread,
Aug 2, 2015, 11:16:34 PM8/2/15
to analo...@googlegroups.com
On 8/1/2015 2:24 PM, Rune Lund Sørensen wrote:
Did a short test run on your long-verb with some percussive sounds. Claves sound good (short high pitched sine with slightly modulated pitch- it's in the PercusiONE circuit). Snare not so much- The noise part of the snare sound generates lowfrequency warbling comb sounds. This could probably be avoided by tuning the delays.

Hey, thanks for the interest and especially for sharing the additional experiments, and most of all for that URL with the paper.... I had read what I could find many years ago and there simply wasn't a whole lot -- maybe there is a lot more research knowledge available on-line these days.  This was an especially interesting and relevant read.  It's amazing how even a little bit of knowledge can have such a huge impact.  If you want to post other such references, that would be great (apparently you've been doing your due diligence :-).

It's probably easier for me to substitute some of my building blocks into some of your experiments than to try to salvage what I was doing.  And while I have in the past used golden-ratio and similar multipliers (sometimes a square root of something, just to ensure it was an approximation to an irrational number), letting a circuit auto-set the individual delays in a series based on a room-size parameter, there wasn't any practical way to convert those to primes (odd integers yes, but primes no).  I like your four junction corners design and the more recent variations you've put together with it.  I didn't care as much for the plate circuit because is has a very noticeable low-frequency flutter (growl, really), which you mentioned also.  I think it could be salvaged with some adjustments, maybe.  You seem to be looking for more of the smooth plate-like reverb (which is what the paper was about), which makes sense for percussion and even instrument synthesis components.  I like that and want to borrow these ideas, but I also like the multiple-tapped delay sequences for adding more natural-sounding short reflections and even long reflections for large natural spaces, even if they aren't suitable for percussion.  Oh who am I kidding?  I think I just like the idea that I can create a circuit that does something like that at all, so it's fun exploring all the possibilities.

I didn't necessarily read every word thoroughly, so maybe I missed it, but is there a particular reason for starting with longer delays and moving in sequence to shorter ones (as in the all-pass cascades)?  I would have thought it was better to go the other way; if there is any difference at all.  Maybe in most of the circuits we're looking at, there is no mathematical difference?  Most of the more recent stuff I've posted uses some seemingly-random arrangement, or it starts big, goes small near the middle of the sequence, and then gets bigger again toward the end.    With the inter-stage blending that I was doing, it might make a difference because each stage (or some at least) can be partially bypassed, meaning whatever comes last could have greater prominence (this the bypass really *should* vary across the sequence).  So it could be better one way or the other, but I haven't tried swapping things around and comparing them.  There are just too many things to experiment with!  The world is full of things to discover, and life is too just too short and too busy to do it all.

Another topic we might discuss would be meta-circuitry to help analyze a reverb's behavior -- what do you feed them, what do you do to see what might be wrong with the output, etc.  You are apparently focusing on particularly challenging instruments or entire jambots.  I do the jambots, and often use a File object to stream in some wav file I might have laying around (like the sound track from a concert video I've edited, or an album, etc.).  Sometimes I also feed impulses:  maybe about 3 spread out slowly, then a randomly-fired sequence of rapid impulses that sound kind of like granular noise between the third and fourth beat.  The former can be good for examining early reflection alignment in a scope display, while the latter can be good for viewing the output via a spectral display.  But in the end, that can only tell you what might cause it to perform badly, but it can't tell you that it sounds good.  You have to listen for that.

BTW, as usual, your jambot is very cool.  Well laid-out, simple to follow, and seemingly not over-burdened with complexity; and the amazing part is that it generates sophisticated results that sound great.  Mine are quite the contrast to all that!  Not that this is a contest or anything, but I'm just amazed that you (and others) can do this -- if I build a jambot, it's a mess, and then trying to tidy it up and make it presentable usually uncovers sub-circuits that were essentially doing nothing, or I try to "improve" on something by re-factoring the circuit and I end up destroying it.  It takes an enormous time investment to make one presentable, so sometimes I just don't bother.  I can't start them out in a nice modular arrangement because I don't know yet what I want them to do or what I will want to change -- once you've committed a sub-circuit to its own group block, then it is a huge pain to go back and add new interface pins later (sometimes I have the foresight to add unused pins reserved for future use, and then it seems I never get around to needing them :-).

Anyway, I appreciate all the sharing here -- its informative and inspirational.
--
Keith W. Blackwell

Keith Blackwell

unread,
Aug 3, 2015, 1:40:39 AM8/3/15
to analo...@googlegroups.com
Speaking of sub-circuits that don't actually do what you thought they did, ...
I just found a defect in my "Stereo AllPass Diffusion-verb1" group block (probably also in variation 2) where the RD input is driving a Multiplexer that should be in cross-fade 1/2 and 1/2 at the center mode, but instead it is in multiplexer mode (0 at the center).  Duh.

I think the order of sample sizes should not normally matter, mathematically, except that there are some rounding or truncation errors that can create differences -- in my six-stager (mentioned above, except with no cross-channel mixing) with full diffusion, the differences between high-to-low and what I originally had are at -60dB, but if you change the diffusion amount to less than 1, you get much higher levels of difference.  After a full scale initial impulse difference (0dB), the rest of the difference seems to be starting its decay down around -14dB.  Just numerical implementation considerations?  Well, going further and comparing high-to-low against low-to-high, the numbers are considerably higher: full diffusion still gives an initial impulse difference at -11.5dB, and then a decaying tail that begins closer to -20dB.  Maybe that is more than just numerical error, then.  The difference signal itself is more colored (in an anti-comb kind of way) than either raw output, so it's not something you would want to make use of :-).  Still, to my eye, the High-to-Low version appears less comb-filter-ish than the Low-to-High version:



And I'm not willing to try to work through some math to figure out what's going on here.  :-)

--
Keith W. Blackwell

Keith Blackwell

unread,
Aug 3, 2015, 3:13:37 AM8/3/15
to analo...@googlegroups.com
In my prior post, I had changed one copy of a block to be high-to-low and then thought I was changing the other to be low-to-high, when in fact I was changing the same one.  So the second one was still in its original (non-ordered) sequence.  Sorry.  When I corrected that, I got a difference of zeroes.  So I think I just proved to myself that mathematically they are equivalent, unless of course you are doing some bypassing or other mixing along the way!  It's also very easy to make editing mistakes the destroy the integrity of a circuit.  :-(

I also tried changing the sequence to these value based on the golden ratio starting with the largest prime value that fits into one delay block:  1021, 631, 389, 241, 149, 89, 59, 37, 23,13 (how short would you go? I tried going down to 23, which was 9 stages!).

'Nuff 4 Now.
--
Keith W. Blackwell

Rune Lund Sørensen

unread,
Aug 3, 2015, 6:10:16 AM8/3/15
to Analog Box
>If you want to post other such references, that would be great

Here's a special treat for you :P -> https://www.gearslutz.com/board/geekslutz-forum/380233-reverb-subculture.html The amount of info in this thread is astounding! You'll find links to papers like the Dattorro one I posted previously, insider discussion about who reverse engineered whose algos when, how to avoid ringing, speculations on how this and that verb was made, etc etc...

I've obsessed over reverb design for quite a while now :P - A few other goodies: 

> is there a particular reason for starting with longer delays and moving in sequence to shorter ones

I've been doing that out of blind faith lol. It's how Schroeder did his allpass series (guy was an acoustic engineer IIRC), so I figured there's a reason behind it. I am not sure though. Gonna test it right now (see screenshot) - it would seem that you are right in your assumption that the mathematical difference is none.



> what do you feed them, what do you do to see what might be wrong with the output, etc

Impulse response and tail are the first things I listen to. I rarely use scopes to analyze anything. Just my ears. Short noise bursts excel at drawing out all the ugly stuff you'd wanna avoid in a verb. Then I use various percussive sounds to see if the sound produced is desirable in a mix (what does the verb do to a bass drum? etc). I also like to hook up short percussive sines to see how much of the input frequency is preserved vs. diffused. The Junkverb can produce some weird pitching... You are right about my taste for plate like verbs- I think the nestor thingy is the nicest sounding reverb I've come up with yet.

>I'm just amazed that you (and others) can do this -- if I build a jambot, it's a mess

Ha! join the club :P I've developed a discipline contrary to my messy nature- if I don't tidy up while creating, at some point I lose track of what's going on, and what I placed where etc... My modus operandi is usually one sound at the time, then once it does and sounds like I want it to, I wrap it up in a group / module. If I have to go back and ad new pins, I suffer the lengthy process of copypasting and regrouping.

>how short would you go? I tried going down to 23, which was 9 stages!

The really short delay lengths in allpass chains are problematic to my ear- I find that starting the chain at a longer delay than the sampleframe limit is desirable. I've attached an allpass filter that operates between 1024 and 2048 samples- scaling it up to longer delays is trivial. The trick lies in compensating for the added 1024 feedback latency in the feedforward path (delay to output). 

Finally, I found a 'nestor' circuit with stereo input- posting it here with the test circuit I used...

Oh- on another note, I've been playing around with Pure Data ( https://puredata.info/downloads/pd-extended ) for a while- You might wanna look into that if you can stand the lack of esthetics. The delay/latency problem I have with abox, is solved by using memory buffers in pure data. The trade off is one-directional visual flow- I hate that. Makes constructions with feedback / bi directional pathways etc extremely confusing... And interrestingly (but perhaps to no surprise) the same topologies sound completely different in PD compared to aBox...
AP1-2 v2.ABox2
NestorTester.ABox2

Keith Blackwell

unread,
Aug 16, 2015, 8:48:40 PM8/16/15
to analo...@googlegroups.com
On 8/3/2015 4:10 AM, Rune Lund Sørensen wrote:
>If you want to post other such references, that would be great

Here's a special treat for you :P -> https://www.gearslutz.com/board/geekslutz-forum/380233-reverb-subculture.html The amount of info in this thread is astounding!
I haven't gotten through all of it, but I've noticed an idea that I myself have thought of several times but never bothered to implement, which is cross-fading between different delays and then changing each one's amount before cross-fading back.  Have you ever put something like this into your feedback lines?  Here's an example I threw together (i.e., I finally got around to implementing it) that seems it should work.  As usual, I assume there are much simpler ways to do it.

And thanks for all the links.  I'm sure they will absorb several weekends.  :-)



Oh- on another note, I've been playing around with Pure Data ( https://puredata.info/downloads/pd-extended ) for a while- You might wanna look into that if you can stand the lack of esthetics. The delay/latency problem I have with abox, is solved by using memory buffers in pure data. The trade off is one-directional visual flow- I hate that. Makes constructions with feedback / bi directional pathways etc extremely confusing... And interrestingly (but perhaps to no surprise) the same topologies sound completely different in PD compared to aBox...

I already had PD on my desktop, but every time I've ventured into it, I've gotten turned off rather quickly.  If I was going to take the time to go up a learning curve like that, I think I would prefer it to be Faust.

--
Keith W. Blackwell
Keith_BlendRandVary.ABox2

Catalin C.

unread,
Jun 23, 2019, 2:56:40 PM6/23/19
to Analog Box
Mr. Blackwell, I believe I share this fondness (some would say weakness) for collecting reverbs, ever since I was working with VST chains and browsing the vast repositories of freebies.

The best, IMO, is one based on the famous "Freeverb" algorithm, which can find quickly with a search.


Agreed, Freeverb is already a classic, dating from 2000, and probably the best effect than was given to the audio community... for free. I know its sound from a DirectX plugin implementation, rgcReverb, loved it.

It was in your 4barbot3 that I discovered an instance of the Freeverb block, so a month ago I decided to copy it and audition it in detail. I use a simple kick drum sequence for this. The spatialization is funny... the wet signal is panned in opposition to the source. But that's not entirely unrealistic, there are complicated & very reflective interiors that bounce the reflections to sound somewhat close to that. And should it really affect the stereo image, the monoization control is there to help.

But I got suspicious when I compared the full wet signal while sweeping left-right and... sounded quite different. I did what seemed logical to do in such event: build up a pink noise source to test with it. Yep, spectral differences... While playing, I was able to identify some pins left unconnected, as well as other minor issues.

If you find something you like in there, and improve on it, please oh please share the improvements back with me, or with all of us.  I'm sure there is plenty of room to improve.  Many of these circuits use filters within them, and those can become overloaded a bit easily if the gain structure is not set up correctly within the circuit, resulting in "nasty", "glitchy" sounds.


Basically, here's what I did: in my modified copy, the allpass cascades now have equal sample params left vs. right. I made those internal pins check for bad data (none of them did). And to make a stereo effect, a slight "beating" of the wet signal from left to right, I resorted to putting 4 RCs (set to "both"), for each channel, one that links the first cascade to the second, the other at the exit from the second cascade, and with a difference btw. time values of 450us or so - and in the other channel these values are swapped. I'm a fan of RCs', I use them regularly to smooth the transients.
The effect was outstanding mainly because of this smoothing - I can't tell if the expected "beating" btw. L&R actually works, I tuned the values with the 4barbot3 playing and found I couldn't even come close to 1ms top val., otherwise it sounded dull, too narrow in spectrum - but reflections are less harsh,  the decay is noticeably smoother, you can set the feedback much closer to 1 without issues, and IMNSHO it sounds overall a tad better. This is why I decided not only to use it regularly but also to share it.

I'll give it in two variants: the open group, stereo version, which is the one lifted from 4barbot3 with my edits, and what I would call a "rack", a file comprising a collection of block objects to be copied and pasted in new circuits, here being two versions of Freeverb, one with L-R inputs the other with single input and a panpot, and I've also made a control for dry-wet mix, some other controls and a stereo mixer. As it can be seen in the screengrab, it has notes for less advanced users. This is how i'll post many of the circuits i'd like to share, plus of course separated complete circuits for auditioning in case of instruments.
Note: I always set my circuits to "Do not ask to save", sometimes I need to discard changes quickly and start over, so if anyone edits anything in these and forgets it all and closes the circuit, neither ABox will remind them about that.

So let's see again what is this Freeverb capable of. I'd appreciate any feedback (pun not intended). I've also saved the rack to my Drive in ABox Circuit Repository/Effects folder, I've enabled visibility to anyone, here is the link:

Freeverb_and_accessories_rack.png
Freeverb_and_accessories_rack.ABox2
Freeverb_CKmod.ABox2

Keith Blackwell

unread,
Jun 23, 2019, 5:50:19 PM6/23/19
to analo...@googlegroups.com
On 6/23/2019 12:56 PM, Catalin C. wrote:

It was in your 4barbot3 that I discovered an instance of the Freeverb block, so a month ago I decided to copy it and audition it in detail. I use a simple kick drum sequence for this. The spatialization is funny... the wet signal is panned in opposition to the source. But that's not entirely unrealistic, there are complicated & very reflective interiors that bounce the reflections to sound somewhat close to that. And should it really affect the stereo image, the monoization control is there to help.

Ooo, can you see me wincing?  Back when I first posted that, I had not yet been "educated"; nowadays I would probably never prefer that particular reverb circuit.  I stated when I posted the freeverb block that I made some modifications to the circuit that did not stick with the original source code that I referred to, and that was back in the days before Rune Lund Sørensen posted his reverb circuits, references to some great papers, and his test circuit that used some impulsive sounds.  When you apply some impulsive sounds, my freeverb-like circuit proves to be not particularly freeverb-like.  In fact, I think it sounds pretty horrible.  Yours is a bit less ill-behaved.  Whatever I did to the original layout/algorithm (or perhaps it is yet another 1024-byte chunking in feedback problem, or maybe it was an actual *mistake* I noticed later but didn't fix), it is probably an insult to Jeezer to say this still "freeverb".  :-)

Some of the stuff Rune posted is very nice, and highly recommended.  But when I try his test wrapper on my freeverb block (or yours), I hear some nasty stuff that I just don't like.  It's probably all the extra delays and the "spreader" stuff, or whatever I put in there.  In the right setting, of course, even a bad-sounding reverb can be exactly what the doctor ordered, so it's not as though it doesn't have a place.  I just wouldn't recommend it for general use.

Most recently, in most of my circuits, I use non-integer delay amounts (with interpolation) and change them along an all-pass chain such that a divider close to or well under 3 (but as close to irrational as you can get with floating point) is used to determine each step change from a single starting value, and then I let that starting value be ranged by a "size" input.  The irrational divider still helps avoid nasty ringing.  But it's always the additional, outer connections that make or break the overall effectiveness.  Instead of just using pure all-pass, I usually add some longer delay chains into an outer feedback loop, and tuning all that is horrendously difficult.  No matter what I do, I still usually end up with a certain amount of flutter or pulsing that is evident with impulsive input signals -- it is easy to get them to sound great on long swelling sound sources, but impulsive sounds like snare hits reveal the flaws quite well.  Sticking with pure all-pass chains doesn't have this problem, of course.

For non-impulsive stuff, I still like the original EON reverb posted here by John Paul Burtell, or my own modified versions of it.  EON is for extra-long reverb.  Think "Enya".  :-)  But for impulsive sources, you can just stick an AP-chain reverb on the front end of it (or, think of it as sticking EON onto the end of whatever AP-chain reverb you come up with, and letting that do the lengthening instead of adding external feedback).  Take the attached, just as a quick and dirty example.  It sounds good, I think. 

Out of all the reverbs I have laying around, most of which are not general purpose enough, I think the old Mesh Verb was pretty good (but it's R control input was kind of weird and really should be reworked).   I don't know if I ever posted it here.  Well, I'll go ahead and attach it here, but consider it as mostly an idea rather than polished implementation.  It has the strange property of having a natural pre-delay (despite the additional and somewhat redundant pre-delay control) and extreme diffusion right from the start -- very distant sounding.  But still reasonably smooth even on impulsive sounds.  The main problems seem to be that it has some hint of ringiness, and it is compute-intensive (even the spanning tree run takes a little while). I just now also tried to review a "MeshVerb2" I have laying around, but ABox kind of went off into the weeds for about 5 minutes trying to follow the graph.  So it's probably too large to even bother sharing, plus I didn't like the way it sounded.  :-)


 While playing, I was able to identify some pins left unconnected, as well as other minor issues.

That's the risk of sharing stuff here -- people find really embarrassing errors.  But hey, the more eyes to find and fix those goofs, the better.  :-)  It wouldn't surprise me if you found places where I had intended a mux to be 1/2 and 1/2 but never set it.  That is one of the most common errors in my circuits.  Like expressions in some software that are intended to help optimize something, but which were never tested by the themselves to see if they really were helping or doing what they were intended to do.  Ugh.  I hate that.


The effect was outstanding mainly because of this smoothing - I can't tell if the expected "beating" btw. L&R actually works, I tuned the values with the 4barbot3 playing and found I couldn't even come close to 1ms top val., otherwise it sounded dull, too narrow in spectrum - but reflections are less harsh,  the decay is noticeably smoother, you can set the feedback much closer to 1 without issues, and IMNSHO it sounds overall a tad better. This is why I decided not only to use it regularly but also to share it.


Try using Rune's test wrapper -- it can be very revealing.  But yes, your modifications make it much more usable, for sure.  Taking out some of my original mods (which unfortunately aren't marked as such) would probably help as well.  But sometimes I want more high-end, like a plate reverb sound, so a lot low passing is contraindicated there.  The nice thing is that that freeverb circuit is relatively simple, not horribly complex or hard to understand.  But there is probably a lot of junk I put in there that is just wasting CPU cycles.  All those DAMP3 blocks are probably overkill, for example.

Since you might find it difficult to find that test wrapper, I'll attach it, and include another reverb of mine as an example reverb block just to show how it's intended to be used.


This is how i'll post many of the circuits i'd like to share, plus of course separated complete circuits for auditioning in case of instruments.


Hey, thanks so much for sharing!  It really helps keep this community alive and interested!

--
Keith W. Blackwell

PureAP+EonVerb.ABox2
Keith_MeshVerb.ABox2
Runes_ReverbTestWrapper.ABox2

Catalin C.

unread,
Jul 1, 2019, 5:07:06 PM7/1/19
to Analog Box
I have to admit I've been very enthusiastic, and thus failed to see some details in the circuit... which might have their place in a reverb, but still not in Freeverb. Also, indeed, the limitation imposed by ABox is noticeable. I apologize for my haste and I'll try to have some talk over mail prior to share other mods.

Some of the stuff Rune posted is very nice, and highly recommended.  But when I try his test wrapper on my freeverb block (or yours), I hear some nasty stuff that I just don't like.  It's probably all the extra delays and the "spreader" stuff, or whatever I put in there.  In the right setting, of course, even a bad-sounding reverb can be exactly what the doctor ordered, so it's not as though it doesn't have a place.  I just wouldn't recommend it for general use.

I'll try auditioning Mr. Soerensen's work as well.
What's interesting is that a 23-sample "spreader" was actually part of Jezar's algorithm, as presented on CCRMA's page about it. Still, I find it somehow unorthodox, I prefer that RC shuffling thing I do, although I still don't have a clear image of how the trick works (I've already seen, in my instrument circuits, how they delay the signal downstream, but here they are in succession, that's the issue). Plus they are good at low-passing. (so good you could even overdo it.) So those dampers should go away.
 
Most recently, in most of my circuits, I use non-integer delay amounts (with interpolation) and change them along an all-pass chain such that a divider close to or well under 3 (but as close to irrational as you can get with floating point) is used to determine each step change from a single starting value, and then I let that starting value be ranged by a "size" input.  The irrational divider still helps avoid nasty ringing.  But it's always the additional, outer connections that make or break the overall effectiveness.  Instead of just using pure all-pass, I usually add some longer delay chains into an outer feedback loop, and tuning all that is horrendously difficult.  No matter what I do, I still usually end up with a certain amount of flutter or pulsing that is evident with impulsive input signals -- it is easy to get them to sound great on long swelling sound sources, but impulsive sounds like snare hits reveal the flaws quite well.  Sticking with pure all-pass chains doesn't have this problem, of course.

That's pretty heavy maths for me but hey, I'm here also to learn... I never liked the idea of using fractional sample values and I don't understand what the interpolation option actually does (similar to pixel interpolation, in graphics, maybe?), but I'm aware that ABox can deal well with this, after all, what it sees flowing is a signal that varies btw. -1 and +1, so there are interesting things happening inbetween. Maybe that fine tuning would work eventually, I can't tell that right now.
Back to Freeverb, I looked upon it's schematic and I've noticed something interesting: apart from one or two, all sample values in the feedback comb filters are multiples of 3. Maybe that's what you were thinking about? Does that mean that if I built a delay cascade with three delays and clone it up to 8 summed instances (I'll also experiment for feedback implementation), as they are in the algorithm, and assign to each a sample value that's the divider of those Freeverb values, it would work in coming close to Freeverb? I don't think the resulting delay is that value multiplied by 3, and I can't tell how it works. But I'll try building that, hope it'll make a more "shareable" implementation of Freeverb.
By the way, that "rack" I've shared is now marked as WIP on my Drive until I can come up with something... more realistic, but equally simple, that's the spirit of Freeverb.
Yes, probably a simple, "honest" all-pass chain would be the safest option, sonically, even if it's the least impressive.
 
For non-impulsive stuff, I still like the original EON reverb posted here by John Paul Burtell, or my own modified versions of it.  EON is for extra-long reverb.  Think "Enya".  :-)  But for impulsive sources, you can just stick an AP-chain reverb on the front end of it (or, think of it as sticking EON onto the end of whatever AP-chain reverb you come up with, and letting that do the lengthening instead of adding external feedback).  Take the attached, just as a quick and dirty example.  It sounds good, I think.

I've already downloaded the Eon, actually I've been working, as of my previous posts, on a mod of it (therefore I like it too). It's the version with 6 AP-chains per channel. Have tried to make the first two chains much much shorter in sample values, like some early reflections... that didn't sound right. Now it's been retuned, tested and I still need to enter the latest chosen values in the "official" WIP file, make some other things, then take it back to the jambots for audition.
Enya's music rules... not only for its reverb.
 
Out of all the reverbs I have laying around, most of which are not general purpose enough, I think the old Mesh Verb was pretty good (but it's R control input was kind of weird and really should be reworked).   I don't know if I ever posted it here.  Well, I'll go ahead and attach it here, but consider it as mostly an idea rather than polished implementation.  It has the strange property of having a natural pre-delay (despite the additional and somewhat redundant pre-delay control) and extreme diffusion right from the start -- very distant sounding.  But still reasonably smooth even on impulsive sounds.  The main problems seem to be that it has some hint of ringiness, and it is compute-intensive (even the spanning tree run takes a little while). I just now also tried to review a "MeshVerb2" I have laying around, but ABox kind of went off into the weeds for about 5 minutes trying to follow the graph.  So it's probably too large to even bother sharing, plus I didn't like the way it sounded.  :-)

Already looked at it, but with my CPU I'll be careful not to run anything else besides ABox before that audition. Agreed, it's kind of huge, but very ambitious, it looks like very serious physical modelling inside, and I like the idea.
 
Try using Rune's test wrapper -- it can be very revealing.

Thanks. I like that sequence - autopanning with dividers? that surely didn't occur to me! It tests for transients and spectrum as well, very important thing. So I adopted it, and after running it I test the reverbs with 4barbot3 again, that gives a more general sonic image.

Again, thanks for encouraging. The reverbs will have to wait for me a little - I've got something else ready, coming back soon.

-

Catalin

Rune Lund Sørensen

unread,
Jul 3, 2019, 6:28:15 AM7/3/19
to analo...@googlegroups.com

A few comments about delay lengths and other stuff:

Having multiple delays, wether combs or allpass, with common divisors/multiples will produce ringing, which of course can be mediated by lowpass filters, but its more desirable to prevent than fix. This is one of the problems i have with vanilla freeverb. The easy way to ensure minimum ringing in the delay part is by sticking to primes for delay lengths. As for non integer delay lengths that is a physical impossibility when dealing with digital delay. There is no such thing as half a sample in the digital realm.

Then theres the question of ratios / proportions. Schroeder used prime number aproximations to series of D*n^-3. Ive had better results using a prime approximation to the golden ratio. Ive had really good results with Schroeder allpass nests (that is three ap filters nested inside one ap loop) with ~golden ratio primes in descending succesion, the outer loop having the longest delay.

The ap-nest building block can be found inside most of my reverb circuits along with a solution to overcome the 1024 sample extra delay block caused by feeding back a signal.

I'm posting from my phone so I can't attach circuits right now, but if anyone wants I'll send some stuff later.

--
You received this message because you are subscribed to a topic in the Google Groups "Analog Box" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/analog-box/vH6nekCC11M/unsubscribe.
To unsubscribe from this group and all its topics, send an email to analog-box+unsubscribe@googlegroups.com.

To post to this group, send email to analo...@googlegroups.com.

Catalin C.

unread,
Oct 25, 2019, 8:38:55 PM10/25/19
to Analog Box
Excellent points.
Since late July I've been trying my hand, as part of a bigger project, at small space modeling (as in instrument resonance). This month I returned to reverbs.
Among other things, I felt it was important to know the relationship between the values we enter in our circuits and what ABox actually "sees".

On Wednesday, 3 July 2019 13:28:15 UTC+3, Rune Lund Sørensen wrote:

A few comments about delay lengths and other stuff:

Having multiple delays, wether combs or allpass, with common divisors/multiples will produce ringing, which of course can be mediated by lowpass filters, but its more desirable to prevent than fix. This is one of the problems i have with vanilla freeverb. The easy way to ensure minimum ringing in the delay part is by sticking to primes for delay lengths. As for non integer delay lengths that is a physical impossibility when dealing with digital delay. There is no such thing as half a sample in the digital realm.


Duh, I was questioning that because I've been confused by the way fractional values are treated (the "Always Interpolate" option to the Delay object).
I use a formula object btw. the knob and the delay, so as to round the knob's output to the nearest integer, thus no more need for that interpolation. After this formula I make another connection to another equation that gives the equivalent value in milliseconds. I had developed this patch for the (in)famous "Binaural Pan" and even perfected the conversion formula since then.
For a being the # of samples, we have a/0.043066 which gives us a very reliable indication across the 0-1024 samples range - that's 0-23.22 ms. Why the divider isn't 0.0441 is a mystery, I found the mentioned value by trial. It's just for display anyway, but still useful. See the formula_samples_msec patch.
I also showcase it in two other blocks, two mods to the anti-comb filter, because we need to model resonance chambers. I've stacked three of these to model all three dimensions of a chamber, and outside the block three displays show the delay values in ms. I'm giving the single modded anti-comb too, maybe some people want/need to keep their jambots stripped down. Note: for the 3D model, the input audio gets divided by 3 before feeding the individual anticombs. It should be a bit more complicated to get realistic, I know... we might discuss that if needed.
 

Then theres the question of ratios / proportions. Schroeder used prime number aproximations to series of D*n^-3. Ive had better results using a prime approximation to the golden ratio. Ive had really good results with Schroeder allpass nests (that is three ap filters nested inside one ap loop) with ~golden ratio primes in descending succesion, the outer loop having the longest delay.

The ap-nest building block can be found inside most of my reverb circuits along with a solution to overcome the 1024 sample extra delay block caused by feeding back a signal.

I'm posting from my phone so I can't attach circuits right now, but if anyone wants I'll send some stuff later.


Now I'm aware you've been talking about how to make the feedback loop less than 1024 samples, that's also good to know.
I've picked an "ap-nest" from one of the previously posted reverbs, measured a whooping 96 ms in the wave output, but when trying to sum those delay values it gave 102 ms or so... don't know why.
As for the primes, I figured they could be selected for input from a CSV file which I'm also giving, they are entered here according to http://www.factors-of.com/prime-numbers-before/Prime-numbers-from-1-to_1024_

Coming back soon,

-

Catalin
formula_samples_msec.ABox2
3D_anticomb_block.ABox2
anticomb_mod_block.ABox2
primes-1024.csv
Reply all
Reply to author
Forward
0 new messages