1//======================================================
2//
3//						Freeverb
4//		  Faster version using fixed delays (20% gain)
5//
6//======================================================
7
8declare name "freeverb -- a Schroeder reverb";
9declare author "Yann Orlarey";
10declare version "1.0";
11
12// Constant Parameters
13//--------------------
14
15fixedgain	= 0.015;
16scalewet	= 3.0;
17scaledry	= 2.0;
18scaledamp	= 0.4;
19scaleroom	= 0.28;
20offsetroom	= 0.7;
21initialroom	= 0.5;
22initialdamp	= 0.5;
23initialwet	= 1.0/scalewet;
24initialdry	= 0;
25initialwidth= 1.0;
26initialmode	= 0.0;
27freezemode	= 0.5;
28stereospread= 23;
29allpassfeed	= 0.5;
30
31
32// Filter Parametres
33//------------------
34
35combtuningL1	= 1116;
36combtuningL2	= 1188;
37combtuningL3	= 1277;
38combtuningL4	= 1356;
39combtuningL5	= 1422;
40combtuningL6	= 1491;
41combtuningL7	= 1557;
42combtuningL8	= 1617;
43
44allpasstuningL1	= 556;
45allpasstuningL2	= 441;
46allpasstuningL3	= 341;
47allpasstuningL4	= 225;
48
49
50// Control Sliders
51//--------------------
52// Damp : filtrage des aigus des echos (surtout actif pour des grandes valeurs de RoomSize)
53// RoomSize : taille de la piece
54// Dry : signal original
55// Wet : signal avec reverbŽration
56
57dampSlider 		= hslider("damp",0.5, 0, 1, 0.025)*scaledamp;
58roomsizeSlider 	= hslider("roomsize", 0.5, 0, 1, 0.025)*scaleroom + offsetroom;
59wetSlider 		= hslider("wet", 0.25, 0, 1, 0.025);
60drySlider 		= hslider("dry", 0, 0, 1, 0.025);
61combfeed 		= roomsizeSlider;
62
63
64
65
66
67// Comb and Allpass filters
68//-------------------------
69
70allpass(dt,fb) = (_,_ <: (*(fb),_:+:@(dt)), -) ~ _ : (!,_);
71
72comb(dt, fb, damp) = (+:@(dt)) ~ (*(1-damp) : (+ ~ *(damp)) : *(fb));
73
74
75// Reverb components
76//------------------
77
78monoReverb(fb1, fb2, damp, spread)
79	= _ <:	comb(combtuningL1+spread, fb1, damp),
80			comb(combtuningL2+spread, fb1, damp),
81			comb(combtuningL3+spread, fb1, damp),
82			comb(combtuningL4+spread, fb1, damp),
83			comb(combtuningL5+spread, fb1, damp),
84			comb(combtuningL6+spread, fb1, damp),
85			comb(combtuningL7+spread, fb1, damp),
86			comb(combtuningL8+spread, fb1, damp)
87		+>
88		 	allpass (allpasstuningL1+spread, fb2)
89		:	allpass (allpasstuningL2+spread, fb2)
90		:	allpass (allpasstuningL3+spread, fb2)
91		:	allpass (allpasstuningL4+spread, fb2)
92		;
93
94stereoReverb(fb1, fb2, damp, spread)
95	= + <: 	monoReverb(fb1, fb2, damp, 0), monoReverb(fb1, fb2, damp, spread);
96
97
98// fxctrl : add an input gain and a wet-dry control to a stereo FX
99//----------------------------------------------------------------
100
101fxctrl(g,w,Fx) =  _,_ <: (*(g),*(g) : Fx : *(w),*(w)), *(1-w), *(1-w) +> _,_;
102
103
104
105// Freeverb
106//---------
107
108freeverb = vgroup("freeverb", fxctrl(fixedgain, wetSlider, stereoReverb(combfeed, allpassfeed, dampSlider, stereospread)));
109
110process = freeverb;
111