Gated Reverb
-
@griffinboy I was playing around with faust and came up with this simple chain of allpass comb filters but it's hardly a good sounding end result
import("stdfaust.lib"); // Modulation parameters modFreq1 = 0.1; // Slow modulation frequency (Hz) modFreq2 = 0.15; modFreq3 = 0.2; modFreq4 = 0.55; modDepth1 = 5; // Small modulation depth (samples) modDepth2 = 7; modDepth3 = 10; modDepth4 = 13; // Modulated delay lengths modDelay1 = 350 + (os.osc(modFreq1) * modDepth1); modDelay2 = 490 + (os.osc(modFreq2) * modDepth2); modDelay3 = 633 + (os.osc(modFreq3) * modDepth3); modDelay4 = 877 + (os.osc(modFreq4) * modDepth4); process = _ : fi.allpass_fcomb(2048, modDelay1, 0.7) : fi.allpass_fcomb(2048, modDelay2, 0.6) : fi.allpass_fcomb(2048, modDelay3, 0.6) : fi.allpass_fcomb(2048, modDelay4, 0.6) <: _,_;
-
@griffinboy jesus, seeing Casey discuss in a forum has me awestruck. The M7 is my life elixir from album one.
-
Ah yeah that's a naive design indeed!
A real reverb is more complex.You might want to start by recreating some basic classic designs before you dive into making your final thing. There are a few things to learn and experiment with. Open up some of the Faust reverbs and get an idea of the architecture. There are a few different ways to design them. Usually you have a diffusion stage (series all passes, combs) and then a reverb tank (modulated all passes, or delay lines matrixed together so that they all feed each other and crisscross, or multi tap delays with a bunch of taps) and then a completely separate early reflections stage usually made from a multi tap delay. You also have filters inside these stages to shape the decay, as well as feedback around certain parts.
Getting rid of resonant buildups is the tricky thing. I use AI to calculate the ideal coeffs. But the traditional approach is a TON of math, plus a TON of typing in different numbers and seeing what sticks...
The forum link I posted has a great discussion that details one of the early quantec designs. I can't recommend enough that you go through all the pages on that forum. Especially paying attention to the discussion being had by the bricasti engineer.
Happy reading.
-
@griffinboy yes I need to design this from scratch and experiment with it to get a hang of it, the allpass filter thing was just a first attempt at not modifying an existing algorithm... I understand there is a stage of parallel comb filters, serial allpass filters and a need for prime numbers.
sadly there are no diagrams of the AMS algorithms, though I could find some of the lexicon architecture in the past... -
Reverbs are secret.
Soooo much work is put into the algo. There is no way in heck anyone would ever share it once they've created a musical algorithm, because it was likely the cumulation of years of research and iteration.But I wish you luck. I've taken a break from reverb, maybe to return in the future once AI can train on all passes properly (I've been asking the FLAMO researchers to help me out with that...)
-
@griffinboy this doesnt sound half bad lol
import("stdfaust.lib"); // Modulation parameters modFreq1 = 0.1; // Slow modulation frequency (Hz) modFreq2 = 0.15; modFreq3 = 0.2; modFreq4 = 0.55; modDepth1 = 5; // Small modulation depth (samples) modDepth2 = 7; modDepth3 = 10; modDepth4 = 13; // Modulated delay lengths modDelay1 = 113 + (os.osc(modFreq1) * modDepth1); modDelay2 = 229 + (os.osc(modFreq2) * modDepth2); modDelay3 = 359 + (os.osc(modFreq3) * modDepth3); modDelay4 = 691 + (os.osc(modFreq4) * modDepth4); predelay = ( fi.allpass_fcomb(128, 13, 0.7), fi.allpass_fcomb(128, 29, 0.6), fi.allpass_fcomb(128, 47, 0.6), fi.allpass_fcomb(128, 71, 0.6) ) :> _,_; diffusion = (fi.allpass_fcomb(2048, modDelay1, 0.6), fi.allpass_fcomb(2048, modDelay1+13, 0.6)) : (fi.allpass_fcomb(2048, modDelay2, 0.6), fi.allpass_fcomb(2048, modDelay2+23, 0.6)) : (fi.allpass_fcomb(2048, modDelay3, 0.6), fi.allpass_fcomb(2048, modDelay3+47, 0.6)) : (fi.allpass_fcomb(2048, modDelay4, 0.6), fi.allpass_fcomb(2048, modDelay4+71, 0.6)); process = _ <: predelay : diffusion;
-
An important test for reverb is to pass pink noise into it and see whether any resonances build up.
Certain signals will cause nasty resonances. One of the hard things about reverb design is making it sound pleasant on any signal.
Also be sure to wrap that in feedback. Then you can create a more sustained decay by adjusting both the feedback amount and the delay coefficients.
-
@griffinboy I have yet to learn how feedback works in faust...
-
@griffinboy stupid question, but are there all the building blocks in scriptnode to create a reverb algorithm? I see an allpass or a thieran interpolation delay but I'm not sure those are the right ingredients
-
Well maybe. But it'll be so cpu hungry. And fiddly because the routing of a real reverb is a complex matrix with taps coming in and out of all kinds of places