home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 January / PCWorld_2007-01_cd.bin / temacd / reaper / reaper147-install.exe / Effects / LoopSamplers / loopsampler-m2 < prev   
Text File  |  2005-06-24  |  5KB  |  218 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.  
  38.  
  39. @slider
  40. playmix=2 ^ (slider1/6);
  41. trigstart=(2 ^ ((slider5+0.1)|0))|0;
  42. playspeed=slider2;
  43.  
  44. slider3 < 0 ? slider3=0;
  45. slider4 < 0 ? slider4=0;
  46. gmaxl=1000000000/srate;
  47. slider3=min(slider3,gmaxl);
  48. slider4=min(slider4,gmaxl);
  49.  
  50. olsize=srate*slider6/1000;
  51. slider4=max(slider3,slider4);
  52.  
  53. silthresh=slider7 > -119 ? (2^(slider7/6)) : 0;
  54.  
  55. vstpos=slider3*srate/1000;
  56. vreclen=(slider4*srate/1000-vstpos)-olsize;
  57. slider8=lslider8;
  58.  
  59. @serialize
  60. file_var(0,isplay);
  61. file_var(0,isrec);
  62. file_var(0,reclen);
  63. file_var(0,recpos);
  64. file_var(0,0);//playpos);
  65. !isrec ? file_mem(0,0,reclen);
  66.  
  67. @block
  68. trigger&(trigstart) ? ( 
  69.   isplay ? // if playing, switch record and play on
  70.   ( 
  71.     !isrec ? lastioffs=-1;
  72.     isrec=1;
  73.   )
  74.   :
  75.   (
  76.       isrec ? ( // start playing, but keep recording
  77.          playpos=0; 
  78.          isplay=1;
  79.          lastioffs=-1;
  80.       )
  81.       :
  82.       ( // stop playing, start recording
  83.         recpos=isplay=0; isrec=1; 
  84.         slider3=0;
  85.         silstart=-1;
  86.         sliderchange(slider3);
  87.       )
  88.   )
  89. );
  90. trigger&(trigstart*6) ? 
  91. (
  92.   isrec ? (
  93.      isplay ? 
  94.      (
  95.        isrec=0;
  96.      )
  97.      :
  98.      (
  99.        // switch to playback
  100.        playpos=isrec=0; 
  101.        isplay=vreclen > 4 ? (trigger&(trigstart*4) ? 2 : 1) : 0;
  102.        freembuf(reclen); // free any unused memory
  103.  
  104.      )
  105.   ) : (
  106.      isplay && !(trigger&(trigstart*4)) ? isplay=0 : (
  107.        // start over playback
  108.        playpos=0; 
  109.        isplay=vreclen > 4 ? (trigger&(trigstart*4)?2:1) : 0;
  110.      )
  111.   )
  112. );
  113.  
  114. lslider8=slider8;
  115. isplay ? 
  116. (
  117.   isrec ? 
  118.   (
  119.     slider8=3+isplay;
  120.   )
  121.   : 
  122.   slider8=1+isplay;
  123. ) : (
  124.   slider8=isrec?1:0;
  125. );
  126.  
  127. slider8!=lslider8 ?
  128. (
  129.   lslider8=slider8;
  130.   sliderchange(slider8);
  131. )
  132.  
  133. @sample
  134.  
  135. // if recording, record, and if we run out of
  136. // buffer, switch mode to looped playback
  137. isrec ? (
  138.  
  139.     isplay ? 
  140.     (      
  141.        offs = playspeed<0?vreclen-playpos:playpos;
  142.        ioffs=offs|0; // fr=offs-ioffs; 
  143.        lastioffs < 0 ? 
  144.        (    
  145.          vstpos[ioffs] += spl0;
  146.          lastioffs=ioffs;
  147.        ) 
  148.        :
  149.        (
  150.           cnt=0;  
  151.           mcnt=(abs(playspeed)+0.9)|0;
  152.            while(
  153.              ioffs != lastioffs ? 
  154.              (
  155.                //update current sample with our sample, but only once
  156.                //maybe get around this by just adding spl0*(1-fr)
  157.               vstpos[lastioffs] += spl0;
  158.               lastioffs+=sign(playspeed);
  159.               lastioffs < 0 ? (lastioffs=vreclen-1) : (lastioffs >= vreclen ? lastioffs=0);
  160.             );
  161.             ioffs != lastioffs && (cnt+=1) < mcnt;
  162.           ) // while
  163.        )
  164.     )
  165.     :
  166.     (
  167.       recpos >= 1000000 ? 
  168.       (  
  169.         isplay=1;
  170.         playpos=isrec=0; 
  171.       ) : (
  172.         recpos[0]=spl0;
  173.         reclen=recpos+=1;
  174.  
  175.         abs(spl0) >= silthresh ?
  176.         (
  177.           silstart < 0 ? 
  178.           (
  179.             recpos=1;
  180.             recpos[-1]=spl0;             
  181.             vstpos=0;
  182.           );
  183.           silstart=recpos;
  184.         );
  185.         slider4=(silstart * 1000 / srate)|0;
  186.         sliderchange(slider4);
  187.         vreclen=(silstart-vstpos)-olsize;
  188.       );
  189.     );
  190. ); // if isrec
  191.  
  192.  
  193. // if isplay = 1, loop playback
  194. // if isplay = 2, one shot playback
  195. isplay ? (
  196.    isplay==2 || olsize <= playpos ? (
  197.        offs = playspeed<0?vreclen-playpos:playpos;
  198.        ioffs=offs|0; fr=offs-ioffs;
  199.        spl0=spl0 + (vstpos[ioffs]*(1-fr)+vstpos[ioffs+1]*fr)*playmix; // one shot gets no overlap
  200.    ) : (
  201.        tmpmix=playpos/olsize;
  202.        offs=playspeed<0?vreclen-playpos:playpos;
  203.        ioffs=offs|0; fr=offs-ioffs;
  204.        spl0=spl0 + (vstpos[ioffs]*(1-fr)+vstpos[ioffs+1]*fr)*playmix*tmpmix; // overlap with self
  205.        offs=playspeed<0?playpos:vreclen+playpos;
  206.        ioffs=offs|0; fr=offs-ioffs;
  207.        spl0=spl0 + (vstpos[ioffs]*(1-fr)+vstpos[ioffs+1]*fr)*playmix*(1-tmpmix); // overlap with self
  208.     );
  209.       
  210.     spl1=spl0;
  211.  
  212.     isplay == 2 ? (
  213.       playpos+abs(playspeed) > vreclen ? isrec=isplay=playpos=0 : playpos=playpos+abs(playspeed);
  214.     ) : (
  215.       playpos=playpos+abs(playspeed)>vreclen?0:playpos+abs(playspeed);
  216.     )
  217. );
  218.