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 / MIDI / drumtrigger next >
Text File  |  2007-02-12  |  3KB  |  108 lines

  1. // drumtrigger: generates MIDI note information from audio impulses
  2. // Copyright 2006, Thomas Scott Stillwell
  3. // All rights reserved.
  4. //
  5. //Redistribution and use in source and binary forms, with or without modification, are permitted 
  6. //provided that the following conditions are met:
  7. //
  8. //Redistributions of source code must retain the above copyright notice, this list of conditions 
  9. //and the following disclaimer. 
  10. //
  11. //Redistributions in binary form must reproduce the above copyright notice, this list of conditions 
  12. //and the following disclaimer in the documentation and/or other materials provided with the distribution. 
  13.  
  14.  
  15. //
  16. //The name of Thomas Scott Stillwell may not be used to endorse or 
  17. //promote products derived from this software without specific prior written permission. 
  18.  
  19.  
  20. //
  21.  
  22.  
  23. //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
  24. //IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
  25. //FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
  26. //BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
  27. //(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
  28. //PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
  29. //STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
  30. //THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31.  
  32. desc:Turn audio signal into velocity-sensitive drum trigger
  33.  
  34. slider1:-17<-60,6,1>Open Threshold (dB)
  35. slider2:-18<-60,6,1>Close Threshold (dB)
  36. slider3:30<0,200,0.1>Retrigger interval (ms)
  37. slider4:0<0,100,0.1>Original Signal Mix%;
  38. slider5:10<1,16,1>MIDI Channel
  39. slider6:69<0,255,1>MIDI Note#
  40. slider7:1<0.1,7.0,0.1>Peak Det. Interval
  41. slider8:1<-5.0,5.0,0.01>Trigger align (ms)
  42.  
  43. @init
  44.   sending=0;
  45.   sent=0;
  46.   noteon=9*16;
  47.   noteoff=8*16;
  48.   measuring=0;
  49.   meascnt=0;
  50.   maxvel=0;
  51.   triggerpos=0;
  52.   threshlat = 0.001 * srate;
  53.  
  54. @block
  55.   pos=0;
  56.   triggerpos=0;
  57.  
  58. @slider
  59.   othresh=2^(slider1/6);
  60.   cthresh=2^(slider2/6);
  61.   retrigger = (slider3 / 1000) * srate;
  62.   mix = slider4 / 100;
  63.   chan=slider5-1;
  64.   note=slider6;
  65.   velperiod=(slider7 / 1000) * srate;
  66.   threshlat=(slider8 / 1000) * srate;
  67.   oncmd=noteon+chan;
  68.   offcmd=noteoff+chan;
  69.  
  70. @sample
  71.   pos += 1;
  72.   trigwait += 1;    
  73.  
  74.   linvel=min(1,max(abs(spl0),abs(spl1)));
  75.   velocity=max(0,min(127,floor(maxvel*127)));
  76.  
  77.   linvel >= othresh && sent==0 && sending==0 && measuring==0 && trigwait >= retrigger ? (
  78.     measuring=1;
  79.     maxvel=linvel;
  80.     meascnt=0;
  81.     triggerpos=pos;
  82.   );
  83.   measuring==1 ? (
  84.     meascnt += 1;
  85.     meascnt >= velperiod ? (
  86.       measuring=0;
  87.       sending=1;
  88.       meascnt=0;
  89.     ) : (
  90.       maxvel=max(maxvel,linvel);
  91.     );
  92.   );
  93.   sent==0 && sending==1 ? (
  94.     sent=1;
  95.     sending=0;
  96.     trigwait=0;
  97.     midisend(max(0,triggerpos-threshlat), oncmd, note|velocity*256);
  98.   );
  99.   linvel <= cthresh && sent==1 && trigwait >= retrigger ? (
  100.     sent=0;
  101.     trigwait=0;
  102.     maxvel=0;
  103.     midisend(max(0,triggerpos-threshlat), offcmd, note);
  104.   );
  105.  
  106.   spl0 = spl0 * mix;
  107.   spl1 = spl1 * mix;
  108.