revmodel.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. // Reverb model implementation
  2. //
  3. //
  4. // Google Summer of Code 2007
  5. //
  6. // Authors: Biodun Osunkunle <biodun@videolan.org>
  7. //
  8. // Mentor : Jean-Baptiste Kempf <jb@videolan.org>
  9. //
  10. // Original written by Jezar at Dreampoint, June 2000
  11. // This code is public domain
  12. #include "revmodel.hpp"
  13. #include <stdlib.h>
  14. revmodel::revmodel()
  15. {
  16.     // Tie the components to their buffers
  17.     combL[0].setbuffer(bufcombL1,combtuningL1);
  18.     combR[0].setbuffer(bufcombR1,combtuningR1);
  19.     combL[1].setbuffer(bufcombL2,combtuningL2);
  20.     combR[1].setbuffer(bufcombR2,combtuningR2);
  21.     combL[2].setbuffer(bufcombL3,combtuningL3);
  22.     combR[2].setbuffer(bufcombR3,combtuningR3);
  23.     combL[3].setbuffer(bufcombL4,combtuningL4);
  24.     combR[3].setbuffer(bufcombR4,combtuningR4);
  25.     combL[4].setbuffer(bufcombL5,combtuningL5);
  26.     combR[4].setbuffer(bufcombR5,combtuningR5);
  27.     combL[5].setbuffer(bufcombL6,combtuningL6);
  28.     combR[5].setbuffer(bufcombR6,combtuningR6);
  29.     combL[6].setbuffer(bufcombL7,combtuningL7);
  30.     combR[6].setbuffer(bufcombR7,combtuningR7);
  31.     combL[7].setbuffer(bufcombL8,combtuningL8);
  32.     combR[7].setbuffer(bufcombR8,combtuningR8);
  33.     allpassL[0].setbuffer(bufallpassL1,allpasstuningL1);
  34.     allpassR[0].setbuffer(bufallpassR1,allpasstuningR1);
  35.     allpassL[1].setbuffer(bufallpassL2,allpasstuningL2);
  36.     allpassR[1].setbuffer(bufallpassR2,allpasstuningR2);
  37.     allpassL[2].setbuffer(bufallpassL3,allpasstuningL3);
  38.     allpassR[2].setbuffer(bufallpassR3,allpasstuningR3);
  39.     allpassL[3].setbuffer(bufallpassL4,allpasstuningL4);
  40.     allpassR[3].setbuffer(bufallpassR4,allpasstuningR4);
  41.     // Set default values
  42.     allpassL[0].setfeedback(0.5f);
  43.     allpassR[0].setfeedback(0.5f);
  44.     allpassL[1].setfeedback(0.5f);
  45.     allpassR[1].setfeedback(0.5f);
  46.     allpassL[2].setfeedback(0.5f);
  47.     allpassR[2].setfeedback(0.5f);
  48.     allpassL[3].setfeedback(0.5f);
  49.     allpassR[3].setfeedback(0.5f);
  50.     setwet(initialwet);
  51.     setroomsize(initialroom);
  52.     setdry(initialdry);
  53.     setdamp(initialdamp);
  54.     setwidth(initialwidth);
  55.     setmode(initialmode);
  56.     // Buffer will be full of rubbish - so we MUST mute them
  57.     mute();
  58. }
  59. void revmodel::mute()
  60. {
  61.     int i;
  62.     if (getmode() >= freezemode)
  63.         return;
  64.     for (i = 0 ; i < numcombs ; i++)
  65.     {
  66.         combL[i].mute();
  67.         combR[i].mute();
  68.     }
  69.     for (i=0;i<numallpasses;i++)
  70.     {
  71.         allpassL[i].mute();
  72.         allpassR[i].mute();
  73.     }
  74. }
  75. /*****************************************************************************
  76.  *  Transforms the audio stream
  77.  * /param float *inputL     input buffer
  78.  * /param float *outputL   output buffer
  79.  * /param long numsamples  number of samples to be processed
  80.  * /param int skip             number of channels in the audio stream
  81.  *****************************************************************************/
  82. void revmodel::processreplace(float *inputL, float *outputL, long numsamples, int skip)
  83. {
  84.     float outL,outR,input;
  85.     float inputR;
  86.     int i;
  87.     outL = outR = 0;
  88.         /* TODO this module supports only 2 audio channels, let's improve this */
  89.         if (skip > 1)
  90.            inputR = inputL[1];
  91.         else
  92.            inputR = inputL[0];
  93.         input = (inputL[0] + inputR) * gain;
  94.         // Accumulate comb filters in parallel
  95.         for(i=0; i<numcombs; i++)
  96.         {
  97.             outL += combL[i].process(input);
  98.             outR += combR[i].process(input);
  99.         }
  100.         // Feed through allpasses in series
  101.         for(i=0; i<numallpasses; i++)
  102.         {
  103.             outL = allpassL[i].process(outL);
  104.             outR = allpassR[i].process(outR);
  105.         }
  106.         // Calculate output REPLACING anything already there
  107.         outputL[0] = (outL*wet1 + outR*wet2 + inputR*dry);
  108.            if (skip > 1)
  109.         outputL[1] = (outR*wet1 + outL*wet2 + inputR*dry);
  110. }
  111. void revmodel::processmix(float *inputL, float *outputL, long numsamples, int skip)
  112. {
  113.     float outL,outR,input;
  114.     float inputR;
  115.     int i;
  116.     outL = outR = 0;
  117.         if (skip > 1)
  118.            inputR = inputL[1];
  119.         else
  120.            inputR = inputL[0];
  121.         input = (inputL[0] + inputR) * gain;
  122.         // Accumulate comb filters in parallel
  123.         for(i=0; i<numcombs; i++)
  124.         {
  125.             outL += combL[i].process(input);
  126.             outR += combR[i].process(input);
  127.         }
  128.         // Feed through allpasses in series
  129.         for(i=0; i<numallpasses; i++)
  130.         {
  131.             outL = allpassL[i].process(outL);
  132.             outR = allpassR[i].process(outR);
  133.         }
  134.         // Calculate output REPLACING anything already there
  135.         outputL[0] += (outL*wet1 + outR*wet2 + inputR*dry);
  136.            if (skip > 1)
  137.         outputL[1] += (outR*wet1 + outL*wet2 + inputR*dry);
  138. }
  139. void revmodel::update()
  140. {
  141. // Recalculate internal values after parameter change
  142.     int i;
  143.     wet1 = wet*(width/2 + 0.5f);
  144.     wet2 = wet*((1-width)/2);
  145.     if (mode >= freezemode)
  146.     {
  147.         roomsize1 = 1;
  148.         damp1 = 0;
  149.         gain = muted;
  150.     }
  151.     else
  152.     {
  153.         roomsize1 = roomsize;
  154.         damp1 = damp;
  155.         gain = fixedgain;
  156.     }
  157.     for(i=0; i<numcombs; i++)
  158.     {
  159.         combL[i].setfeedback(roomsize1);
  160.         combR[i].setfeedback(roomsize1);
  161.     }
  162.     for(i=0; i<numcombs; i++)
  163.     {
  164.         combL[i].setdamp(damp1);
  165.         combR[i].setdamp(damp1);
  166.     }
  167. }
  168. // The following get/set functions are not inlined, because
  169. // speed is never an issue when calling them, and also
  170. // because as you develop the reverb model, you may
  171. // wish to take dynamic action when they are called.
  172. void revmodel::setroomsize(float value)
  173. {
  174.     roomsize = (value*scaleroom) + offsetroom;
  175.     update();
  176. }
  177. float revmodel::getroomsize()
  178. {
  179.     return (roomsize-offsetroom)/scaleroom;
  180. }
  181. void revmodel::setdamp(float value)
  182. {
  183.     damp = value*scaledamp;
  184.     update();
  185. }
  186. float revmodel::getdamp()
  187. {
  188.     return damp/scaledamp;
  189. }
  190. void revmodel::setwet(float value)
  191. {
  192.     wet = value*scalewet;
  193.     update();
  194. }
  195. float revmodel::getwet()
  196. {
  197.     return wet/scalewet;
  198. }
  199. void revmodel::setdry(float value)
  200. {
  201.     dry = value*scaledry;
  202. }
  203. float revmodel::getdry()
  204. {
  205.     return dry/scaledry;
  206. }
  207. void revmodel::setwidth(float value)
  208. {
  209.     width = value;
  210.     update();
  211. }
  212. float revmodel::getwidth()
  213. {
  214.     return width;
  215. }
  216. void revmodel::setmode(float value)
  217. {
  218.     mode = value;
  219.     update();
  220. }
  221. float revmodel::getmode()
  222. {
  223.     if (mode >= freezemode)
  224.         return 1;
  225.     else
  226.         return 0;
  227. }
  228. //ends