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

  1. desc: super pitch shifter
  2.  
  3. slider1:0<-100,100,1>pitch adjust (cents)
  4. slider2:0<-12,12,1>pitch adjust (semitones)
  5. slider3:0<-12,12,1>pitch adjust (octaves)
  6. slider4:50<0,200,1>window size (ms)
  7. slider5:20<0.05,50,0.5>overlap size (ms)
  8. slider6:0<-120,6,1>wet mix (dB)
  9. slider7:-120<-120,6,1>dry mix (dB)
  10. slider8:1<0,1,1{NO,YES}>filter
  11.  
  12. @init
  13.   bufsize = srate|0;
  14.   xfade=100;
  15.   bufloc0 = 10000;
  16.   bufloc1 = bufloc0+bufsize+1000;
  17.  
  18.   buffer0 = bufloc0;
  19.   buffer1 = bufloc1;
  20.   bufdiff=bufloc1-bufloc0;
  21.   pitch=1.0;
  22.   denorm=10^-20;
  23.  
  24. @slider
  25.   filter=slider8>0.5;
  26.   bsnew=(min(slider4,1000)*0.001*srate)|0;
  27.   bsnew!=bufsize ? 
  28.   (
  29.       bufsize = bsnew;
  30.       v0=buffer0+bufsize*0.5;
  31.       v0 > bufloc0 + bufsize? v0-=bufsize;
  32.   );
  33.  
  34.   xfade=(slider5*0.001*srate)|0;
  35.   xfade>bsnew*0.5 ? xfade=bsnew*0.5;
  36.  
  37.   npitch=2^((slider2+slider1*0.01)/12+slider3);
  38.   pitch!=npitch ? (
  39.     pitch=npitch;
  40.     lppos=pitch > 1.0 ? 1.0/pitch : pitch;
  41.     lppos< (.1/srate) ? lppos=.1/srate;
  42.     r=1.0;       
  43.     c = 1.0 / tan($pi * lppos * 0.5);
  44.     a1 = 1.0 / ( 1.0 + r * c + c * c);
  45.     a2 = 2*a1;
  46.     a3 = a1;
  47.     b1 = 2.0 * ( 1.0 - c*c) * a1;
  48.     b2 = ( 1.0 - r * c + c * c) * a1;
  49.     h01=h02=h03=h04=0;
  50.     h11=h12=h13=h14=0;
  51.   );
  52.   drymix = 2 ^ (slider7/6); 
  53.   wetmix = 2 ^ (slider6/6);
  54.  
  55. @sample
  56.   iv0=0|(v0); frac0=v0-iv0;
  57.   iv02 = iv0 >= (bufloc0+bufsize-1) ? iv0-bufsize+1 : iv0+1;   
  58.   
  59.   ren0=(iv0[0]*(1-frac0)+iv02[0]*frac0);
  60.   ren1=(iv0[bufdiff]*(1-frac0)+iv02[bufdiff]*frac0);
  61.   vr=pitch;
  62.  
  63.   vr >= 1.0 ?
  64.   (
  65.     tv=v0;
  66.     tv>buffer0?tv-=bufsize;
  67.     (tv >= buffer0-xfade && tv < buffer0) ? (
  68.        // xfade
  69.       frac=(buffer0-tv)/xfade;
  70.       tmp=v0+xfade;
  71.       tmp>=bufloc0+bufsize?tmp-=bufsize;
  72.       tmp2=tmp>=bufloc0+bufsize-1?bufloc0:tmp+1;
  73.       ren0 = ren0*frac + (1-frac)*( tmp[0]*(1-frac0)+tmp2[0]*frac0 );
  74.       ren1 = ren1*frac + (1-frac)*( tmp[bufdiff]*(1-frac0)+tmp2[bufdiff]*frac0 );
  75.       tv+vr > buffer0+1 ? v0+=xfade;
  76.     );
  77.   ) : ( // read pointer moving slower than write pointer
  78.     tv=v0;
  79.     tv<buffer0?tv+=bufsize;
  80.     (tv >= buffer0 && tv < buffer0+xfade) ? (
  81.        // xfade
  82.       frac=(tv-buffer0)/xfade;
  83.       tmp=v0+xfade;
  84.       tmp>=bufloc0+bufsize?tmp-=bufsize;
  85.       tmp2=tmp>=bufloc0+bufsize-1?bufloc0:tmp+1;
  86.       ren0 = ren0*frac + (1-frac)*( tmp[0]*(1-frac0)+tmp2[0]*frac0 );
  87.       ren1 = ren1*frac + (1-frac)*( tmp[bufdiff]*(1-frac0)+tmp2[bufdiff]*frac0 );
  88.       tv+vr < buffer0+1 ? v0+=xfade;
  89.     );
  90.   );
  91.     
  92.  
  93.   ((v0+=vr) >= (bufloc0+bufsize)) ? v0 -= bufsize;
  94.  
  95.   os0=spl0; os1=spl1;
  96.   filter && pitch>1.0?
  97.   (
  98.     t0=spl0; t1=spl1;
  99.     spl0=a1*spl0 + a2*h01 + a3*h02 - b1*h03 - b2*h04 + denorm;
  100.     spl1=a1*spl1 + a2*h11 + a3*h12 - b1*h13 - b2*h14 + denorm;
  101.     h02=h01; h01=t0;
  102.     h12=h11; h11=t1;
  103.     h04=h03; h03=spl0;
  104.     h14=h13; h13=spl1;
  105.   );
  106.  
  107.  
  108.   buffer0[0] = spl0; // write after reading it to avoid clicks
  109.   buffer0[bufdiff] = spl1;
  110.  
  111.   spl0 = ren0 * wetmix;
  112.   spl1 = ren1 * wetmix;
  113.  
  114.   filter && pitch<1.0?
  115.   (
  116.     t0=spl0; t1=spl1;
  117.     spl0=a1*spl0 + a2*h01 + a3*h02 - b1*h03 - b2*h04 + denorm;
  118.     spl1=a1*spl1 + a2*h11 + a3*h12 - b1*h13 - b2*h14 + denorm;
  119.     h02=h01; h01=t0;
  120.     h12=h11; h11=t1;
  121.     h04=h03; h03=spl0;
  122.     h14=h13; h13=spl1;
  123.   );
  124.  
  125.   spl0+=os0*drymix;
  126.   spl1+=os1*drymix;
  127.  
  128.   ((buffer0+=1) >= (bufloc0 + bufsize)) ? buffer0 -= bufsize;
  129.