1 // Reverb model implementation
4 // Google Summer of Code 2007
6 // Authors: Biodun Osunkunle <biodun@videolan.org>
8 // Mentor : Jean-Baptiste Kempf <jb@videolan.org>
10 // Original written by Jezar at Dreampoint, June 2000
12 // This code is public domain
14 #include "revmodel.hpp"
18 revmodel::revmodel() : roomsize(initialroom), damp(initialdamp),
19 wet(initialwet), dry(initialdry), width(1.), mode(0.)
21 // Tie the components to their buffers
22 combL[0].setbuffer(bufcombL1,combtuningL1);
23 combR[0].setbuffer(bufcombR1,combtuningR1);
24 combL[1].setbuffer(bufcombL2,combtuningL2);
25 combR[1].setbuffer(bufcombR2,combtuningR2);
26 combL[2].setbuffer(bufcombL3,combtuningL3);
27 combR[2].setbuffer(bufcombR3,combtuningR3);
28 combL[3].setbuffer(bufcombL4,combtuningL4);
29 combR[3].setbuffer(bufcombR4,combtuningR4);
30 combL[4].setbuffer(bufcombL5,combtuningL5);
31 combR[4].setbuffer(bufcombR5,combtuningR5);
32 combL[5].setbuffer(bufcombL6,combtuningL6);
33 combR[5].setbuffer(bufcombR6,combtuningR6);
34 combL[6].setbuffer(bufcombL7,combtuningL7);
35 combR[6].setbuffer(bufcombR7,combtuningR7);
36 combL[7].setbuffer(bufcombL8,combtuningL8);
37 combR[7].setbuffer(bufcombR8,combtuningR8);
38 allpassL[0].setbuffer(bufallpassL1,allpasstuningL1);
39 allpassR[0].setbuffer(bufallpassR1,allpasstuningR1);
40 allpassL[1].setbuffer(bufallpassL2,allpasstuningL2);
41 allpassR[1].setbuffer(bufallpassR2,allpasstuningR2);
42 allpassL[2].setbuffer(bufallpassL3,allpasstuningL3);
43 allpassR[2].setbuffer(bufallpassR3,allpasstuningR3);
44 allpassL[3].setbuffer(bufallpassL4,allpasstuningL4);
45 allpassR[3].setbuffer(bufallpassR4,allpasstuningR4);
48 allpassL[0].setfeedback(0.5f);
49 allpassR[0].setfeedback(0.5f);
50 allpassL[1].setfeedback(0.5f);
51 allpassR[1].setfeedback(0.5f);
52 allpassL[2].setfeedback(0.5f);
53 allpassR[2].setfeedback(0.5f);
54 allpassL[3].setfeedback(0.5f);
55 allpassR[3].setfeedback(0.5f);
57 setroomsize(initialroom);
60 setwidth(initialwidth);
63 // Buffer will be full of rubbish - so we MUST mute them
70 if (mode >= freezemode)
73 for (i = 0 ; i < numcombs ; i++)
78 for (i=0;i<numallpasses;i++)
85 /*****************************************************************************
86 * Transforms the audio stream
87 * /param float *inputL input buffer
88 * /param float *outputL output buffer
89 * /param long numsamples number of samples to be processed
90 * /param int skip number of channels in the audio stream
91 *****************************************************************************/
92 void revmodel::processreplace(float *inputL, float *outputL, long /* numsamples */, int skip)
94 float outL,outR,input;
99 /* TODO this module supports only 2 audio channels, let's improve this */
104 input = (inputL[0] + inputR) * gain;
106 // Accumulate comb filters in parallel
107 for(i=0; i<numcombs; i++)
109 outL += combL[i].process(input);
110 outR += combR[i].process(input);
113 // Feed through allpasses in series
114 for(i=0; i<numallpasses; i++)
116 outL = allpassL[i].process(outL);
117 outR = allpassR[i].process(outR);
120 // Calculate output REPLACING anything already there
121 outputL[0] = (outL*wet1 + outR*wet2 + inputR*dry);
123 outputL[1] = (outR*wet1 + outL*wet2 + inputR*dry);
126 void revmodel::processmix(float *inputL, float *outputL, long /* numsamples */, int skip)
128 float outL,outR,input;
136 input = (inputL[0] + inputR) * gain;
138 // Accumulate comb filters in parallel
139 for(int i=0; i<numcombs; i++)
141 outL += combL[i].process(input);
142 outR += combR[i].process(input);
145 // Feed through allpasses in series
146 for(int i=0; i<numallpasses; i++)
148 outL = allpassL[i].process(outL);
149 outR = allpassR[i].process(outR);
152 // Calculate output REPLACING anything already there
153 outputL[0] += (outL*wet1 + outR*wet2 + inputR*dry);
155 outputL[1] += (outR*wet1 + outL*wet2 + inputR*dry);
158 void revmodel::update()
160 // Recalculate internal values after parameter change
162 wet1 = wet*(width/2 + 0.5f);
163 wet2 = wet*((1-width)/2);
165 if (mode >= freezemode)
173 roomsize1 = roomsize;
178 for(int i=0; i<numcombs; i++)
180 combL[i].setfeedback(roomsize1);
181 combR[i].setfeedback(roomsize1);
184 for(int i=0; i<numcombs; i++)
186 combL[i].setdamp(damp1);
187 combR[i].setdamp(damp1);
191 // The following get/set functions are not inlined, because
192 // speed is never an issue when calling them, and also
193 // because as you develop the reverb model, you may
194 // wish to take dynamic action when they are called.
196 void revmodel::setroomsize(float value)
198 roomsize = (value*scaleroom) + offsetroom;
202 float revmodel::getroomsize()
204 return (roomsize-offsetroom)/scaleroom;
207 void revmodel::setdamp(float value)
209 damp = value*scaledamp;
213 float revmodel::getdamp()
215 return damp/scaledamp;
218 void revmodel::setwet(float value)
220 wet = value*scalewet;
224 float revmodel::getwet()
229 void revmodel::setdry(float value)
231 dry = value*scaledry;
234 float revmodel::getdry()
239 void revmodel::setwidth(float value)
245 float revmodel::getwidth()
250 void revmodel::setmode(float value)