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 / LoopSamplers / loopsampler-m2 < prev   
Text File  |  2007-02-12  |  5KB  |  219 lines

  1. // This effect Copyright (C) 2004 and later Cockos Incorporated
  2. // License: GPL - http://www.gnu.org/licenses/gpl.html
  3.  
  4. desc:advanced mono loop sampler
  5. /* trigger 1 starts recording
  6.     trigger 2 stops recording + looped play
  7.     trigger 3 one off play
  8. */
  9.  
  10. slider1:0<-120,12,1>loop volume (dB)
  11. slider2:1<-8,8,0.1>play speed (can be negative)
  12. slider3:0<0,30000,1>play start pos (ms)
  13. slider4:0<0,30000,1>play end pos (ms)
  14. slider5:1<0,10,1>trigger base (uses x..x+3)
  15. slider6:10<0,1000,1>edge overlap (ms)
  16. slider7:-120<-120,0,1>silence removal threshold (dB)
  17. slider8:0<0,6,1{stopped,recording,playing looped,playing once,playing looped+recording,playing once+recording>state
  18.  
  19. /* idle mix=volume when not playing sample
  20.     play mix = mix when playing sample
  21.     record mix = mix of new and old sample
  22.     playlen lets you play only part of the sample
  23.  
  24.   if you hit button1 and isrec is active, we switch to play, keeping isrec
  25.   active.
  26.  
  27.   if you hit button1 and isplay is active, we mix in the source signal with 
  28.   the sample.
  29.  
  30.  
  31. */
  32.  
  33.  
  34.  
  35. @init
  36. isplay=isrec=reclen=recpos=playpos=0;
  37. ext_noinit=1;
  38.  
  39.  
  40. @slider
  41. playmix=2 ^ (slider1/6);
  42. trigstart=(2 ^ ((slider5+0.1)|0))|0;
  43. playspeed=slider2;
  44.  
  45. slider3 < 0 ? slider3=0;
  46. slider4 < 0 ? slider4=0;
  47. gmaxl=1000000000/srate;
  48. slider3=min(slider3,gmaxl);
  49. slider4=min(slider4,gmaxl);
  50.  
  51. olsize=srate*slider6/1000;
  52. slider4=max(slider3,slider4);
  53.  
  54. silthresh=slider7 > -119 ? (2^(slider7/6)) : 0;
  55.  
  56. vstpos=slider3*srate/1000;
  57. vreclen=(slider4*srate/1000-vstpos)-olsize;
  58. slider8=lslider8;
  59.  
  60. @serialize
  61. file_var(0,isplay);
  62. file_var(0,isrec);
  63. file_var(0,reclen);
  64. file_var(0,recpos);
  65. file_var(0,0);//playpos);
  66. !isrec ? file_mem(0,0,reclen);
  67.  
  68. @block
  69. trigger&(trigstart) ? ( 
  70.   isplay ? // if playing, switch record and play on
  71.   ( 
  72.     !isrec ? lastioffs=-1;
  73.     isrec=1;
  74.   )
  75.   :
  76.   (
  77.       isrec ? ( // start playing, but keep recording
  78.          playpos=0; 
  79.          isplay=1;
  80.          lastioffs=-1;
  81.       )
  82.       :
  83.       ( // stop playing, start recording
  84.         recpos=isplay=0; isrec=1; 
  85.         slider3=0;
  86.         silstart=-1;
  87.         sliderchange(slider3);
  88.       )
  89.   )
  90. );
  91. trigger&(trigstart*6) ? 
  92. (
  93.   isrec ? (
  94.      isplay ? 
  95.      (
  96.        isrec=0;
  97.      )
  98.      :
  99.      (
  100.        // switch to playback
  101.        playpos=isrec=0; 
  102.        isplay=vreclen > 4 ? (trigger&(trigstart*4) ? 2 : 1) : 0;
  103.        freembuf(reclen); // free any unused memory
  104.  
  105.      )
  106.   ) : (
  107.      isplay && !(trigger&(trigstart*4)) ? isplay=0 : (
  108.        // start over playback
  109.        playpos=0; 
  110.        isplay=vreclen > 4 ? (trigger&(trigstart*4)?2:1) : 0;
  111.      )
  112.   )
  113. );
  114.  
  115. lslider8=slider8;
  116. isplay ? 
  117. (
  118.   isrec ? 
  119.   (
  120.     slider8=3+isplay;
  121.   )
  122.   : 
  123.   slider8=1+isplay;
  124. ) : (
  125.   slider8=isrec?1:0;
  126. );
  127.  
  128. slider8!=lslider8 ?
  129. (
  130.   lslider8=slider8;
  131.   sliderchange(slider8);
  132. )
  133.  
  134. @sample
  135.  
  136. // if recording, record, and if we run out of
  137. // buffer, switch mode to looped playback
  138. isrec ? (
  139.  
  140.     isplay ? 
  141.     (      
  142.        offs = playspeed<0?vreclen-playpos:playpos;
  143.        ioffs=offs|0; // fr=offs-ioffs; 
  144.        lastioffs < 0 ? 
  145.        (    
  146.          vstpos[ioffs] += spl0;
  147.          lastioffs=ioffs;
  148.        ) 
  149.        :
  150.        (
  151.           cnt=0;  
  152.           mcnt=(abs(playspeed)+0.9)|0;
  153.            while(
  154.              ioffs != lastioffs ? 
  155.              (
  156.                //update current sample with our sample, but only once
  157.                //maybe get around this by just adding spl0*(1-fr)
  158.               vstpos[lastioffs] += spl0;
  159.               lastioffs+=sign(playspeed);
  160.               lastioffs < 0 ? (lastioffs=vreclen-1) : (lastioffs >= vreclen ? lastioffs=0);
  161.             );
  162.             ioffs != lastioffs && (cnt+=1) < mcnt;
  163.           ) // while
  164.        )
  165.     )
  166.     :
  167.     (
  168.       recpos >= 1000000 ? 
  169.       (  
  170.         isplay=1;
  171.         playpos=isrec=0; 
  172.       ) : (
  173.         recpos[0]=spl0;
  174.         reclen=recpos+=1;
  175.  
  176.         abs(spl0) >= silthresh ?
  177.         (
  178.           silstart < 0 ? 
  179.           (
  180.             recpos=1;
  181.             recpos[-1]=spl0;             
  182.             vstpos=0;
  183.           );
  184.           silstart=recpos;
  185.         );
  186.         slider4=(silstart * 1000 / srate)|0;
  187.         sliderchange(slider4);
  188.         vreclen=(silstart-vstpos)-olsize;
  189.       );
  190.     );
  191. ); // if isrec
  192.  
  193.  
  194. // if isplay = 1, loop playback
  195. // if isplay = 2, one shot playback
  196. isplay ? (
  197.    isplay==2 || olsize <= playpos ? (
  198.        offs = playspeed<0?vreclen-playpos:playpos;
  199.        ioffs=offs|0; fr=offs-ioffs;
  200.        spl0=spl0 + (vstpos[ioffs]*(1-fr)+vstpos[ioffs+1]*fr)*playmix; // one shot gets no overlap
  201.    ) : (
  202.        tmpmix=playpos/olsize;
  203.        offs=playspeed<0?vreclen-playpos:playpos;
  204.        ioffs=offs|0; fr=offs-ioffs;
  205.        spl0=spl0 + (vstpos[ioffs]*(1-fr)+vstpos[ioffs+1]*fr)*playmix*tmpmix; // overlap with self
  206.        offs=playspeed<0?playpos:vreclen+playpos;
  207.        ioffs=offs|0; fr=offs-ioffs;
  208.        spl0=spl0 + (vstpos[ioffs]*(1-fr)+vstpos[ioffs+1]*fr)*playmix*(1-tmpmix); // overlap with self
  209.     );
  210.       
  211.     spl1=spl0;
  212.  
  213.     isplay == 2 ? (
  214.       playpos+abs(playspeed) > vreclen ? isrec=isplay=playpos=0 : playpos=playpos+abs(playspeed);
  215.     ) : (
  216.       playpos=playpos+abs(playspeed)>vreclen?0:playpos+abs(playspeed);
  217.     )
  218. );
  219.