Modulatable wet reverberation (beginner)

Ive been trying to make some wet ambient drones. What ive done by now is to make a source signal and wrap it in a perc envelope, then send it to NHHall and put the 60db decay time to infinite. This produces a somewhat wet ambient drone.

(
SynthDef(\drone, {
	var sig;
	sig = SinOsc.ar(120) + SinOsc.ar(240) + SinOsc.ar(360);
	sig = sig *EnvGen.kr(Env.perc());
	sig = sig!2;
	sig = NHHall.ar(sig,inf)*0.07;
	Out.ar(0,sig);
}).add;
)

However i would like it to be much more wetter than this, also i have lost a lot of flexibilty in terms of modulation.
Are there any effects that transform a sustaining tone into a wet reverberating one, such that any modulation on the source would get translated into a wet version?

There are a couple of different things:

  1. You drone stops after 1 second, you will need to use an asr or similar gated envelope to sustain the drone.

  2. There are no arguments in your synthdef so nothing can be changed after initiating the synth.

More generally, it is hard to detect reverb on an unchanging, unmodulated sound as the reverb blends perfectly in and is disguised by the clean signal (In your example it is all reverb and no clean signal). As soon as you start modulating e.g. frequency, amplitude or filtercutoff, reverb will become more obvious. And infinite reverb time, as in your example, might not be the best way as changes in the source is swallowed in the soup.

It is probably also a good idea to split the drone synth from the reverb synth. The below example is the equivalent of using a reverb insert with a mix knob in a DAW. The frequency and amplitude of each partial is being slightly modulated, left and right side are independant causing random panning effects due to differences in modulation times.

(
SynthDef(\drone, {|bus = 0, freq = 110, gate = 1, amp = 0.5, atk = 1, rel = 2|
	var n = 3;
	var sig = 2.collect{ 
		n.collect{|i|
			SinOsc.ar((freq * (i + 1) * SinOsc.kr(rrand(0.1, 0.3)).range(0.995, 1.005)).lag(1), 
				rrand(0, pi),
				SinOsc.kr(rrand(0.1, 0.3)).range(0.03, 0.05)
			)
		};
	};
	var env = EnvGen.kr(Env.asr(atk, amp, rel), gate, doneAction: 2);
	Out.ar(bus, sig * env);
}).add;
	

SynthDef(\reverb, {|bus = 0, time = 3, amp = 1, mix = 0.5|
	var in = In.ar(bus, 2) * 0.3;
	var reverb = NHHall.ar(in, time) * amp;
	var sig = XFade2.ar(in, reverb, mix.linlin(0, 1, -1, 1).lag(1));
	ReplaceOut.ar(bus, sig);
}).add;
);


///

(
~reverb = Synth(\reverb, [\mix, 0.5, \time, 3], addAction: \addToTail);
~drone = Synth(\drone, [\freq, 45.midicps]);
);
///

~drone.set(\freq, rrand(40, 50).midicps);

///
~drone.set(\gate, 0); // drone fades out, synth is released (see server node tree)
///
~reverb.free; 
1 Like

A little bit different analysis from Thor’s, but leading to pretty much the same place:

Reverbs are similar to resonators in that they both use feedback to extend a signal in time. An important difference between the two is that the frequency response of a resonator is usually very simple, while the response of a reverb is complex and noisy, but the processes are related: you add energy into the system, and the system continues to vibrate after the input has gone silent.

To let the input goes silent quickly, and set a very long (perhaps even infinite) decay time is valid.

But, after the input has gone silent, the system is just ringing on its own. So if the input is defining the pitches being produced, but the input is silent, then the input doesn’t have control over it anymore.

So then you would have to look for reverb parameters that could influence the output pitches. Reverbs usually don’t do that, so I suspect this is a non-starter.

I think your choices would be to look for a different type of resonating process, where you could control the output frequencies in the effect, rather than the source – or, as Thor suggests, to abandon the infinite reverb approach and have a continuous input (so that the input can control pitch).

If you drop a short burst of energy into a long reverb, it isn’t only the given frequencies that are resonating – the envelope itself adds some frequency content (as in a large cathedral, when the organist releases a fortissimo chord, and the release itself reverberates). This may be the desired sound.

hjh

1 Like

Thanks @jamshark70 for clarifying.

Another possible approach is to keep the idea of the infinite tail and then modulate the reverb itself rather than the source. Here is a slightly mod’ed version of your original synthdef with some added means of modulating the reverb tail. Notice that I am using a Saw Ugen which is rich in overtones rather than building a signal by stacking sine waves (a sinewave does not have any overtones, only the fundamental).

(
SynthDef(\drone, {|freq = 110, time = inf, ps = 1, filtrate = 1, rq = 0.5| 
	// 110 herts = 45.midicps = the note A
	var sig;
	sig = Saw.ar(freq) * 0.5;
	sig = sig *EnvGen.kr(Env.perc());
	sig = sig!2;
	sig = NHHall.ar(sig, time) * 0.07;
	sig = PitchShift.ar(sig, 0.2, ps);
	sig = RLPF.ar(sig, SinOsc.kr(filtrate).range(60, 500), rq); 
	Out.ar(0,sig);
}).add;
)

x = Synth(\drone)

x.set(\ps, 3.midiratio) 
// using midiratio is really convenient in this case.
// 0.midiratio = 1 = unaltered signal
// 1.midiratio pitches signal one semitone up, -1.midiratio one semitone down.

x.set(\filtrate, 10) // set filter rate, you could also add arguments for the range of the filter
1 Like

NHHall can be set to very long reverb time, up to freeze, where it will ring out infinitely. so depending on your NHHall settings a one second input burst might be enough and give you 100% wet, pure reverb sound

edit: oops, just re read the op questions, sorry for the noise :slight_smile:

This is exactly the sound im searching for, but super wet, and modulatable from the source. I’m not looking for reverb per se, but an effect that would make a sustaining tone sound like its a long reverb tail of a sudden input burst.

I understood most of you and thor were saying, but im not sure if you guys understood what i meant.
If you understood me and tell me that its not for beginners, then ill accept that and move on.

I think both james and I understand what you are after and it is certainly doable for a beginner:) We were both pointing out some possible pitfalls. To sum up:

  • With infinite reverb tail it is hard to detect changes in the source and this gets harder and harder the more information you put into the reverb, ie. the longer it plays, better use a long tail of maybe 3-8 seconds.

  • The source needs to be playing for changes in the source to be heard in the reverb (obviously). There are two ways this can be achieved: 1) Use a sustaining synth and use .set messages to change the sound of the dry sound or 2) Split the drone synth and the reverb synth into two separate synthdefs (see my first example). In this case you can use non sustaining drones (the perc envelope is non sustaining, ie. it stops by itself after some amount of time defined by the attack and release values of the envelope). You will need to initiate a new drone (can be same pitch) when the previous one has stopped to change the sound of the reverb. This is most easily done by using a pattern (think Pbind and related classes). In between silences in the dry sound you will still hear the previous drone hanging in the reverb tail.

So to go back to what James wrote about the cathedral-like sound. In real life there is no way of modulating the reverb of fortissimo chord in a cathedral after the chord has stopped - the sound simply hangs in the reverb. The same is true in digital audio, unless you modulate the reverb itself (my second example).

1 Like