home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 February / PCWorld_2008-02_cd.bin / audio-video / reaper / reaper2028-install.exe / Effects / schwa / fft_splitter next >
Text File  |  2007-12-09  |  3KB  |  119 lines

  1. desc: FFT splitter
  2.  
  3. slider1:2<0,3,1{1024,2048,4096}>FFT size
  4. slider2:5000<0,20000,1>split freq
  5. slider3:0<0,4,1{1/2,3/4,5/6,7/8}>low band dest
  6. slider4:1<0,4,1{1/2,3/4,5/6,7/8}>high band dest
  7.  
  8. @init 
  9.  
  10.   fftsize = -1;
  11.   pdc_bot_ch = 0;
  12.   pdc_top_ch = 8;
  13.  
  14.   // array pointers
  15.   window=0;
  16.   buf1 = 16384;
  17.   buf2 = 32768;
  18.   splitLo1 = 49152;
  19.   splitLo2 = 65536;
  20.   splitHi1 = 81920;
  21.   splitHi2 = 98304;
  22.  
  23. @slider
  24.  
  25.   pos = 0;
  26.   memset(buf1, 0, 2*fftsize);
  27.   memset(buf2, 0, 2*fftsize);
  28.   memset(splitLo1, 0, 2*fftsize);
  29.   memset(splitLo2, 0, 2*fftsize);
  30.   memset(splitHi1, 0, 2*fftsize);
  31.   memset(splitHi2, 0, 2*fftsize);
  32.  
  33.   sliderfft = (2^(slider1+10))|0;
  34.   fftsize != sliderfft ? (
  35.     memset(window, 0, fftsize); 
  36.     fftsize = sliderfft;
  37.     w = 2.0*3.14159/fftsize;
  38.     i = 0;
  39.     loop(fftsize/2,
  40.       window[i] = 0.42-0.50*cos(i*w)+0.08*cos(2.0*i*w);
  41.       i += 1;
  42.     ); 
  43.     pdc_delay = fftsize;
  44.   );  
  45.  
  46.   splitfreq = (2 * fftsize * slider2 / srate)|0;
  47.   wLo_01 = (slider3 == 0 ? 1.0 : 0.0);
  48.   wLo_23 = (slider3 == 1 ? 1.0 : 0.0);
  49.   wLo_45 = (slider3 == 2 ? 1.0 : 0.0);
  50.   wLo_67 = (slider3 == 3 ? 1.0 : 0.0);
  51.   wHi_01 = (slider4 == 0 ? 1.0 : 0.0);
  52.   wHi_23 = (slider4 == 1 ? 1.0 : 0.0);
  53.   wHi_45 = (slider4 == 2 ? 1.0 : 0.0);
  54.   wHi_67 = (slider4 == 3 ? 1.0 : 0.0);
  55.  
  56. @sample
  57.  
  58.   pos >= fftsize ? (
  59.     //memcpy(buf1, buf2+fftsize, fftsize);
  60.     tmp = buf1;
  61.     buf1 = buf2;
  62.     buf2 = tmp;
  63.  
  64.     tmp = splitLo1;
  65.     splitLo1 = splitLo2;
  66.     splitLo2 = tmp;
  67.  
  68.     tmp = splitHi1;
  69.     splitHi1 = splitHi2;
  70.     splitHi2 = tmp;    
  71.     
  72.     fft(buf1, fftsize);
  73.     fft_permute(buf1, fftsize);
  74.  
  75.     memcpy(splitLo1, buf1, splitfreq);
  76.     memset(splitLo1+splitfreq, 0, 2*(fftsize-splitfreq));
  77.     memcpy(splitLo1+2*fftsize-splitfreq, buf1+2*fftsize-splitfreq, splitfreq);
  78.  
  79.     memset(splitHi1, 0, splitfreq);
  80.     memcpy(splitHi1+splitfreq, buf1+splitfreq, 2*(fftsize-splitfreq));
  81.     memset(splitHi1+2*fftsize-splitfreq, 0, splitfreq);  
  82.  
  83.     fft_ipermute(splitLo1, fftsize);
  84.     fft_ipermute(splitHi1, fftsize);
  85.     ifft(splitLo1, fftsize);
  86.     ifft(splitHi1, fftsize);
  87.  
  88.     pos=0;
  89.   );
  90.  
  91.   w1 = window[pos/2];
  92.   w2 = window[(fftsize-pos)/2-1];
  93.   sw = (w1+w2);
  94.   sw == 0 ? (sw = fftsize) : (sw *= fftsize); 
  95.  
  96.   buf1[pos] = w1*spl0;
  97.   buf1[pos+1] = w1*spl1;
  98.   buf2[fftsize+pos] = w2*spl0;
  99.   buf2[fftsize+pos+1] = w2*spl1;
  100.  
  101.   spl0Lo = (splitLo1[pos]+splitLo2[fftsize+pos])/sw;
  102.   spl1Lo = (splitLo1[pos+1]+splitLo2[fftsize+pos+1])/sw;
  103.   
  104.   spl0Hi = (splitHi1[pos]+splitHi2[fftsize+pos])/sw;
  105.   spl1Hi = (splitHi1[pos+1]+splitHi2[fftsize+pos+1])/sw;
  106.   
  107.   spl0 = wLo_01*spl0Lo + wHi_01*spl0Hi;
  108.   spl1 = wLo_01*spl1Lo + wHi_01*spl1Hi;
  109.   spl2 = wLo_23*spl0Lo + wHi_23*spl0Hi;
  110.   spl3 = wLo_23*spl1Lo + wHi_23*spl1Hi;
  111.   spl4 = wLo_45*spl0Lo + wHi_45*spl0Hi;
  112.   spl5 = wLo_45*spl1Lo + wHi_45*spl1Hi;
  113.   spl6 = wLo_67*spl0Lo + wHi_67*spl0Hi;
  114.   spl7 = wLo_67*spl1Lo + wHi_67*spl1Hi;
  115.  
  116.   pos += 2;
  117.  
  118.  
  119.