home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 January / PCWorld_2007-01_cd.bin / temacd / reaper / reaper147-install.exe / Effects / SStillwell / fairlychildish < prev    next >
Text File  |  2006-10-16  |  5KB  |  150 lines

  1. // Copyright 2006, Thomas Scott Stillwell
  2. // All rights reserved.
  3. //
  4. //Redistribution and use in source and binary forms, with or without modification, are permitted 
  5. //provided that the following conditions are met:
  6. //
  7. //Redistributions of source code must retain the above copyright notice, this list of conditions 
  8. //and the following disclaimer. 
  9. //
  10. //Redistributions in binary form must reproduce the above copyright notice, this list of conditions 
  11. //and the following disclaimer in the documentation and/or other materials provided with the distribution. 
  12. //
  13. //The name of Thomas Scott Stillwell may not be used to endorse or 
  14. //promote products derived from this software without specific prior written permission. 
  15. //
  16. //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
  17. //IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
  18. //FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
  19. //BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
  20. //(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
  21. //PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
  22. //STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
  23. //THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. desc:compressor/limiter, similar to F670
  25.  
  26. slider1:0<-60,0,0.1>Threshold (dB)
  27. slider2:70<0.1,100,0.1>Bias
  28. slider3:0<-30,30,0.1>Makeup gain
  29. slider4:0<0,1,1{Left/Right,Lat/Vert}>AGC
  30. slider5:1<1,6,1>Time Constant
  31. slider6:100<1,10000,1>Level detector RMS window
  32. slider7:1<1,50,0.1>Current comp. ratio
  33. slider8:0<-90,0,0.1>Gain reduction
  34.  
  35. @init
  36.   log2db = 8.6858896380650365530225783783321; // 20 / ln(10)
  37.   db2log = 0.11512925464970228420089957273422; // ln(10) / 20 
  38.   dcoffset = 0.0000000000000000000000001;
  39.   i=0;
  40.   attime=0.0002; //200us
  41.   reltime=0.300; //300ms
  42.   rmstime=0.000050; //50us
  43.   maxover=0;
  44.   ratio=0;
  45.   cratio=0;
  46.   rundb=0;
  47.   overdb=0;
  48.   maxover=0;
  49.   atcoef=exp(-1/(attime * srate));
  50.   relcoef=exp(-1/(reltime * srate));
  51.   rmscoef=exp(-1/(rmstime * srate));
  52.   leftright = 0;
  53.   latvert = 1;
  54.  
  55. @slider
  56.   thresh = slider1;
  57.   threshv = exp(thresh * db2log);
  58.   ratio = 20;
  59.   bias = 80 * slider2 / 100;
  60.   cthresh = thresh - bias;
  61.   cthreshv = exp(cthresh * db2log);
  62.   makeup = slider3;
  63.   makeupv = exp(makeup * db2log);
  64.   agc = slider4;
  65.   timeconstant = slider5;
  66.   timeconstant == 1 ? (
  67.     attime = 0.0002;
  68.     reltime = 0.300;
  69.   );
  70.   timeconstant == 2 ? (
  71.     attime = 0.0002;
  72.     reltime = 0.800;
  73.   );
  74.   timeconstant == 3 ? (
  75.     attime = 0.0004;
  76.     reltime = 2.000;
  77.   );
  78.   timeconstant == 4 ? (
  79.     attime = 0.0008;
  80.     reltime = 5.000;
  81.   );
  82.   timeconstant == 5 ? (
  83.     attime = 0.0002;
  84.     reltime = 10.000;
  85.   );
  86.   timeconstant == 6 ? (
  87.     attime = 0.0004;
  88.     reltime = 25.000;
  89.   );
  90.   atcoef = exp(-1 / (attime * srate));
  91.   relcoef = exp(-1 / (reltime * srate));
  92.   
  93.   rmstime = slider6 / 1000000; 
  94.   rmscoef=exp(-1/(rmstime * srate));
  95.  
  96. @sample
  97.   agc == leftright ? (
  98.     aspl0 = abs(spl0);
  99.     aspl1 = abs(spl1);
  100.   ) : (  
  101.     aspl0 = abs(spl0+spl1)/2;
  102.     aspl1 = abs(spl0-spl1)/2;
  103.   );
  104.  
  105.   maxspl = max(aspl0, aspl1);
  106.   maxspl = maxspl * maxspl;
  107.  
  108.   runave = maxspl + rmscoef * (runave - maxspl);
  109.   det = sqrt(max(0,runave));
  110.  
  111.   overdb = 2.08136898 * log(det/threshv) * log2db;
  112. //  overdb > maxover ? (
  113. //    maxover = overdb;
  114. //  );
  115.   overdb = max(0,overdb);
  116.  
  117.   overdb > rundb ? (
  118.     rundb = overdb + atcoef * (rundb - overdb);
  119.   ) : (
  120.     rundb = overdb + relcoef * (rundb - overdb);
  121.   );
  122.   overdb = max(rundb,0);
  123.  
  124.   bias == 0 ? (
  125.     cratio = ratio;
  126.   ) : (
  127.     cratio = 1 + (ratio-1) * sqrt((overdb + dcoffset) / (bias + dcoffset));
  128.   );
  129.   slider7 = cratio;
  130.   
  131.   gr = -overdb * (cratio-1)/cratio;
  132.   slider8 = -gr;
  133.   grv = exp(gr * db2log);
  134.   
  135. //  runmax = maxover + relcoef * (runmax - maxover);  // highest peak for setting att/rel decays in reltime
  136. //  maxover = runmax;
  137.   
  138.   agc == leftright ? (
  139.     spl0 *= grv * makeupv;
  140.     spl1 *= grv * makeupv;
  141.   ) : (
  142.     sav0 = (spl0 + spl1) * grv;
  143.     sav1 = (spl0 - spl1) * grv;
  144.     spl0 = makeupv * (sav0 + sav1) * 0.5;
  145.     spl1 = makeupv * (sav0 - sav1) * 0.5;
  146.   );
  147.  
  148. //  ospl0 = spl0;
  149. //  ospl1 = spl1;
  150.