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

  1. desc:spectrum analyzer
  2. /*
  3. Copyright (C) 2007 Cockos Incorporated
  4. License: GPL - http://www.gnu.org/licenses/gpl.html
  5. */
  6.  
  7. slider1:6<0,9,1{16,32,64,128,256,512,1024,2048,4096,8192,16384,32768}>FFT size
  8. slider2:-120<-224,-12,6>floor
  9. slider3:0<0,1,1{disabled,enabled}>show phase
  10. slider4:0<0,3,1{rectangular,hamming,blackman-harris,blackman}>window
  11.  
  12. @init
  13. recpos=0;
  14. fftsize=32768;
  15. gfx_clear=-1;
  16. windowtype=-1;
  17.  
  18. histsize=128*1024;
  19. window=histsize;
  20. fftworkspace=window+65536;
  21. lrecpos=0;
  22.  
  23.  
  24. @slider
  25. lfft=fftsize;
  26. a=(slider1|0);
  27. a<0?a=0:a>11?a=11;
  28. fftsize=2^(a+4);
  29. lfft!=fftsize?(
  30. recbuf=recpos=0;
  31. );
  32.  
  33. @block
  34.  
  35. ifftsize=1/fftsize;
  36.  
  37. @sample
  38. recpos[]=spl(0)+spl(1);
  39. recpos+=1;
  40. recpos >= histsize ? recpos=0;
  41.  
  42. @gfx 640 400
  43.  
  44. // only update if new fft data is there or if the size changed
  45. recpos != lrecpos || old_w != gfx_w || old_h!=gfx_h? (
  46.  
  47.  
  48. old_w=gfx_w; old_h=gfx_h;
  49.  
  50. gfx_r=gfx_g=gfx_b=0; gfx_a=1;
  51. gfx_x=gfx_y=0;
  52. gfx_rectto(gfx_w,gfx_h);
  53.  
  54. sc=(gfx_h-20)*20/(-slider2 * log(10));
  55.  
  56. // draw horz grid
  57. gfx_r=gfx_g=gfx_b=0.6;
  58. gfx_a=0.5;
  59. gv=1;
  60. cnt=100;
  61. gfx_y=-100;
  62. while(
  63.   gfx_x=0; y=20-log(gv)*sc;
  64.   y> gfx_y ? (
  65.     gfx_y=y;
  66.     gfx_lineto(gfx_w,gfx_y,0);
  67.     gfx_x=0; 
  68.     gfx_y+=2;
  69.     gfx_drawnumber(log10(gv)*20,0);
  70.     gfx_drawchar($'d');
  71.     gfx_drawchar($'B');
  72.     gfx_y+=gfx_texth;
  73.   );
  74.   gv*=0.5;
  75.  
  76.   gfx_y<gfx_h && cnt-=1 > 0;
  77. );
  78.  
  79.  
  80. wsc=gfx_w/log(1+400);
  81.  
  82. // draw vert grid
  83. f=100;
  84. while(
  85.  
  86.   tx = log(1.0+((f-40)/srate*2.0)*400)*wsc;
  87.   tx > gfx_x+2 ? (
  88.     gfx_x=tx;
  89.     gfx_y=0;
  90.     gfx_lineto(gfx_x,gfx_h,0);
  91.     gfx_y -= gfx_texth;
  92.     gfx_x+=3;
  93.     gfx_drawnumber(f,0);
  94.     gfx_drawchar($'H');
  95.     gfx_drawchar($'z');
  96.   );
  97.   f+=f;
  98.   f < srate*0.5;
  99. );
  100.  
  101. lrecpos=recpos;
  102.  
  103. (
  104.   windowsize != fftsize || windowtype != slider4 ? (
  105.     windowtype=slider4; 
  106.     windowsize=fftsize;
  107.     i=0;
  108.     dwindowpos = $pi*2/fftsize;
  109.     windowpos=-dwindowpos * m_fft_size / 4;
  110.  
  111.     loop(fftsize,
  112.        window[i] = (
  113.          windowtype==1 ? 0.53836 - cos(windowpos)*0.46164 :
  114.          windowtype==2 ? 0.35875 - 0.48829 * cos(windowpos) + 0.14128 * cos(2*windowpos) - 0.01168 * cos(6*windowpos) :
  115.          windowtype==3 ? 0.42 - 0.50 * cos(windowpos) + 0.08 * cos(2.0*windowpos) :
  116.           1.0)*ifftsize*0.5;
  117.        windowpos+=dwindowpos;
  118.        i+=1;
  119.     );
  120.   );
  121.  
  122.  
  123.   buf1=lrecpos-fftsize;
  124.   buf1<0 ? buf1+=histsize;
  125.   buf2=window;
  126.   buf3=fftworkspace;
  127.   loop(fftsize,
  128.     buf3[] = buf1[]*buf2[];
  129.     buf3[1]=0;
  130.     buf3+=2;
  131.  
  132.     buf2+=1;
  133.     (buf1+=1) >= histsize ? buf1 -= histsize;
  134.   );
  135.   fft(fftworkspace,fftsize);
  136.   fft_permute(fftworkspace,fftsize);
  137.  
  138.   i=0;
  139.   ascale=gfx_h/$pi*0.25;
  140.   xscale=800/(fftsize-1);
  141.   loop(fftsize*0.5-1,
  142.     aa=fftworkspace[i*2+2]; bb=fftworkspace[i*2+3];
  143.     dv=aa*aa+bb*bb;
  144.     dv<0.00000000000000000001 ? dv=0.0000000000000000000001;
  145.     ty= (-log(dv)*0.5)*sc+20;
  146.  
  147.     ang=-atan2(aa,bb);
  148.  
  149.     ty2=ang*ascale + gfx_h*0.5;
  150.  
  151.     tx = log(1.0+i*xscale)*wsc;
  152.  
  153.  
  154.  
  155.     i ? 
  156.     ( 
  157.       slider3?(
  158.       gfX_r=0.6; gfx_g=0; gfx_b=0.8; gfx_a=1;
  159.       gfx_x=lx; gfx_y=ly2; gfx_lineto(tx,ty2,1) ;
  160.       );
  161.  
  162.       gfX_r=gfx_g=1; gfx_b=0;gfx_a=1.0;
  163.       gfx_x=lx; gfx_y=ly; gfx_lineto(tx,ty,1) ;
  164.     );
  165.  
  166.     lx=tx; ly=ty; ly2=ty2;
  167.     i+=1;
  168.   );
  169. );
  170.  
  171.  
  172. );