1//Description:
2//Based at Gardner's room reverberator models:
3//http://fc.mbs.net/~pfisher/fov2-0010016c/fov2-0010016e/fov2-001001a3/book/chapters/24mikelson/index.html
4//The values with couple of nines are corrected and differ
5//from original implementation
6
7import("stdfaust.lib");
8
9//Controls
10p_predelay = hslider("Predelay ms[style:knob]",20,1,200,1);
11p_rsize = hslider("Room Size[style:knob]", 1, 0, 3, 0.05);
12p_rt = hslider("RT[style:knob]", 0.3, 0, 1, 0.05);
13p_drw = hslider("dry wet[style:knob]", 0.5, 0, 1,0.05);
14
15//Convert time in ms to samples
16ms2sps(x) = x*ma.SR:_*0.001;
17
18//One fi.pole filter
19opf(a) = (_+_*(1-a)~@(1)*a);
20
21//Allpasses
22allpass(dt,fb,f_nest) = (+ <:
23   (de.delay(maxdel,dt-1):f_nest),*(fb)) ~ *(-fb)
24   : mem,_ : +
25   with {
26   	maxdel = 8192;
27   };
28
29sn_allpass(dt1,dt2,fb1,fb2) = allpass(dt1,fb1,allpass(dt2,fb2,_));
30dn_allpass(dt1,dt2,dt3,fb1,fb2,fb3) =
31	allpass(dt1,fb1,allpass(dt2,fb2,allpass(dt3,fb3,_)));
32
33//Gardners room emulation algorithms
34small_room(rt,hf_damping) = fi.lowpass(4,6000):
35	((_,_:>@(ms2sps(24)):dn_allpass(ms2sps(35),ms2sps(22),
36	ms2sps(8.3),0.15,0.25,0.3)<:
37	sn_allpass(ms2sps(66),ms2sps(30),0.08,0.3),_)~
38	(_*1.199:fi.highpass(2,800):fi.lowpass(2,1600):_*rt:opf(hf_damping))):
39	_*0.5,_*0.5:>_;
40
41medium_room(rt,hf_damping,x) = x:fi.lowpass(4,6000):
42	((_,_:>dn_allpass(ms2sps(35),ms2sps(8.3),ms2sps(22),0.25,0.35,0.45)<:
43	@(ms2sps(5)),_*0.5:allpass(ms2sps(30),0.45,_),_:(@(ms2sps(67))<:_,_*0.5),_:
44	(@(ms2sps(15)):_*rt),_+_:
45	(_*0.4:_+x:sn_allpass(ms2sps(39),ms2sps(9.8),0.25,0.35)),_)~
46	(fi.highpass(2,500):fi.lowpass(2,1000):opf(hf_damping):_*rt:_*1.799)):
47	_*0.5,_:_+_;
48
49large_room(rt,hf_damping) = fi.lowpass(4,4000):
50	((_,_:>allpass(ms2sps(8),0.3,_):allpass(ms2sps(12),0.3,_):
51	@(ms2sps(4))<:_,_*1.5:((@(ms2sps(17)):
52	sn_allpass(ms2sps(87),ms2sps(62),0.5,0.25):@(ms2sps(31))<:_,_*0.8),_:_,_+_):
53	((@(ms2sps(3)):
54	dn_allpass(ms2sps(120),ms2sps(76),ms2sps(30),0.5,0.25,0.25)),_))~
55	(_*0.5:_*rt:opf(hf_damping):fi.highpass(2,500):fi.lowpass(2,1000):_*1.799)):_+_*0.8;
56
57mix2(c,x,y) = (1-c)*x + c*y;
58mix3(val) = _,_,_<:select3(val),select3(val+1):mix2(val-floor(val));
59
60process = _<:_,(_<:(fdelay1s(ms2sps(p_predelay)):_<:
61	small_room(p_rt, 0),medium_room(p_rt, 0),large_room(p_rt, 0):
62	mix3(p_rsize):_),_:mix2(1 - p_drw)):select2(checkbox("Effect"));
63