home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 March / PCWorld_2007-03_cd.bin / audio-video / reaper / reaper174-install.exe / Effects / SStillwell / flangebaby < prev    next >
Text File  |  2007-01-19  |  5KB  |  144 lines

  1. // Copyright 2007, 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:flangebaby - flanger with optional tempo sync
  25.  
  26. slider1:5<1,10,0.01>Flange (Delay)
  27. slider2:0.5<0,1,0.01>Depth
  28. slider3:0<-1,1,0.01>Feedback
  29. slider4:0<0,10,0.01>Speed (Hz, 0=tempo)
  30. slider5:0.5<0,1,0.01>Mix
  31. slider6:0<0,5,0.01>Channel Offset
  32. slider7:0.25<0.0625,4,0.0625>beatsync - fraction of whole note
  33. slider8:0<0,1,1{Triangle,Sine}>LFO Waveform
  34.  
  35. @init
  36.   MAX_WG_DELAY = 16384;
  37.   i = 0;
  38.   counter = 0;
  39.   buffer0 = 2048;
  40.   buffer1 = buffer0 + MAX_WG_DELAY;
  41.   memset(buffer0,0,MAX_WG_DELAY);
  42.   memset(buffer1,0,MAX_WG_DELAY);
  43.   feedback = 0;
  44.   delay = 5 ;
  45.   tdelay0 = delay;
  46.   tdelay1 = delay;
  47.   rate = 0;
  48.   mix = 0;
  49.   beat = 0.25;
  50.   triangle=0;
  51.   sinusoid=1;
  52.   lfo=triangle;
  53.   twopi = 2 * $pi;
  54.   
  55.  
  56. @slider
  57.   delay = slider1;
  58.   offset = slider6;
  59.   beat = 240 * slider7;  
  60.   tdelay0 = delay;
  61.   tdelay1 = (delay + offset);
  62.   sdelay0 = tdelay0 / 1000 * srate;
  63.   sdelay1 = tdelay1 / 1000 * srate;
  64.   feedback = slider3;
  65.   depth = (delay - 0.1) * slider2;
  66.   mix = slider5;
  67.   lfo = (slider8 == triangle ? triangle : sinusoid);
  68.   tpos = 0;
  69.  
  70. @block
  71.   slider4==0 ? (
  72.     rate=tempo / beat;
  73.   ):(
  74.     rate=slider4;
  75.   );
  76.  
  77.   (lfo==triangle) ? (
  78.      trate = 4 * depth / (srate / rate);
  79.   ) : (
  80.      trate = twopi / (srate / rate );
  81.   );
  82.  
  83.  
  84. @sample
  85.   back0 = counter - sdelay0;
  86.   back1 = counter - sdelay1;
  87.   (back0 < 0) ? back0 = MAX_WG_DELAY + back0;
  88.   (back1 < 0) ? back1 = MAX_WG_DELAY + back1;
  89.   index00 = back0 | 0;
  90.   index01 = back1 | 0;
  91.   index_10 = index00 - 1;
  92.   index_11 = index01 - 1;
  93.   index10 = index00 + 1;
  94.   index11 = index01 + 1;
  95.   index20 = index00 + 2;
  96.   index21 = index01 + 2;
  97.   (index_10 < 0) ? index_10 = MAX_WG_DELAY + 1;
  98.   (index_11 < 0) ? index_11 = MAX_WG_DELAY + 1;
  99.   (index10 >= MAX_WG_DELAY) ? index10 = 0;
  100.   (index11 >= MAX_WG_DELAY) ? index11 = 0;
  101.   (index20 >= MAX_WG_DELAY) ? index20 = 0;
  102.   (index21 >= MAX_WG_DELAY) ? index21 = 0;
  103.   y_10 = buffer0[index_10];
  104.   y_11 = buffer1[index_11];
  105.   y00 = buffer0[index00];
  106.   y01 = buffer1[index01];
  107.   y10 = buffer0[index10];
  108.   y11 = buffer1[index11];
  109.   y20 = buffer0[index20];
  110.   y21 = buffer1[index21];
  111.   x0 = back0 - index00;
  112.   x1 = back1 - index01;
  113.   c00 = y00;
  114.   c01 = y01;
  115.   c10 = 0.5 * (y10 - y_10);
  116.   c11 = 0.5 * (y11 - y_11);
  117.   c20 = y_10 - 2.5 * y00 + 2.0 * y10 - 0.5 * y20;
  118.   c21 = y_11 - 2.5 * y01 + 2.0 * y11 - 0.5 * y21;
  119.   c30 = 0.5 * (y20 - y_10) + 1.5 * (y00 - y10);
  120.   c31 = 0.5 * (y21 - y_11) + 1.5 * (y01 - y11);
  121.   output0 = ((c30 * x0 + c20) * x0 + c10) * x0 + c00;
  122.   output1 = ((c31 * x1 + c21) * x1 + c11) * x1 + c01;
  123.   buffer0[counter] = spl0 + output0 * feedback;
  124.   buffer1[counter] = spl1 + output1 * feedback;
  125.   spl0 = spl0 * (1-mix) + output0 * mix;
  126.   spl1 = spl1 * (1-mix) + output1 * mix;
  127.   counter += 1;
  128.   (counter >= MAX_WG_DELAY) ? counter = 0;
  129.   (lfo == triangle) ? (
  130.     dir0 ? tdelay0 += trate : tdelay0 -= trate;
  131.     dir1 ? tdelay1 += trate : tdelay1 -= trate;
  132.     (tdelay0 >= delay + depth) ? dir0 = 0;
  133.     (tdelay1 >= delay + depth) ? dir1 = 0;
  134.     (tdelay0 <= delay - depth) ? dir0 = 1;
  135.     (tdelay1 <= delay - depth) ? dir1 = 1;
  136.   ) : (
  137.     tdelay0 = delay + (delay-0.1) * sin(tpos);
  138.     tdelay1 = delay + (delay-0.1) * sin(tpos+offset);
  139.     tpos += trate;
  140.     (tpos > twopi) ? tpos = 0;
  141.   );
  142.   sdelay0 = tdelay0 / 1000 * srate;
  143.   sdelay1 = tdelay1 / 1000 * srate;
  144.