home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 February / PCWorld_2008-02_cd.bin / audio-video / reaper / reaper2028-install.exe / Effects / LOSER / ZeroCrossingMaximizer < prev   
Text File  |  2007-12-03  |  2KB  |  92 lines

  1. // (C) 2006-2007, Michael Gruhn.
  2.  
  3. // NO WARRANTY IS GRANTED. THIS PLUG-IN IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
  4. // WARRANTY OF ANY KIND. NO LIABILITY IS GRANTED, INCLUDING, BUT NOT LIMITED TO,
  5. // ANY DIRECT OR INDIRECT,  SPECIAL,  INCIDENTAL OR CONSEQUENTIAL DAMAGE ARISING
  6. // OUT OF  THE  USE  OR INABILITY  TO  USE  THIS PLUG-IN,  COMPUTER FAILTURE  OF
  7. // MALFUNCTION INCLUDED.  THE USE OF THE SOURCE CODE,  EITHER  PARTIALLY  OR  IN
  8. // TOTAL, IS ONLY GRANTED,  IF USED IN THE SENSE OF THE AUTHOR'S INTENTION,  AND
  9. // USED WITH ACKNOWLEDGEMENT OF THE AUTHOR. FURTHERMORE IS THIS PLUG-IN A  THIRD
  10. // PARTY CONTRIBUTION,  EVEN IF INCLUDED IN REAPER(TM),  COCKOS INCORPORATED  OR
  11. // ITS AFFILIATES HAVE NOTHING TO DO WITH IT.  LAST BUT NOT LEAST, BY USING THIS
  12. // PLUG-IN YOU RELINQUISH YOUR CLAIM TO SUE IT'S AUTHOR, AS WELL AS THE CLAIM TO
  13. // ENTRUST SOMEBODY ELSE WITH DOING SO.
  14.  
  15.  
  16. desc:Zero Crossing Maximizer (Not A Clipper)
  17.  
  18. slider1:0<-12,0,.1>Threshold (dB)
  19. slider2:0<-12,0,.1>Ceiling (dB)
  20. slider3:500<250,1000,1>Buffer Size (ms)
  21.  
  22. @slider
  23. thresh = 2^(slider1/6);
  24. buffer = 0;
  25. pdc_delay = bufSize = floor(min(slider3/1000 * srate,500000));
  26. bufOffs = bufSize + 1;
  27. pdc_bot_ch=0; pdc_top_ch=2;
  28. ceiling = 2^(slider2/6);
  29. volume = ceiling/thresh;
  30.  
  31. @sample
  32.  
  33. buffer[bufPos] = spl0;
  34.  
  35. // track zero crossings
  36. spl0 > 0 ? s0=1 : s0=0;
  37.  
  38. maxSpl0 = max ( maxSpl0, abs(spl0));
  39.  
  40. s0 != lastS0 ? 
  41. (
  42. maxSpl0 > thresh ? gain=thresh/maxSpl0 : gain=1;
  43. adjPos = length0;
  44.  
  45.     loop(length0+1,
  46.     buffer[bufPos - adjPos + ((bufPos-adjPos)<0 ? bufSize+1:0;) ] *= gain;
  47.     (adjPos -= 1);
  48.     );
  49.  
  50. length0 = -1;
  51. maxSpl0 = 0;
  52. );
  53. (length0+=1) > bufSize ? length0 = maxSpl1 = 0;
  54. lastS0 = s0;
  55.  
  56. bufOffs[bufPos] = spl1;
  57.  
  58.  
  59.  
  60. // track zero crossings
  61. spl1 > 0 ? s1=1 : s1=0;
  62.  
  63. maxSpl1 = max ( maxSpl1, abs(spl1));
  64.  
  65.  
  66. s1 != lastS1 ? 
  67. (
  68. maxSpl1 > thresh ? gain=thresh/maxSpl1 : gain=1;
  69. adjPos = length1;
  70.  
  71.     loop(length1+1,
  72.     bufOffs[bufPos - adjPos + ((bufPos-adjPos)<0 ? bufSize+1:0;) ] *= gain;
  73.     (adjPos -= 1);
  74.     );
  75.  
  76. length1 = -1;
  77. maxSpl1 = 0;
  78. );
  79. (length1+=1) > bufSize ? length1 = maxSpl1 = 0;
  80. lastS1 = s1;
  81.  
  82.  
  83. (bufPos += 1) > bufSize ? bufPos = 0 ;
  84.  
  85. spl0 = buffer[bufPos]*volume;
  86. spl1 = bufOffs[bufPos]*volume;
  87.  
  88. // Can comment this out for more speed ;)
  89. spl0 = min(max(spl0,-1),1);
  90. spl1 = min(max(spl1,-1),1);
  91.  
  92.