I’m working on a bigger project involving a bunch of different reverbs. One thing I am struggling with is that either designs or specific settings for a reverb tend to sound very good on either percussive or sustained sounds, but rarely both. I think this is a difficult problem to solve - in studio settings, I think it’s pretty common to use different reverbs on different instruments. But this isn’t possible for the project I’m currently working on.
Here’s a semi-ok FDN that I knocked together this morning, it’s based on the classic “FDN of order N” by Jot and Chaigne but with a few modifications to get it sounding a bit better. It sounds fine, nothing special. The saw sound in the routine sounds decent with the reverb; the kick drum sounds terrible. I am wondering if anyone here has experience with this problem, or creative solutions to deal with it.
Cheers,
Jordan
(
SynthDef(\jotFDN, { |feedback = -3, modFreq = 0.2, modAmp = 0.0002, scale = 1, damping = 4000, amp = -10, rt = 10|
var input, output;
var early;
var fb, fdn, matrix, delays;
input = In.ar(0, 2);
early = input.sum;
// early reflections
4.do { |i|
early = AllpassC.ar(early, 0.01, 0.00237 + (i * 0.0002), 1) ;
early = AllpassC.ar(early, 0.01, 0.00337 - (i * 0.00015), 1) ;
};
// predelay
early = DelayC.ar(early, 0.1, 0.02);
// fb, fb matrix, fdn function
fb = LocalIn.ar(4);
matrix = [
[1, 1, 1, 1],
[1, -1, 1, -1],
[1, 1, -1, -1],
[1, -1, -1, 1]
];
fb = fb * matrix.flop;
fb = fb * sqrt(2).reciprocal;
fdn = { |input, delayTime, fbIndices = #[]|
var sig, mod, decayCoef;
decayCoef = 0.001.pow(delayTime/rt);
mod = LFNoise2.ar(modFreq) * modAmp;
sig = input + fb[fbIndices[0]] + (fb[fbIndices[1]] * -5.dbamp);
sig = DelayC.ar(sig, delayTime + 0.1, (delayTime * scale) + mod - ControlDur.ir);
sig = LPF.ar(sig, damping);
sig;
};
delays = Array.newClear(4);
delays[0] = fdn.(early, delayTime: 0.065103, fbIndices: [0, 3]);
delays[1] = fdn.(early, delayTime: 0.037335, fbIndices: [1, 2]);
delays[2] = fdn.(early, delayTime: 0.036431, fbIndices: [2, 1]);
delays[3] = fdn.(early, delayTime: 0.064091, fbIndices: [3, 0]);
delays = delays * feedback.dbamp;
delays = LeakDC.ar(delays);
LocalOut.ar(delays);
delays = LPF.ar(delays, damping * 3);
delays = HPF.ar(delays, 100);
delays = LeakDC.ar(delays);
output = delays * amp.dbamp;
output = Splay.ar(output);
Out.ar(0, output);
}).add;
SynthDef(\saw, {
var sig;
sig = Saw.ar(\freq.kr(660));
sig = sig * Env.perc(0.5, 0.5, curve: -3).ar(Done.freeSelf);
sig = sig ! 2 * -8.dbamp;
Out.ar(0, sig);
}).add;
SynthDef(\kick, {
var sig;
sig = SinOsc.ar(57 + (1 + Env.perc(0, 0.07, 26, -50).ar));
sig = sig + (BPF.ar(PinkNoise.ar * -23.dbamp, 733));
sig = (sig * 3.3).tanh;
sig = sig * Env.perc(0, 0.13).ar(Done.freeSelf);
sig = sig ! 2;
Out.ar(0, sig);
}).add;
)
x = Synth(\jotFDN, [scale: 0.9, feedback: -9.5, amp: 0, damping: 3000, \modFreq, 0.01, \modAmp, 0.002])
Synth(\kick)
(
Routine {
x = Synth(\jotFDN, [scale: 0.9, feedback: -9.5, amp: 0, damping: 3000, \modFreq, 0.01, \modAmp, 0.002]);
loop {
rrand(3,6).do{
Synth(\saw, [freq: ( -3 + [0, 12, -12].choose + [50, 55, 57, 60, 62, 63, 65, 67, 69].choose).midicps]);
rrand(0.3, 0.8).wait;
};
3.wait;
}
}.play;
)