Reverbs creation


#54

Want to share with you one of the dopest threads about reverbs


#55

Also want to share one of my particular interests in reverb creation. I would like to build something capable of freezing aural state, something in style of Quantec QRS freezing.
There was an example in SYROBONKERS interview where Richard James was interviewed by Dave Noyze

Audio will expire tomorrow


#56
Want to share with you one of the dopest threads about reverbs

Thank you for this link - I just started reading. It's very interesting!


#57

This pdf is also very good imo.

Also just stumbled upon this VST reverb, made in c++. Look awful a lot like "Axoloti code". But I think it is a big project to convert it, if even possible. But I cant say;


#58

I would like to add another really important trick I read only in very few places.

When you work with reverb, which is based on delays most of the time, you can run into problems with the delay lines colliding and creating unwanted artifacts, like ringing and metallic sound.

The trick is..... To use prime numbers for the individual delay lines length.. The reason for that is because prime numbers only add up with themselves and 1. So the risk og the delay lines colliding is reduced significantly when using primes over for example using 2 or 4 or 8, which are not primes. If you have 3 delay lines and they are set to 2 4 and 8 you will have problems.


#59

Just because it fits here very well: There is some info about reverbs in this thread as well.

There is one more thing, that I wanted to share here: Allpasses can sound very metallic even though they have a flat amplitude response which should guarantee no audible coloration. For themselves, allpasses indeed have no coloration. But when used in feedback loops, you can get pronounced metallic ringing. Here's why:

              +-----+        +---------+
Input ------->|  +  |------->| allpass |----------+----------> Output
          +-->|     |        +---------+          |
          |   +-----+                             |
          |             +-----------+             |
          +-------------|  fkbGain  |<------------+
                        +-----------+

With fbkGain==1 we would get an infinite looping "reverb" type of sound. With fbkGain<1 we would get an exponential decay in the "reverb" tail. I'm putting "reverb" in quotation marks because it doesn't really sound like a reverb, but the concept is very similar to one.

With any fbkGain<1 we would notice some more or less pronounced ringing in the decay tail. But all of the blocks that are used have a flat amplitude response, so why do some frequencies stand out and create the ringing?
The problem is that the allpass has a frequency dependent phase shift, meaning that some frequencies are delayed more than others. That's the whole point of the allpass and that's what makes it "blur" the audio which is very useful for reverbs. However, in the feedback loop that means that some frequencies travel through the loop faster than others. Let's say our fbkGain is 0.5 and the allpass has a delay of 100ms for frequency A and a delay of 200ms for frequency B. After one second, frequency A has traveled through the loop 10 times and has passed the fbkGain block each time. That means after one second, its amplitude has dropped to 0.5^10 = 0,00097 of its initial amplitude. Frequency B however has only cycled through the loop 5 times and its amplitude is still 0.5^5 = 0,03125. The result is that frequency A is only barely noticable compared to frequency B. Now we have ringing.

How to avoid this?

To really remove the problem, we would have to make the feedback gain frequency dependent so that it corrects for this. If frequency A is travelling though the loop twice as fast as frequency B, it should be attenuated so that it's amplitude after two passes matches that of frequeny B after one pass. Depending on the type of filter chosen for this task, it will more or less be an approximation. So ringing likely can't be removed entirely but it can be somewhat reduced.

Another option is to add modulation to the allpasses. By modulating the allpass time, we can make the cycle times of different frequencies more random. This works very well but also creates a chorus-y sound. I like it but it might not be for everyone.

The third option is to make the loop "longer", meaning that audio cycles through the loop slower. It can be done by adding normal delays or additional, differently tuned allpasses. This reduces the frequency dependent difference in the "cycle" times drastically and is commonly used in reverb algorithms. The problem is that longer cycles will also create audible echos in the reverb tail. To reduce this effect, the output of the reverb can be a mix of taps from different spots in the loop. Care must be taken to not mix audio in such a way that certain frequencies are always canceled out. This happens when you overlay a signal with a delayed version of itself - which is a comb filter. In theory, adding more taps to the output reduces the "comb" effect to an acceptable level but also increases the computational power required.


#60

Gives that "eventidish" sounds.. I love it :slight_smile:

But I'd like to add it also depends on what modulation you add.


#61

Hi there,

I'm using a series of allpasses by @TheSlowGrowth for my verbs. Via this thread I read that samplelengths in prime numbers are suppossed to give less metallic results.

How would I do that with TSG/filter/allpass m?

I calculated the values for time like this:

Does that make sense? Idea is to divide 64 (axolotis frac range) by the buffersize and multiply that by the prime number you wanna have.


#62

@Blindsmyth

If you for example want distribute 4096 samples within 0-64 do this:
64/4096 = 0,015625

So ONE sample out of 4096 on a scale on 0-64 is 0,015625

Then if you want to set the actual length to 4019 samples, do this:
0,015625*4019 = 62,796875

So if you have set the delay size overall size for 4096 and yo want to set the actual delay to 4019 on a scale of 0-64 the result is that you need to set the dial for 62,796875.

Let's do another one, to make it clear:
Delaysize is 2048
And you want to set a value 0f 1867 on a scale of 0-64

First do again:
64/2048 = 0,03125
So ONE sample out of 2048 is on a scale of 0-64 = 0,03125

Then to find out what to set the dial to, to get a value of 1867:
0,03125*1867 = 58,34375
So to set a value of 1867 out of 2048 on a scale of 0-64 set the dial to 58,34375

So yes, I would say you got it right :slight_smile:


#63

The calculations look good to me.

In my own reverb experiments I used a lot of modulation (I have a weak spot for the chorus-y, wide reverbs) so I didn't really care about the exact delay times in my allpasses.


#64

Ok great thx, good to hear that my logic thinking with axoloti improved and is actually usable :slight_smile:

I have very few resources in my patch over for reverb so I try to optimize the sound with the few resources I have.

Unfortunately I don't have enough sram for the dials to set the exact values. But I also have modulation. Does this prime number thing matter at all then when you also modulate the allpasses?


#65

The idea with the prime numbers is that the least common multiple of them is very large, resulting in less audible ringing in the reverb tail.

Ringing basically happens when a signal is overlayed with a delayed copy of itself (comb filter). That happens in the allpasses but also in the feedback loop of the reverb tank. The more often it happens, the more the ringing will be pronounced. Individual allpasses with a very small least common multiple will have a pronounced ringing, because it takes the signal only a few passes through the loop before it gets folded onto itself at the same place where it was folded onto itself before (does that make sense? I'm not finding the right words right now). With allpasses that have a very large least common multiple (e.g. with prime numbered allpass sizes), it takes the signal many passes through the loop before that happens, so the ringing will be less audible.

With modulation applied, you will get also prevent the signal getting repeatedly folded onto itself at the same positions. This reduces the ringing very effectively but also adds a chorus effect (which may be desired or not).

Bottom line: With modulation applied, I don't think the prime number thing really matters. Though I must admit, I don't have any scientific proof for that.


#66

I think it is a good idea to have individual lengths for the all-pass filters. This will prevent the ringing that TSG describes. And for this I think you have to use a dial pr. delay line. Thats is also how I have done it. Since Axoloti has got "fixed" delay line lengths, 1024, 2048, 4096. They are fixed to the power of 2...... So you have to set the actual delay line length using the dials.

I made this object you can try, which uses same input and you se the range for the 4 outputs on the dials:

BLIND.axp (1.8 KB)

If you want to optimize it even more, I dont think you need to use tables of 4096 samples to be honest. I think all the reverbs I have made in Axoloti and Pure Data, the longest delay length in samples I have used is 2048. So you can definitely save som SD-ram there.

If you want specific delay time suggestions, you could look up Schröeder reverb design on google. He give some specific delay lengths in milliseconds. And they are actually not very long, if I remember correctly below 2048 samples.


#67

Ok thanks!

I use different lenghts already. But the 4096 were indeed not needed, so I saved a little bit at this point.


#68

Does anyone have another link for the Erbe video mentioned earlier in the thread? Thanks, adn great to see all these reverb ideas!


#69

Have you shared this object yet?


#70

hey kausto, I just used your reverb as a base to make me a reverb for live perormances, for some reason yours sounded best to my ears from all the ones uploaded in this thread. I'm too much of a DSP noob to code my own verb, so this was pretty handy :slight_smile:
i switched the pitch shifter for a frequency shifter and tinkered a bit with other stuff, sounds cool, a ver y nice mix between delay and reverb!
8ap-loop-plus_myedit.axp (157.0 KB)


Call for patches that push Core to its limits, expose issues
#71

@urklang

A follow up on the reverb talk form the other thread.

This one I heard a port of for Pure Data and it sounds pretty good. Supposedly it is the concert hall from Lexicon 224x reverb:
https://www.convexoptimization.com/wikimization/index.php/Dattorro_Convex_Optimization_of_a_Reverberator

This one is the source code for the pretty famous freeverb, which is used in many devices. It has high quality sound:

I would personally love to hear/see these in Axoloti world.

For the Freeverb, maybe just even the all pass filters, so we have some more options to play around with :slight_smile:


#72

http://doc.sccode.org/Browse.html#UGens%3EReverbs

Some GPL'd verbs from SuperCollider.


#73

I added a few FDN based reverb in menu Help -> Library -> Community -> tiar -> FDN