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