home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 July & August / PCWorld_2007-07-08_cd.bin / audio-video / reaper / reaper1861-install.exe / Effects / Misc / tonifier2 < prev   
Text File  |  2007-02-12  |  3KB  |  123 lines

  1. // This effect Copyright (C) 2004 and later Cockos Incorporated
  2. // License: GPL - http://www.gnu.org/licenses/gpl.html
  3. // this algorithm is based on the one used by gtkguituner, the schmitt-triggering.
  4.  
  5.  
  6. desc: tonifier (schmitt-triggering)
  7.  
  8. slider1:0<-100,6,1>wet mix (dB)
  9. slider2:-100<-100,6,1>dry mix (dB)
  10. slider3:0.995<0.96,1>amplitude falloff (factor)
  11. slider4:0<-48,48,1>freq shift (semitones)
  12.  
  13. slider5:4<0,6,1>max auto shift (octaves)
  14. slider6:100<0,20000>auto shift min frequency (Hz)
  15. slider7:300<0,20000>auto shift max frequency (Hz)
  16. slider8:0,Output frequency (Hz)
  17.  
  18. @slider
  19.   sscal=2 ^ (slider4/12) / srate;
  20.   wet=2 ^ (slider1/6);
  21.   dry=2 ^ (slider2/6);
  22.  
  23.   maxf=slider7/srate*2; minf=slider6/srate*2;
  24.  
  25.   state=0;
  26.   splpos=0;
  27.   trigfact=0.5;
  28.   numsamples=1024;
  29.   lastrate=0;
  30.  
  31.  
  32. @block
  33.   updcnt=updcnt+samplesblock; 
  34.   updcnt > srate*0.5 ? ( updcnt=0; slider8=(freq0+freq1)*0.25*srate; sliderchange(128); );
  35.  
  36. @sample
  37.  
  38. @sample
  39.  
  40. state ? 
  41. (
  42.   // track minimum and maximum values for sample
  43.   a1=max(a1,spl0);
  44.   a2=min(a2,spl0);
  45.  
  46.   splpos[0]=spl0;
  47.   splpos += 1;
  48.   splpos >= 1024 ? 
  49.   (
  50.     splpos=0;
  51.     state=0;
  52.     a2 *= trigfact;
  53.     a1 *= trigfact;
  54.  
  55.     lst=0;
  56.     startpoint=1;
  57.     loop(numsamples-1, 
  58.         lst == 0 && startpoint[0] > a1 ? lst=1;
  59.         lst == 1 && startpoint[0] >= a2 && startpoint[1] < a2 ? lst=2;
  60.         lst != 2 ? startpoint+=1;       
  61.     );
  62.     smtrig=0;
  63.     endpoint=startpoint+1;
  64.     tc=0;
  65.     i=startpoint;
  66.     loop(numsamples-startpoint,
  67.        smtrig ? 
  68.        ( 
  69.           i[0] >= a2 && i[1] < a2 ? (
  70.             endpoint=i;
  71.             tc+=1;
  72.             smtrig=0;
  73.           )
  74.        )
  75.        :
  76.        (
  77.           smtrig = i[0] >= a1;
  78.        );
  79.        i+=1;
  80.  
  81.     );
  82.     endpoint == startpoint ? endpoint += 1;
  83.  
  84.     lastrate = tc / (endpoint-startpoint);
  85.  
  86.   );
  87. )
  88. :
  89. (
  90.   0[0] <= 0 && spl0 > 0 ?
  91.   (
  92.     state=1;
  93.     1[0]=spl0;
  94.     splpos=2;
  95.     a1=spl0;
  96.     a2=0[0];
  97.   );
  98. );
  99.  
  100.  
  101. // count amplitude (square maybe?)
  102. ampcnt0=max(ampcnt0,abs(spl0));
  103. ampcnt1=max(ampcnt1,abs(spl1));
  104.  
  105. acnt0=ampcnt0 * (1-slider3) + acnt0*slider3;
  106. acnt1=ampcnt1 * (1-slider3) + acnt0*slider3;
  107. ampcnt0 *= slider3;
  108. ampcnt1 *= slider3;
  109.  
  110. freq0=lastrate*2;
  111. freq1=lastrate*2;
  112.  
  113. loop(slider5,
  114.   freq0 > maxf ? freq0*=0.5 : (freq0 < minf ? freq0 *= 2);
  115.   freq1 > maxf ? freq1*=0.5 : (freq1 < minf ? freq1 *= 2);
  116. );
  117.  
  118. tpos0=tpos0+$pi*freq0;
  119. tpos1=tpos1+$pi*freq1;
  120.  
  121. spl0=sin(tpos0)*acnt0*wet + spl0*dry;
  122. spl1=sin(tpos1)*acnt1*wet + spl1*dry;
  123.