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

  1. desc:spectrograph
  2.  
  3. /*
  4. Copyright (C) 2007 Cockos Incorporated
  5. License: GPL - http://www.gnu.org/licenses/gpl.html
  6. */
  7.  
  8. slider1:6<0,9,1{16,32,64,128,256,512,1024,2048,4096,8192,16384,32768}>FFT size
  9. slider2:0<0,3,1{rectangular,hamming,blackman-harris,blackman}>window
  10. slider3:-180<-180,6,1>gate (dB)
  11.  
  12.  
  13. /* color ramp:
  14. 1111222233334444555566667777
  15. ------------rrRRRRRRRRRRRRRR
  16. ----ggGGGGGGGGGGGGgg----ggGG
  17. bbBBBBBBBBbb--------bbBBBBBB
  18.  
  19.  
  20. 7 sections, we'll say each will be 24dB
  21.  
  22.  
  23. */
  24.  
  25. @init
  26. fftsize=32768;
  27. recpos=0;
  28. gfx_clear=-1;
  29. windowtype=-1;
  30. over24=1/24;
  31. histsize=128*1024;
  32. window=histsize;
  33. fftworkspace=window+65536;
  34.  
  35. lrecpos=0;
  36.  
  37. @slider
  38. lfft=fftsize;
  39. a=(slider1|0);
  40. a<0?a=0:a>11?a=11;
  41. fftsize=2^(a+4);
  42. minvol=10^(slider3/20*2); // squared
  43.  
  44. @block
  45.  
  46. ifftsize=1/fftsize;
  47.  
  48. @sample
  49. recpos[]=(spl0+spl1);
  50. recpos+=1;
  51. recpos >= histsize ? recpos=0;
  52.  
  53.  
  54. @gfx 640 400
  55.  
  56. old_w != gfx_w || old_h!=gfx_h? (
  57. cur_xpos=0;
  58. old_w=gfx_w; old_h=gfx_h;
  59.  
  60. gfx_r=gfx_g=gfx_b=0; gfx_a=1;
  61. gfx_x=gfx_y=0;
  62. gfx_rectto(gfx_w,gfx_h);
  63.  
  64. );
  65.  
  66. recpos != lrecpos ? (
  67.   windowsize != fftsize || windowtype != slider2 ? (
  68.     windowtype=slider2; 
  69.     windowsize=fftsize;
  70.     i=0;
  71.     dwindowpos = $pi*2/fftsize;
  72.     windowpos=-dwindowpos * m_fft_size / 4;
  73.  
  74.     loop(fftsize,
  75.        window[i] =  (
  76.          windowtype==1 ? 0.53836 - cos(windowpos)*0.46164 :
  77.          windowtype==2 ? 0.35875 - 0.48829 * cos(windowpos) + 0.14128 * cos(2*windowpos) - 0.01168 * cos(6*windowpos) :
  78.          windowtype==3 ? 0.42 - 0.50 * cos(windowpos) + 0.08 * cos(2.0*windowpos) :
  79.           1.0) *0.5*ifftsize;
  80.        windowpos+=dwindowpos;
  81.        i+=1;
  82.     );
  83.   );
  84.  
  85.   lrecpos=recpos;
  86.  
  87.   buf1=lrecpos-fftsize;
  88.   buf1<0 ? buf1+=histsize;
  89.   buf2=window;
  90.   buf3=fftworkspace;
  91.   loop(fftsize,
  92.     buf3[] = buf1[]*buf2[];
  93.     buf3[1]=0;
  94.     buf3+=2;
  95.  
  96.     buf2+=1;
  97.     (buf1+=1) >= histsize ? buf1 -= histsize;
  98.   );
  99.   fft(fftworkspace,fftsize);
  100.   fft_permute(fftworkspace,fftsize);
  101.  
  102.   lfftpos=0;
  103.   i=0;
  104.   lscale=10/log(10);
  105.   sc=0.5*fftsize/gfx_h;
  106.   !(mouse_cap&1) ? (
  107.    gfx_a=0.1;
  108.    gfx_x=cur_xpos+1;
  109.    gfx_y=0; 
  110.    gfx_r=gfx_g=gfx_b=0;
  111.    gfx_rectto(cur_xpos+20,gfx_h);
  112.    cur_xpos+20 > gfx_w ? (
  113.      gfx_x=0;
  114.      gfx_y=0;
  115.      gfx_rectto(cur_xpos+20-gfx_w,gfx_h);
  116.    );
  117.    loop(gfx_h,
  118.     tpos=(sc*i)|0;
  119.     tpos >= fftsize*0.5 ? tpos=fftsize*0.5;
  120.     lfftpos >= tpos ? ( tpos?lfftpos=tpos-1:tpos=lfftpos+1);
  121.     mv=0;
  122.     loop(tpos-lfftpos,
  123.       aa=fftworkspace[tpos*2]; bb=fftworkspace[tpos*2+1];
  124.       dv=aa*aa+bb*bb;
  125.       dv<0.00000000000000000001 ? dv=0.0000000000000000000001;
  126.       dv>mv?mv=dv;
  127.  
  128.       lfftpos+=1;
  129.     );
  130.     mv=mv < minvol ? -200 : log(mv)*lscale;
  131.     
  132.      
  133.     gfx_x=cur_xpos;
  134.     gfx_y=gfx_h-i-1; 
  135.     gfx_a=1;
  136.  
  137.  
  138.     mv <= -96  ? (
  139.       mv<=-168 ? gfx_setpixel(0,0,0) : 
  140.       mv <= -144 ? gfx_setpixel(0,0,(mv+168)*over24) :
  141.       mv <= -120 ? gfx_setpixel(0,(mv+144)*over24,1) :
  142.         gfx_setpixel(0,1,1-(mv+120)*over24) 
  143.     ) : (
  144.       mv <= -72  ? gfx_setpixel((mv+96)*over24,1,0) :
  145.       mv <= -48  ? gfx_setpixel(1,1-(mv+72)*over24,0) : 
  146.       mv <= -24  ? gfx_setpixel(1,0,(mv+48)*over24) : 
  147.       mv <= 0 ? gfx_setpixel(1,(mv+24)*over24,1) : 
  148.               gfx_setpixel(1,1,1);
  149.     );      
  150.     i+=1;
  151.   );
  152.  
  153.   cur_xpos+=1;
  154.   cur_xpos >= gfx_w ? cur_xpos=0;
  155.   );
  156. );
  157.  
  158. gfx_x=gfx_w-140;
  159. gfx_y=gfx_h-gfx_texth;
  160. gfx_r=gfx_g=gfx_b=0;
  161. gfx_a=1;
  162. gfx_rectto(gfx_w,gfX_h);
  163.  
  164. mouse_x >=0 && mouse_x < gfx_w  &&
  165. mouse_y >= 0 && mouse_y < gfx_h ? (
  166.   !(mouse_cap&1) ? mb=-1000;
  167.   bla=0;
  168.   loop(25,
  169.     gfx_x=mouse_x -2 + (bla%5); 
  170.     gfx_y=mouse_y -2 + (bla/5);
  171.     gfx_getpixel(r,g,b); 
  172.     r||g||b ? (
  173.  
  174.       // calculate amplitude at this point based on RGB
  175.       !r && !g ? b = -168 + b*24:
  176.       b == 1.0 && !r ? b=-144 + g*24:
  177.       g == 1.0 && !r ? b=-120 + (1-b)*24:
  178.       g == 1.0 && !b ? b=-96 + r*24:
  179.       r == 1.0 && !b ? b=-72 + (1-g)*24:
  180.       r == 1.0 && !g ? b=-48 + b*24:
  181.       r == 1.0 && b==1.0 ? b=-24+g*24;
  182.  
  183.       b > mb ? mb=b;
  184.     );
  185.     bla+=1;
  186.   );
  187.   (
  188.     gfx_x=gfx_w-140;
  189.     gfx_y=gfx_h-gfx_texth;
  190.     gfx_r=gfx_g=gfx_b=1;
  191.     mb > -1000.0 ? (
  192.      gfx_drawnumber(mb,1); 
  193.     ) : (
  194.       gfx_drawchar($'-');
  195.       gfx_drawchar($'o');
  196.       gfx_drawchar($'o');
  197.     );
  198.     gfx_drawchar($'d');
  199.     gfx_drawchar($'B');
  200.     gfx_drawchar($' ');
  201.     gfx_drawnumber((gfx_h-mouse_y)*srate*0.5/gfx_h,0);
  202.     gfx_drawchar($'H');
  203.     gfx_drawchar($'z');
  204.   );
  205. );