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-dual < prev    next >
Text File  |  2007-12-03  |  4KB  |  174 lines

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