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

  1. // This effect Copyright (C) 2004 and later Cockos Incorporated
  2. // License: GPL - http://www.gnu.org/licenses/gpl.html
  3.  
  4. desc: tonifier
  5.  
  6. slider1:0<-100,6,1>wet mix (dB)
  7. slider2:-100<-100,6,1>dry mix (dB)
  8. slider3:10<1,1000,10>block size (ms)
  9. slider4:0<-48,48,1>freq shift (semitones)
  10.  
  11. slider5:0<0,6,1>max auto shift (octaves)
  12. slider6:100<0,20000>auto shift min frequency (Hz)
  13. slider7:1000<0,20000>auto shift max frequency (Hz)
  14. slider8:0,Output frequency (Hz)
  15.  
  16. @slider
  17.   lbsize=bsize;
  18.   bsize=(slider3*srate*0.001)|0; 
  19.   ibsize=1/bsize;
  20.   sscal=2 ^ (slider4/12)*ibsize*2;
  21.   wet=2 ^ (slider1/6)*ibsize*1.7;  // 1.7 seems about right for volume scaling
  22.   dry=2 ^ (slider2/6);
  23.  
  24.   lbsize != bsize ? (
  25.   bpos= 
  26.   zccnt0=zccnt1=
  27.   lzccnt0=lzccnt1=
  28.   ampcnt0=ampcnt1=
  29.   lampcnt0=lampcnt1=
  30.   ls0=ls1=0;
  31.   );
  32.  
  33.   maxf=slider7/srate*2; minf=slider6/srate*2;
  34.  
  35. @block
  36.   updcnt=updcnt+samplesblock; 
  37.   updcnt > srate*0.2 ? ( updcnt=0; slider8=(freq0+freq1)*0.25*srate; sliderchange(128); );
  38.  
  39. @sample
  40.  
  41. // count zero crossings
  42. ts0=spl0>0;
  43.  
  44. ts0 && ls0 ? zccnt0+=1;
  45. ls0=!ts0;
  46.  
  47. ts1=spl1>0;
  48. ts1 && ls1 ? zccnt1+=1;
  49. ls1=!ts1;
  50.  
  51. // count amplitude (square maybe?)
  52. ampcnt0+=abs(spl0);
  53. ampcnt1+=abs(spl1);
  54.  
  55. // find local amplitude and update buffer
  56. fbpos=bsize+bsize+bpos+bpos;
  57. acnt0=lampcnt0+ampcnt0-fbpos[0];
  58. fbpos[0]=ampcnt0;
  59. fbpos+=1;
  60. acnt1=lampcnt1+ampcnt1-fbpos[0];
  61. fbpos[0]=ampcnt1;
  62.  
  63. // find local zero crossing count and update buffer
  64. fbpos=bpos+bpos;
  65. lcnt0=lzccnt0+zccnt0-fbpos[0];
  66. fbpos[0]=zccnt0;
  67. fbpos+=1;
  68. lcnt1=lzccnt1+zccnt1-fbpos[0];
  69. fbpos[0]=zccnt1;
  70.  
  71. // advance buffer
  72. bpos+=1;
  73. bpos >= bsize ? (
  74.     bpos=0;
  75.     // keep ampcnt* and zccnt* in a reasonable range
  76.     lampcnt0=ampcnt0;
  77.     lampcnt1=ampcnt1;
  78.     lzccnt0=zccnt0;
  79.     lzccnt1=zccnt1;
  80.     ampcnt0=ampcnt1=zccnt0=zccnt1=0;
  81. );
  82.  
  83. freq0=lcnt0*sscal;
  84. freq1=lcnt1*sscal;
  85.  
  86. loop(slider5,
  87.   freq0 > maxf ? freq0*=0.5 : (freq0 < minf ? freq0 *= 2);
  88.   freq1 > maxf ? freq1*=0.5 : (freq1 < minf ? freq1 *= 2);
  89. );
  90.  
  91. tpos0=tpos0+$pi*freq0;
  92. tpos1=tpos1+$pi*freq1;
  93.  
  94. spl0=sin(tpos0)*acnt0*wet + spl0*dry;
  95. spl1=sin(tpos1)*acnt1*wet + spl1*dry;
  96.