+++ /dev/null
-// Reverb model implementation\r
-//\r
-// Written by Jezar at Dreampoint, June 2000\r
-// http://www.dreampoint.co.uk\r
-// This code is public domain\r
-\r
-#include "revmodel.hpp"\r
-\r
-revmodel::revmodel()\r
-{\r
- // Tie the components to their buffers\r
- combL[0].setbuffer(bufcombL1,combtuningL1);\r
- combR[0].setbuffer(bufcombR1,combtuningR1);\r
- combL[1].setbuffer(bufcombL2,combtuningL2);\r
- combR[1].setbuffer(bufcombR2,combtuningR2);\r
- combL[2].setbuffer(bufcombL3,combtuningL3);\r
- combR[2].setbuffer(bufcombR3,combtuningR3);\r
- combL[3].setbuffer(bufcombL4,combtuningL4);\r
- combR[3].setbuffer(bufcombR4,combtuningR4);\r
- combL[4].setbuffer(bufcombL5,combtuningL5);\r
- combR[4].setbuffer(bufcombR5,combtuningR5);\r
- combL[5].setbuffer(bufcombL6,combtuningL6);\r
- combR[5].setbuffer(bufcombR6,combtuningR6);\r
- combL[6].setbuffer(bufcombL7,combtuningL7);\r
- combR[6].setbuffer(bufcombR7,combtuningR7);\r
- combL[7].setbuffer(bufcombL8,combtuningL8);\r
- combR[7].setbuffer(bufcombR8,combtuningR8);\r
- allpassL[0].setbuffer(bufallpassL1,allpasstuningL1);\r
- allpassR[0].setbuffer(bufallpassR1,allpasstuningR1);\r
- allpassL[1].setbuffer(bufallpassL2,allpasstuningL2);\r
- allpassR[1].setbuffer(bufallpassR2,allpasstuningR2);\r
- allpassL[2].setbuffer(bufallpassL3,allpasstuningL3);\r
- allpassR[2].setbuffer(bufallpassR3,allpasstuningR3);\r
- allpassL[3].setbuffer(bufallpassL4,allpasstuningL4);\r
- allpassR[3].setbuffer(bufallpassR4,allpasstuningR4);\r
-\r
- // Set default values\r
- allpassL[0].setfeedback(0.5f);\r
- allpassR[0].setfeedback(0.5f);\r
- allpassL[1].setfeedback(0.5f);\r
- allpassR[1].setfeedback(0.5f);\r
- allpassL[2].setfeedback(0.5f);\r
- allpassR[2].setfeedback(0.5f);\r
- allpassL[3].setfeedback(0.5f);\r
- allpassR[3].setfeedback(0.5f);\r
- setwet(initialwet);\r
- setroomsize(initialroom);\r
- setdry(initialdry);\r
- setdamp(initialdamp);\r
- setwidth(initialwidth);\r
- setmode(initialmode);\r
-\r
- // Buffer will be full of rubbish - so we MUST mute them\r
- mute();\r
-}\r
-\r
-void revmodel::mute()\r
-{\r
- if (getmode() >= freezemode)\r
- return;\r
-\r
- for (int i=0;i<numcombs;i++)\r
- {\r
- combL[i].mute();\r
- combR[i].mute();\r
- }\r
- for (int i=0;i<numallpasses;i++)\r
- {\r
- allpassL[i].mute();\r
- allpassR[i].mute();\r
- }\r
-}\r
-\r
-void revmodel::processreplace(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples, int skip)\r
-{\r
- float outL,outR,input;\r
-\r
- while(numsamples-- > 0)\r
- {\r
- outL = outR = 0;\r
- input = (*inputL + *inputR) * gain;\r
-\r
- // Accumulate comb filters in parallel\r
- for(int i=0; i<numcombs; i++)\r
- {\r
- outL += combL[i].process(input);\r
- outR += combR[i].process(input);\r
- }\r
-\r
- // Feed through allpasses in series\r
- for(int i=0; i<numallpasses; i++)\r
- {\r
- outL = allpassL[i].process(outL);\r
- outR = allpassR[i].process(outR);\r
- }\r
-\r
- // Calculate output REPLACING anything already there\r
- *outputL = outL*wet1 + outR*wet2 + *inputL*dry;\r
- *outputR = outR*wet1 + outL*wet2 + *inputR*dry;\r
-\r
- // Increment sample pointers, allowing for interleave (if any)\r
- inputL += skip;\r
- inputR += skip;\r
- outputL += skip;\r
- outputR += skip;\r
- }\r
-}\r
-\r
-void revmodel::processmix(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples, int skip)\r
-{\r
- float outL,outR,input;\r
-\r
- while(numsamples-- > 0)\r
- {\r
- outL = outR = 0;\r
- input = (*inputL + *inputR) * gain;\r
-\r
- // Accumulate comb filters in parallel\r
- for(int i=0; i<numcombs; i++)\r
- {\r
- outL += combL[i].process(input);\r
- outR += combR[i].process(input);\r
- }\r
-\r
- // Feed through allpasses in series\r
- for(int i=0; i<numallpasses; i++)\r
- {\r
- outL = allpassL[i].process(outL);\r
- outR = allpassR[i].process(outR);\r
- }\r
-\r
- // Calculate output MIXING with anything already there\r
- *outputL += outL*wet1 + outR*wet2 + *inputL*dry;\r
- *outputR += outR*wet1 + outL*wet2 + *inputR*dry;\r
-\r
- // Increment sample pointers, allowing for interleave (if any)\r
- inputL += skip;\r
- inputR += skip;\r
- outputL += skip;\r
- outputR += skip;\r
- }\r
-}\r
-\r
-void revmodel::update()\r
-{\r
-// Recalculate internal values after parameter change\r
-\r
- int i;\r
-\r
- wet1 = wet*(width/2 + 0.5f);\r
- wet2 = wet*((1-width)/2);\r
-\r
- if (mode >= freezemode)\r
- {\r
- roomsize1 = 1;\r
- damp1 = 0;\r
- gain = muted;\r
- }\r
- else\r
- {\r
- roomsize1 = roomsize;\r
- damp1 = damp;\r
- gain = fixedgain;\r
- }\r
-\r
- for(i=0; i<numcombs; i++)\r
- {\r
- combL[i].setfeedback(roomsize1);\r
- combR[i].setfeedback(roomsize1);\r
- }\r
-\r
- for(i=0; i<numcombs; i++)\r
- {\r
- combL[i].setdamp(damp1);\r
- combR[i].setdamp(damp1);\r
- }\r
-}\r
-\r
-// The following get/set functions are not inlined, because\r
-// speed is never an issue when calling them, and also\r
-// because as you develop the reverb model, you may\r
-// wish to take dynamic action when they are called.\r
-\r
-void revmodel::setroomsize(float value)\r
-{\r
- roomsize = (value*scaleroom) + offsetroom;\r
- update();\r
-}\r
-\r
-float revmodel::getroomsize()\r
-{\r
- return (roomsize-offsetroom)/scaleroom;\r
-}\r
-\r
-void revmodel::setdamp(float value)\r
-{\r
- damp = value*scaledamp;\r
- update();\r
-}\r
-\r
-float revmodel::getdamp()\r
-{\r
- return damp/scaledamp;\r
-}\r
-\r
-void revmodel::setwet(float value)\r
-{\r
- wet = value*scalewet;\r
- update();\r
-}\r
-\r
-float revmodel::getwet()\r
-{\r
- return wet/scalewet;\r
-}\r
-\r
-void revmodel::setdry(float value)\r
-{\r
- dry = value*scaledry;\r
-}\r
-\r
-float revmodel::getdry()\r
-{\r
- return dry/scaledry;\r
-}\r
-\r
-void revmodel::setwidth(float value)\r
-{\r
- width = value;\r
- update();\r
-}\r
-\r
-float revmodel::getwidth()\r
-{\r
- return width;\r
-}\r
-\r
-void revmodel::setmode(float value)\r
-{\r
- mode = value;\r
- update();\r
-}\r
-\r
-float revmodel::getmode()\r
-{\r
- if (mode >= freezemode)\r
- return 1;\r
- else\r
- return 0;\r
-}\r
-\r
-//ends\r
-\r
-\r
-\r
-\r
-\r