Allpass reverb without original signal

Given a typical allpass-based reverb, e.g.

(
{
    var z;
    z = Decay.ar(Dust.ar(1,0.5), 0.1, WhiteNoise.ar);
    8.do { z = AllpassL.ar(z, 0.04, 0.04.rand, 2) };
    z
}.scope(1);
)

how would one go about having “just the reverb” and none of the original signal, e.g. all “wet” in a typical reverb effect?

I stole all my reverbs here and never looked back

http://www.dewdrop-world.net/sc3/tutorials/index.php?id=1

Cheers James : )

eddi
https://alln4tural.bandcamp.com

:laughing: Please don’t… I barely knew anything about DSP at that time…

hjh

What you are hearing is already just the wet signal. However, because the decayTime is 2, and the delay times much smaller, you get feedback coefficients close to 1. This results in a sharp attack without the transient smearing typical of cascaded allpasses.

If what you want is a smoother attack, you should use a shorter decayTime. The Allpass* UGens use a weird and nonstandard parametrization. You can directly set the feedback coefficient k to be some number from 0 to 1 and then compute:

decayTime = delayTime / (log(k) / log(-60.dbamp)).abs

This is the inverse of the formula in the Allpass* help files. (It’s really annoying to me that SC makes you jump through hoops to do this, it’s probably because the code was copied from CombC.) Setting k > 0.7 gives you a somewhat metallic and sharply decaying allpass. Something like k = 0.5 gives you slower attacks.

2 Likes

@nathan thanks! I put together a In based reverb to try it out and indeed k values like you describe sound more like “just reverb”:

(
add(SynthDef(\aprev,{ arg in, out, delaytime = 0.04, k = 0.5; 
	var z = In.ar(in,2);
	8.do {
		var dlt = delaytime.rand,
		dct = dlt/(log(k)/log(-60.dbamp)).abs;
		z = AllpassL.ar(z, delaytime, dlt, dct) };
	Out.ar(out,z);
}));
)

Would it make sense for sc to offer an Allpass1* ugen family that offers the more familiar parameterization?

Also, I can’t seem to parameterize the number of “reflections” (8.do), when I replace that with an arg it sounds really different even with the same value :confused:

UGen graphs are constructed in sclang and cannot be dynamically changed on the server. To truly dynamically change the allpass count, you can use Select or SelectX to turn off a subset of them. However, I can’t think of a way off the top of my head to make such modulation smooth (crossfading creates a non-flat response).

1 Like