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

  1. // Copyright 2006, Thomas Scott Stillwell
  2. // Portions Copyright (C) 2006 Cockos Incorporated
  3. // All rights reserved.
  4. //
  5. //Redistribution and use in source and binary forms, with or without modification, are permitted 
  6. //provided that the following conditions are met:
  7. //
  8. //Redistributions of source code must retain the above copyright notice, this list of conditions 
  9. //and the following disclaimer. 
  10. //
  11. //Redistributions in binary form must reproduce the above copyright notice, this list of conditions 
  12. //and the following disclaimer in the documentation and/or other materials provided with the distribution. 
  13. //
  14. //The name of Thomas Scott Stillwell may not be used to endorse or 
  15. //promote products derived from this software without specific prior written permission. 
  16. //
  17.  
  18.  
  19. //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
  20. //IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
  21. //FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
  22. //BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
  23. //(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
  24. //PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
  25. //STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
  26. //THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  
  28. desc: ozzifier - pitch/delay doubler
  29.  
  30. slider1:2<0,6,1>Number of voices
  31. slider2:10<0,120,0.1>time spread (ms)
  32. slider3:20<0,120,1>pitch spread (cent)
  33. slider4:-6<-120,6,1>wet mix (dB)
  34. slider5:-6<-120,6,1>dry mix (dB)
  35. slider6:100<0,100>pan spread%
  36.  
  37. @init
  38.   bufsize = srate|0;
  39.   xfade=(srate*0.10)|0; // 100ms xfade
  40.   bufloc0 = 10000;
  41.   bufloc1 = bufloc0+bufsize+1000;
  42.   voiceptr0loc = bufloc1+bufsize+1000;
  43.   voicerateloc = voiceptr-loc+1000;
  44.   cospanloc = voicerateloc+1000;
  45.   sinpanloc = cospanloc+1000;
  46.  
  47.   buffer0 = bufloc0;
  48.   buffer1 = bufloc1;
  49.   voiceptr0 = voiceptr0loc;
  50.   voicerate = voicerateloc;
  51.   cospan = cospanloc;
  52.   sinpan = sinpanloc;
  53.  
  54.   bufdiff=bufloc1-bufloc0;
  55. @slider
  56.   numvoices = slider1;
  57.  
  58.   delaytime = (slider2*0.001*srate)|0;
  59.  
  60.   pitchspread = slider3;
  61.  
  62.   totalpitch = pitchspread * numvoices;
  63.  
  64.   bufsize = (delaytime)|0; 
  65.   xfade=(bufsize*0.05)|0;
  66.  
  67.   drymix = 2 ^ (slider5/6); 
  68.   wetmix = 2 ^ (slider4/6);
  69.  
  70.   panwidth = slider6/100;
  71.   lpan = 0.5 - (panwidth/2);
  72.   panincr = panwidth/max(1,numvoices-1);
  73.  
  74.   i = 1;
  75.  
  76.   loop(numvoices,
  77.     voicerate[i] = 2 ^ (-((totalpitch / 2) - (pitchspread * i)) / 1200);
  78.     voiceptr0[i] = bufloc0 + bufsize - (i/numvoices) * delaytime;
  79.     (voiceptr0[i] < bufloc0) ? voiceptr0[i] += bufsize;
  80.     cospan[i] = cos((lpan + (i - 1) * panincr) * $pi / 2);
  81.     sinpan[i] = sin((lpan + (i - 1) * panincr) * $pi / 2);
  82.     i += 1;
  83.   );
  84. @sample
  85.   wet0 = wet1 = 0;
  86.   i = 1;
  87.   loop(numvoices,
  88.     v0=voiceptr0[i]; iv0=0|(v0); frac0=v0-iv0;
  89.     iv02 = iv0 >= (bufloc0+bufsize-1) ? iv0-bufsize+1 : iv0+1;   
  90.   
  91.     ren0=(iv0[0]*(1-frac0)+iv02[0]*frac0);
  92.     ren1=(iv0[bufdiff]*(1-frac0)+iv02[bufdiff]*frac0);
  93.     vr=voicerate[i];
  94.  
  95.     vr >= 1.0 ?
  96.     (
  97.       tv=v0;
  98.       tv>buffer0?tv-=bufsize;
  99.       (tv >= buffer0-xfade && tv < buffer0) ? (
  100.          // xfade
  101.         frac=(buffer0-tv)/xfade;
  102.         tmp=v0+xfade;
  103.         tmp>=bufloc0+bufsize?tmp-=bufsize;
  104.         tmp2=tmp>=bufloc0+bufsize-1?bufloc0:tmp+1;
  105.         ren0 = ren0*frac + (1-frac)*( tmp[0]*(1-frac0)+tmp2[0]*frac0 );
  106.         ren1 = ren1*frac + (1-frac)*( tmp[bufdiff]*(1-frac0)+tmp2[bufdiff]*frac0 );
  107.         tv+vr > buffer0+1 ? v0+=xfade;
  108.       );
  109.     ) : ( // read pointer moving slower than write pointer
  110.       tv=v0;
  111.       tv<buffer0?tv+=bufsize;
  112.       (tv >= buffer0 && tv < buffer0+xfade) ? (
  113.          // xfade
  114.         frac=(tv-buffer0)/xfade;
  115.         tmp=v0+xfade;
  116.         tmp>=bufloc0+bufsize?tmp-=bufsize;
  117.         tmp2=tmp>=bufloc0+bufsize-1?bufloc0:tmp+1;
  118.         ren0 = ren0*frac + (1-frac)*( tmp[0]*(1-frac0)+tmp2[0]*frac0 );
  119.         ren1 = ren1*frac + (1-frac)*( tmp[bufdiff]*(1-frac0)+tmp2[bufdiff]*frac0 );
  120.         tv+vr < buffer0+1 ? v0+=xfade;
  121.       );
  122.     );
  123.     wet0 += cospan[i] * ren0;
  124.     wet1 += sinpan[i] * ren1;
  125.     
  126.     ((v0+=vr) >= (bufloc0+bufsize)) ? v0 -= bufsize;
  127.     voiceptr0[i]=v0;
  128.     i += 1;
  129.   );
  130.  
  131.   buffer0[0] = spl0; // write after reading it to avoid clicks
  132.   buffer0[bufdiff] = spl1;
  133.  
  134.   spl0 = wet0 * wetmix + spl0 * drymix;
  135.   spl1 = wet1 * wetmix + spl1 * drymix;
  136.  
  137.   ((buffer0+=1) >= (bufloc0 + bufsize)) ? buffer0 -= bufsize;
  138.