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

  1. desc: FFT delayer
  2. slider1:0<0,20,1>delay band 1 (frames)
  3. slider2:-120<-120,1,1>feedback band 1 (db)
  4. slider3:0<0,20,1>delay band 2 (frames)
  5. slider4:-120<-120,1,1>feedback band 2 (db)
  6. slider5:0<0,20,1>delay band 3 (frames)
  7. slider6:-120<-120,1,1>feedback band 3 (db)
  8. slider7:0<0,20,1>delay band 4 (frames)
  9. slider8:-120<-120,1,1>feedback band 4 (db)
  10. slider9:0<0,20,1>delay band 5 (frames)
  11. slider10:-120<-120,1,1>feedback band 5 (db)
  12. slider11:0<0,20,1>delay band 6 (frames)
  13. slider12:-120<-120,1,1>feedback band 6 (db)
  14. slider13:0<0,20,1>delay band 7 (frames)
  15. slider14:-120<-120,1,1>feedback band 7 (db)
  16. slider15:0<0,20,1>delay band 8 (frames)
  17. slider16:-120<-120,1,1>feedback band 8 (db)
  18.  
  19. @init 
  20.  
  21.   maxdelay=21;
  22.   window=    120000;
  23.   hist=      240000;
  24.   dlens=     358000;
  25.   btops=    359000;
  26.   dfb = 359500;
  27.   delaylines=360000;
  28.  
  29.   fftsize=2048;
  30.   invfsize=1/fftsize;
  31.   hfftsize=fftsize*0.5;
  32.   tmp=0;
  33.   tsc=3.14159/hfftsize;
  34.   loop(hfftsize,
  35.     window[tmp]=0.42-0.50*cos(tmp*tsc)+0.08*cos(2*tmp*tsc);
  36.     tmp+=1;
  37.   );
  38.   bpos=0; 
  39.   curblock=0;
  40.   lastblock=65536;
  41.   delaypos=0;
  42.   pdc_top_ch=2;
  43.   pdc_bot_ch=0;
  44.   pdc_delay=fftsize;
  45.   btops[0]=2;
  46.   btops[1]=4;
  47.   btops[2]=8;
  48.   btops[3]=16;
  49.   btops[4]=64;
  50.   btops[5]=128;
  51.   btops[6]=512;
  52.   btops[7]=1024;
  53.  
  54. @slider
  55.   dlens[0]=slider1;
  56.   dfb[0]=2^(slider2/6);
  57.   dlens[1]=slider3;
  58.   dfb[1]=2^(slider4/6);
  59.   dlens[2]=slider5;
  60.   dfb[2]=2^(slider6/6);
  61.   dlens[3]=slider7;
  62.   dfb[3]=2^(slider8/6);
  63.   dlens[4]=slider9;
  64.   dfb[4]=2^(slider10/6);
  65.   dlens[5]=slider11;
  66.   dfb[5]=2^(slider12/6);
  67.   dlens[6]=slider13;
  68.   dfb[6]=2^(slider14/6);
  69.   dlens[7]=slider15;
  70.   dfb[7]=2^(slider16/6);
  71.   tmp=0;
  72.   loop(8,
  73.      dlens[tmp]|=0;
  74.      dlens[tmp] < 1 ? dlens[tmp]=0 : (dlens[tmp] > maxdelay-1 ? dlens[tmp]=maxdelay-1);
  75.      tmp+=1;
  76.   );
  77.  
  78. @sample
  79.  
  80. bpos >= fftsize ? (
  81.  
  82.   t=curblock;
  83.   curblock=lastblock;
  84.   lastblock=t;
  85.  
  86.   fft(curblock,fftsize);
  87.   fft_permute(curblock,fftsize);
  88.  
  89.   dbo = (delaylines+delaypos*fftsize*2);
  90.   tmp=0;
  91.   loop(fftsize*2,
  92.      dbo[tmp]=curblock[tmp]; tmp+=1;
  93.      );
  94.  
  95.   i=0;
  96.   idx=0;
  97.   loop(8,
  98.     btop=btops[idx]*2;
  99.     fb=dfb[idx];
  100.     delamt=dlens[idx]; idx+=1;
  101.     delamt > 0 ? (
  102.        a = delaypos - delamt;
  103.        a < 0 ? a += maxdelay;
  104.        a|=0;
  105.        delbuf = delaylines+a*fftsize*2;
  106.        while(
  107.         i2=fftsize*2-i-2;
  108.  
  109.         curblock[i] += (a=delbuf[i]); 
  110.         curblock[i+1] += (b=delbuf[i+1]); 
  111.         curblock[i2] += (c=delbuf[i2]); 
  112.         curblock[i2+1] += (d=delbuf[i2+1]); 
  113.  
  114.         fb > 0.0000001 ? (
  115.           dbo[i]+=a*fb;
  116.           dbo[i+1]+=b*fb;
  117.           dbo[i2]+=c*fb;
  118.           dbo[i+1]+=d*fb;
  119.         );
  120.  
  121.         (i+=2) < btop;          
  122.        );
  123.     ) : (
  124.        i=btop;
  125.     );
  126.   );
  127.   fft_ipermute(curblock,fftsize);
  128.   ifft(curblock,fftsize);
  129.   (delaypos += 1) >= maxdelay ? delaypos=0;
  130.   bpos=0;
  131. );
  132.  
  133. // make sample
  134. w=window[bpos*0.5];
  135. iw=1-w;
  136.  
  137. os0=spl0*invfsize;
  138. os1=spl1*invfsize;
  139.  
  140. spl0=(curblock[bpos]*w + lastblock[fftsize+bpos]*iw);
  141. spl1=(curblock[bpos+1]*w + lastblock[fftsize+bpos+1]*iw);
  142.  
  143. lastblock[bpos]=hist[bpos];
  144. lastblock[bpos+1]=hist[bpos+1];
  145. lastblock[fftsize+bpos]=os0;
  146. lastblock[fftsize+bpos+1]=os1;
  147.  
  148. hist[bpos]=os0;
  149. hist[bpos+1]=os1;
  150. bpos+=2;
  151.