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

  1. // This effect Copyright (C) 2004 and later Cockos Incorporated
  2. // License: GPL - http://www.gnu.org/licenses/gpl.html
  3.  
  4.  
  5. desc: amp modeler
  6. slider1:/amp_models:none:Model
  7. slider2:0<-120,30,1>preamp (dB)
  8. slider3:1<0,1,1{no,yes}>upsample impulse if required
  9. slider4:0<0,1,1{L-stereo,stereo-stereo}>channel mode
  10. slider5:0,filter size
  11. slider6:0,FFT size
  12.  
  13.  
  14.  
  15. @init 
  16. fftsize=-1;
  17. need_refft=1;
  18. convsrc=128*1024;
  19. lslider1=-1;
  20. impbuf=256*1024;
  21.  
  22.  
  23. @slider
  24.   tmp=slider1|0;
  25.   tmp != lslider1 ?
  26.   (
  27.     lslider1=tmp;
  28.  
  29.     filehandle=file_open(slider1);
  30.     impbuf_l=impbuf_nch=impbuf_srate=0;
  31.     filehandle > 0 ? 
  32.     (
  33.       file_riff(filehandle,impbuf_nch,impbuf_srate);
  34.       impbuf_nch ?
  35.       (
  36.         impbuf_l=(file_avail(filehandle)/impbuf_nch)|0; 
  37.         need_refft=1; 
  38.         file_mem(filehandle,impbuf,impbuf_l*impbuf_nch);
  39.       );
  40.       file_close(filehandle);
  41.     );
  42.   );
  43.   !stereo_mode != !slider4 ? ( need_refft=1; stereo_mode=slider4; );
  44.  
  45.  
  46.  
  47.   useresample != slider3 ? (useresample=slider3; need_refft=1; );
  48.   preamp=2^(slider2/6);
  49.  
  50.   slider6=fftsize;
  51.   slider5=filtersize;
  52.  
  53. @block
  54.  
  55. need_refft ? (  // prepare convolution source, here...
  56.   useresample && srate > impbuf_srate && impbuf_srate > 1 ? 
  57.   (
  58.     filtersize = ((srate*impbuf_l)/impbuf_srate)|0;
  59.     isc=impbuf_srate/srate;
  60.   )
  61.   : 
  62.   (
  63.     filtersize=impbuf_l;
  64.     isc=1.0;
  65.   );
  66.  
  67.   fftsize=32;
  68.  
  69.   while(
  70.     filtersize > fftsize*0.5 ? 
  71.     (
  72.       fftsize += fftsize;
  73.     ) : 0;
  74.   );
  75.   slider5=filtersize;
  76.   slider6=fftsize;
  77.   sliderchange(slider5);
  78.   sliderchange(slider6); 
  79.   chunksize=fftsize-filtersize-1; // size of chunk size of audio to use
  80.   chunksize2=chunksize*2;
  81.   bpos=0; 
  82.   curblock=0;
  83.   lastblock=64*1024;
  84.   invfsize=1/fftsize;
  85.   i=0;
  86.   i2=0;
  87.   loop(min(fftsize,filtersize),
  88.      ipos=i|0;
  89.      ipart=(i-ipos);
  90.      convsrc[i2]=impbuf[ipos*impbuf_nch]*(1-ipart) + impbuf[(ipos+1)*impbuf_nch]*ipart;
  91.      convsrc[i2+1]=stereo_mode ? 0.0 : (impbuf[(ipos+1)*impbuf_nch-1]*(1-ipart) +
  92.                    impbuf[(ipos+1)*impbuf_nch-1]*(ipart));
  93.      i += isc;
  94.      i2+=2;
  95.   );
  96.   loop(fftsize-filtersize,
  97.      convsrc[i2]=convsrc[i2+1]=0;
  98.      i2+=2;
  99.   );
  100.   fft(convsrc,fftsize);
  101.   i=0;
  102.   loop(fftsize*2, convsrc[i] *= invfsize; i+=1; );
  103.   need_refft=0;
  104. );
  105.  
  106. @sample
  107.  
  108. filtersize > 0 ?
  109. (
  110.  
  111. bpos >= chunksize ? 
  112. (
  113.   t=lastblock;
  114.   lastblock=curblock;
  115.   curblock=t;
  116.  
  117.   memset(curblock+chunksize*2,0,(fftsize-chunksize)*2);
  118.  
  119.   fft(curblock,fftsize);
  120.   convolve_c(curblock,convsrc,fftsize);
  121.  
  122.  
  123. /*
  124.   i=0;
  125.   loop(fftsize,
  126.     r=curblock[i]; im=curblock[i+1];   
  127.     cr=convsrc[i]; ci=convsrc[i+1];
  128.     curblock[i]=r*cr-im*ci;
  129.     curblock[i+1]=r*ci+im*cr;
  130.     i+=2;
  131.   );
  132. */
  133.  
  134.   ifft(curblock,fftsize);
  135.  
  136.   bpos=0;
  137. );
  138.  
  139. // save sample
  140. bp2=bpos*2;
  141. lastblock[bp2]=spl0*preamp;
  142. lastblock[bp2+1]=stereo_mode ? (spl1*preamp) : 0;
  143.  
  144. spl0=curblock[bp2];
  145. spl1=curblock[bp2+1];
  146.  
  147. bpos < fftsize-chunksize ? 
  148. (
  149.   spl0+=lastblock[chunksize2+bp2];
  150.   spl1+=lastblock[chunksize2+bp2+1];
  151. );
  152.  
  153.  
  154. bpos += 1;
  155.  
  156. );
  157.