AdCVerb a simple reverb based on Schroeder and Moorer/Loy models, 

tuned for low coloration, with some special tweaks.



AdCVerb is a bank of comb filters going thru a bank of allpass filters, with optional predelay.

Input filtering is provided (high rolloff, DC removal), and it is easy and efficient to use for 

multichannel systems.


The overall structure is:



     |||||   in (number of channels of input array, e.g. 5)

     \\|// summed to 

       | mono 

    /// \\\ fanning out to <numCombs> (e.g. 6 here)

    ||| |||   comb filters

     \\ //

       | summed to mono

     //|\\    fanned to <nOuts> allpass chain channels for decorrelation/diffuseness;

     ||||| for each channel, a chain of <numAllpasses> allPasses,

     ||||| e.g. 3 here.

     |||||

_____________

||||| <nOuts> output channels. 

There is no specific design of first reflections; if there are no particular demands on the early reflections, 

those created by AdCVerb are often fully sufficient. 

One can easily add first reflections, e.g. based on room geometry, by adding higher predelays, 

and creating a special purpose set of first reflections; then AdCVerb works well for global reverb tails. 


Currently, the combTimes are hardcoded to be colouration-free (based on prime numbers), 

and they can be scaled. The allpassTimes are generated randomly based on prime number ratios, 

but can also be passed in if desired


*ar(in, revTime, hfDamping, nOuts, 

predelay, numCombs, numAllpasses, 

inFilter, leakCoeff, combScale, apScale, allpassPrimes)


in audio input; this is converted to mono.

revTime reverb time for -60 db decay of combs.

hfDamping 0.0 is no damping, 1.0 means high frequencies roll off 

significantly faster. 

nOuts number of outputs; each out gets its own group 

of allpass filters for more density and decorrelation

predelay predelay before reverb tail begins, in sec

numCombs number of combs used for reverb tail

numAllpasses number of allpasses used for decorrelating each out channel

inFilter a coefficient for reverb input filtering; 

0.0 is no filtering, 0.99 is very dark.

combScale scales all combTimes (within a max of 0.2 sec); 

can be used to adjust room size. 1.0 is default.

apScale scales all allpassTimes (within a max of 0.2 sec);

can be used to adjust room size. 1.0 is default.

allpassPrimes a list of prime numbers for the allpass filters; 

providing them overrides numAllpasses and nOuts.



( // simple use: 

Ndef(\adcverb_help).play;

Ndef(\adcverb_help, { 

var src, verb; 

src = Decay2.ar(Impulse.ar(0.5, 0.99), 0.001, 0.03, PinkNoise.ar(1));

verb = AdCVerb.ar(src * 0.1);

src + verb;

});

)



Ndef(\adcverb_help).play;

NodeProxyEditor(Ndef(\adcverb_help));


( // all params open for tuning:

Spec.add(\revTime, [0.01, 100, \exp]);

Spec.add(\hfDamping, [0, 1]);

Spec.add(\predelay, [0.0, 0.2, \amp]);

Spec.add(\revTime, [0.01, 100, \exp]);

Spec.add(\inFilter, [-0.99, 0.99]);

Spec.add(\leakCoeff, [0.8, 1.0]);

Spec.add(\combScale, [0.1, 2, \exp]);

Spec.add(\apScale, [0.1, 2, \exp]);


Ndef(\adcverb_help, { |revTime = 3, hfDamping = 0.1, predelay = 0.02,

inFilter = 0.6, leakCoeff = 0.995, combScale = 1, apScale = 1|

var src, verb; 

src = Decay2.ar(Impulse.ar(0.5), 0.001, 0.03, PinkNoise.ar(1));

verb = AdCVerb.ar(src * 0.1, 

revTime: revTime.lag(0.5), 

hfDamping: hfDamping.lag(0.5),

nOuts: 2, // fixed number of decorrelated output channels

predelay: predelay.lag(0.5), 

numCombs: 8, // fixed number - increase for more density

numAllpasses: 4, // fixed number - increase for more diffuseness

inFilter: inFilter,

leakCoeff: leakCoeff, 

combScale: combScale.lag(0.5), // lagged to 

apScale: apScale.lag(0.5)

);

src + verb;

});

)


Class Variables

*verbose turn posting of random-generated allpass number info on and off, 

so one can get the exact same reverb again if desired.


AdCVerb.verbose_(true); // post

// now build a new AdCVerb - times get posted, 

( Ndef(\adcverb_help, { var src, verb; 

src = Decay2.ar(Impulse.ar(0.5, 0.99), 0.001, 0.03, PinkNoise.ar(1));

verb = AdCVerb.ar(src * 0.1);

src + verb;

});

)


// e.g. [ [ 683, 757, 1319, 1597 ], [ 419, 1009, 1129, 2053 ] ]

// if desired, use these specific random primes: 

( Ndef(\adcverb_help, { var src, verb; 

src = Decay2.ar(Impulse.ar(0.5, 0.99), 0.001, 0.03, PinkNoise.ar(1));

verb = AdCVerb.ar(src * 0.1, 

allpassPrimes: [ [ 683, 757, 1319, 1597 ], [ 419, 1009, 1129, 2053 ] ]

);

src + verb;

});

)

AdCVerb.verbose_(false); // no posting

*maxTime set the maximum delay time for predelay, combs and allpasses.

When maxTime is changed, the next instance of AdCVerb will have this maxdelaytime

for combs, allpasses and predelay. Default value is 0.2.