00001
00002
00003
00004
00005
00006
00007 #include "revmodel.hpp"
00008
00009 revmodel::revmodel()
00010 {
00011
00012 combL[0].setbuffer(bufcombL1,combtuningL1);
00013 combR[0].setbuffer(bufcombR1,combtuningR1);
00014 combL[1].setbuffer(bufcombL2,combtuningL2);
00015 combR[1].setbuffer(bufcombR2,combtuningR2);
00016 combL[2].setbuffer(bufcombL3,combtuningL3);
00017 combR[2].setbuffer(bufcombR3,combtuningR3);
00018 combL[3].setbuffer(bufcombL4,combtuningL4);
00019 combR[3].setbuffer(bufcombR4,combtuningR4);
00020 combL[4].setbuffer(bufcombL5,combtuningL5);
00021 combR[4].setbuffer(bufcombR5,combtuningR5);
00022 combL[5].setbuffer(bufcombL6,combtuningL6);
00023 combR[5].setbuffer(bufcombR6,combtuningR6);
00024 combL[6].setbuffer(bufcombL7,combtuningL7);
00025 combR[6].setbuffer(bufcombR7,combtuningR7);
00026 combL[7].setbuffer(bufcombL8,combtuningL8);
00027 combR[7].setbuffer(bufcombR8,combtuningR8);
00028 allpassL[0].setbuffer(bufallpassL1,allpasstuningL1);
00029 allpassR[0].setbuffer(bufallpassR1,allpasstuningR1);
00030 allpassL[1].setbuffer(bufallpassL2,allpasstuningL2);
00031 allpassR[1].setbuffer(bufallpassR2,allpasstuningR2);
00032 allpassL[2].setbuffer(bufallpassL3,allpasstuningL3);
00033 allpassR[2].setbuffer(bufallpassR3,allpasstuningR3);
00034 allpassL[3].setbuffer(bufallpassL4,allpasstuningL4);
00035 allpassR[3].setbuffer(bufallpassR4,allpasstuningR4);
00036
00037
00038 allpassL[0].setfeedback(0.5f);
00039 allpassR[0].setfeedback(0.5f);
00040 allpassL[1].setfeedback(0.5f);
00041 allpassR[1].setfeedback(0.5f);
00042 allpassL[2].setfeedback(0.5f);
00043 allpassR[2].setfeedback(0.5f);
00044 allpassL[3].setfeedback(0.5f);
00045 allpassR[3].setfeedback(0.5f);
00046 setwet(initialwet);
00047 setroomsize(initialroom);
00048 setdry(initialdry);
00049 setdamp(initialdamp);
00050 setwidth(initialwidth);
00051 setmode(initialmode);
00052
00053
00054 mute();
00055 }
00056
00057 void revmodel::mute()
00058 {
00059 if (getmode() >= freezemode)
00060 return;
00061
00062 for (int i=0;i<numcombs;i++)
00063 {
00064 combL[i].mute();
00065 combR[i].mute();
00066 }
00067 for (int i=0;i<numallpasses;i++)
00068 {
00069 allpassL[i].mute();
00070 allpassR[i].mute();
00071 }
00072 }
00073
00074 void revmodel::processreplace(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples, int skip)
00075 {
00076 float outL,outR,input;
00077
00078 while(numsamples-- > 0)
00079 {
00080 outL = outR = 0;
00081 input = (*inputL + *inputR) * gain;
00082
00083
00084 for(int i=0; i<numcombs; i++)
00085 {
00086 outL += combL[i].process(input);
00087 outR += combR[i].process(input);
00088 }
00089
00090
00091 for(int i=0; i<numallpasses; i++)
00092 {
00093 outL = allpassL[i].process(outL);
00094 outR = allpassR[i].process(outR);
00095 }
00096
00097
00098 *outputL = outL*wet1 + outR*wet2 + *inputL*dry;
00099 *outputR = outR*wet1 + outL*wet2 + *inputR*dry;
00100
00101
00102 inputL += skip;
00103 inputR += skip;
00104 outputL += skip;
00105 outputR += skip;
00106 }
00107 }
00108
00109 void revmodel::processmix(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples, int skip)
00110 {
00111 float outL,outR,input;
00112
00113 while(numsamples-- > 0)
00114 {
00115 outL = outR = 0;
00116 input = (*inputL + *inputR) * gain;
00117
00118
00119 for(int i=0; i<numcombs; i++)
00120 {
00121 outL += combL[i].process(input);
00122 outR += combR[i].process(input);
00123 }
00124
00125
00126 for(int i=0; i<numallpasses; i++)
00127 {
00128 outL = allpassL[i].process(outL);
00129 outR = allpassR[i].process(outR);
00130 }
00131
00132
00133 *outputL += outL*wet1 + outR*wet2 + *inputL*dry;
00134 *outputR += outR*wet1 + outL*wet2 + *inputR*dry;
00135
00136
00137 inputL += skip;
00138 inputR += skip;
00139 outputL += skip;
00140 outputR += skip;
00141 }
00142 }
00143
00144 void revmodel::update()
00145 {
00146
00147
00148 int i;
00149
00150 wet1 = wet*(width/2 + 0.5f);
00151 wet2 = wet*((1-width)/2);
00152
00153 if (mode >= freezemode)
00154 {
00155 roomsize1 = 1;
00156 damp1 = 0;
00157 gain = muted;
00158 }
00159 else
00160 {
00161 roomsize1 = roomsize;
00162 damp1 = damp;
00163 gain = fixedgain;
00164 }
00165
00166 for(i=0; i<numcombs; i++)
00167 {
00168 combL[i].setfeedback(roomsize1);
00169 combR[i].setfeedback(roomsize1);
00170 }
00171
00172 for(i=0; i<numcombs; i++)
00173 {
00174 combL[i].setdamp(damp1);
00175 combR[i].setdamp(damp1);
00176 }
00177 }
00178
00179
00180
00181
00182
00183
00184 void revmodel::setroomsize(float value)
00185 {
00186 roomsize = (value*scaleroom) + offsetroom;
00187 update();
00188 }
00189
00190 float revmodel::getroomsize()
00191 {
00192 return (roomsize-offsetroom)/scaleroom;
00193 }
00194
00195 void revmodel::setdamp(float value)
00196 {
00197 damp = value*scaledamp;
00198 update();
00199 }
00200
00201 float revmodel::getdamp()
00202 {
00203 return damp/scaledamp;
00204 }
00205
00206 void revmodel::setwet(float value)
00207 {
00208 wet = value*scalewet;
00209 update();
00210 }
00211
00212 float revmodel::getwet()
00213 {
00214 return wet/scalewet;
00215 }
00216
00217 void revmodel::setdry(float value)
00218 {
00219 dry = value*scaledry;
00220 }
00221
00222 float revmodel::getdry()
00223 {
00224 return dry/scaledry;
00225 }
00226
00227 void revmodel::setwidth(float value)
00228 {
00229 width = value;
00230 update();
00231 }
00232
00233 float revmodel::getwidth()
00234 {
00235 return width;
00236 }
00237
00238 void revmodel::setmode(float value)
00239 {
00240 mode = value;
00241 update();
00242 }
00243
00244 float revmodel::getmode()
00245 {
00246 if (mode >= freezemode)
00247 return 1;
00248 else
00249 return 0;
00250 }
00251
00252
00253
00254
00255
00256
00257