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-granul < prev    next >
Text File  |  2007-12-03  |  6KB  |  249 lines

  1. // This effect Copyright (C) 2004 and later Cockos Incorporated
  2. // License: GPL - http://www.gnu.org/licenses/gpl.html
  3.  
  4. desc:granular loop sampler (mono)
  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:1<0,10,1>trigger base (uses x..x+3)
  13. slider4:0<0,30000,1>length (ms)
  14. slider5:1000<0,30000,200>loop granularity (ms)
  15. slider6:16000<0,30000,200>maximum length (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=recpos=playpos=0;
  37. ext_noinit=1;
  38.  
  39.  
  40. @slider
  41. playmix=2 ^ (slider1/6);
  42. trigstart=(2 ^ ((slider3+0.1)|0))|0;
  43. playspeed=slider2;
  44.  
  45. slider4 < 0 ? slider4=0;
  46. gmaxl=1000000000/srate;
  47. slider4=min(slider4,gmaxl);
  48.  
  49. granule=(slider5*srate/1000)|0;
  50. maxgran=(slider6*srate/1000)|0;
  51. maxgran > 1000000 ? maxgran = 1000000;
  52.  
  53. olsize=0;
  54.  
  55. silthresh=slider7 > -119 ? (2^(slider7/6)) : 0;
  56.  
  57. vstpos=0*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,recpos);
  65. !isrec ? file_mem(0,0,recpos);
  66.  
  67. file_avail(0) >= 0 ?(
  68.   a=0;
  69.   slider4=(recpos * 1000 / srate)|0;
  70.   sliderchange(slider4);
  71. );
  72.  
  73. @block
  74. trigger&(trigstart) ? ( 
  75.   isplay ? // if playing, switch record and play on
  76.   ( 
  77.     !isrec ? lastioffs=-1;
  78.     isrec=1;
  79.   )
  80.   :
  81.   (
  82.       isrec ? ( // start playing, but keep recording
  83.          playpos=0; 
  84.          isplay=1;
  85.          lastioffs=-1;
  86.       )
  87.       :
  88.       ( // stop playing, start recording
  89.         recpos=isplay=0; isrec=1; 
  90.         silstart=-1;
  91.       )
  92.   )
  93. );
  94. trigger&(trigstart*6) ? 
  95. (
  96.   isrec ? (
  97.      isplay ? 
  98.      (
  99.        isrec=0;
  100.      )
  101.      :
  102.      (
  103.        // switch to playback
  104.        playpos=isrec=0; 
  105.        isplay=vreclen > 4 ? (trigger&(trigstart*4) ? 2 : 1) : 0;
  106.  
  107.        orecpos=recpos;
  108.  
  109.        recpos = (((silstart + granule/2) / granule)|0) * granule;
  110.        recpos < granule ? recpos=granule;
  111.        recpos > maxgran ? recpos=maxgran;
  112.  
  113.         slider4=(recpos * 1000 / srate)|0;
  114.         sliderchange(slider4);
  115.         vreclen=(slider4*srate/1000-vstpos)-olsize;
  116.  
  117.        // figure out what the delta between where we need to be and where we
  118.        // are is
  119.  
  120.        // how many samples we went over
  121.        delta=((orecpos-recpos)*abs(playspeed))%granule;
  122.        delta > 0 ? (
  123.          playpos=playspeed > 0 ? delta : vreclen-delta;
  124.        ); // eat the samples
  125.        
  126.        freembuf(recpos); // free any unused memory       
  127.      )
  128.   ) : (
  129.      isplay && !(trigger&(trigstart*4)) ? isplay=0 : (
  130.        // start over playback
  131.        playpos=0; 
  132.        isplay=vreclen > 4 ? (trigger&(trigstart*4)?2:1) : 0;
  133.      )
  134.   )
  135. );
  136.  
  137. lslider8=slider8;
  138. isplay ? 
  139. (
  140.   isrec ? 
  141.   (
  142.     slider8=3+isplay;
  143.   )
  144.   : 
  145.   slider8=1+isplay;
  146. ) : (
  147.   slider8=isrec?1:0;
  148. );
  149.  
  150. slider8!=lslider8 ?
  151. (
  152.   lslider8=slider8;
  153.   sliderchange(slider8);
  154. )
  155.  
  156. @sample
  157.  
  158. // if recording, record, and if we run out of
  159. // buffer, switch mode to looped playback
  160. isrec ? (
  161.  
  162.     isplay ? 
  163.     (      
  164.        offs = playspeed<0?vreclen-playpos:playpos;
  165.        ioffs=offs|0; // fr=offs-ioffs; 
  166.        lastioffs < 0 ? 
  167.        (    
  168.          vstpos[ioffs] += spl0;
  169.          lastioffs=ioffs;
  170.        ) 
  171.        :
  172.        (
  173.           cnt=0;  
  174.           mcnt=(abs(playspeed)+0.9)|0;
  175.            while(
  176.              ioffs != lastioffs ? 
  177.              (
  178.                //update current sample with our sample, but only once
  179.                //maybe get around this by just adding spl0*(1-fr)
  180.               vstpos[lastioffs] += spl0;
  181.               lastioffs+=sign(playspeed);
  182.               lastioffs < 0 ? (lastioffs=vreclen-1) : (lastioffs >= vreclen ? lastioffs=0);
  183.             );
  184.             ioffs != lastioffs && (cnt+=1) < mcnt;
  185.           ) // while
  186.        )
  187.     )
  188.     :
  189.     (
  190.       recpos >= maxgran ? 
  191.       (  
  192.         isplay=1;
  193.         playpos=isrec=0; 
  194.  
  195.         recpos = (((silstart / granule) + granule/2)|0) * granule;
  196.         recpos < granule ? recpos=granule;
  197.         recpos > maxgran ? recpos=maxgran;
  198.  
  199.         slider4=(recpos * 1000 / srate)|0;
  200.         sliderchange(slider4);
  201.         vreclen=(slider4*srate/1000-vstpos)-olsize;
  202.       ) : (
  203.         recpos[0]=spl0;
  204.         recpos+=1;
  205.  
  206.         abs(spl0) >= silthresh ?
  207.         (
  208.           silstart < 0 ? 
  209.           (
  210.             recpos=1;
  211.             recpos[-1]=spl0;             
  212.             vstpos=0;
  213.           );
  214.           silstart=recpos;
  215.         );
  216.         slider4=(silstart * 1000 / srate)|0;
  217.         sliderchange(slider4);
  218.         vreclen=(silstart-vstpos)-olsize;
  219.       );
  220.     );
  221. ); // if isrec
  222.  
  223.  
  224. // if isplay = 1, loop playback
  225. // if isplay = 2, one shot playback
  226. isplay ? (
  227.    isplay==2 || olsize <= playpos ? (
  228.        offs = playspeed<0?vreclen-playpos:playpos;
  229.        ioffs=offs|0; fr=offs-ioffs;
  230.        spl0=spl0 + (vstpos[ioffs]*(1-fr)+vstpos[ioffs+1]*fr)*playmix; // one shot gets no overlap
  231.    ) : (
  232.        tmpmix=playpos/olsize;
  233.        offs=playspeed<0?vreclen-playpos:playpos;
  234.        ioffs=offs|0; fr=offs-ioffs;
  235.        spl0=spl0 + (vstpos[ioffs]*(1-fr)+vstpos[ioffs+1]*fr)*playmix*tmpmix; // overlap with self
  236.        offs=playspeed<0?playpos:vreclen+playpos;
  237.        ioffs=offs|0; fr=offs-ioffs;
  238.        spl0=spl0 + (vstpos[ioffs]*(1-fr)+vstpos[ioffs+1]*fr)*playmix*(1-tmpmix); // overlap with self
  239.     );
  240.       
  241.     spl1=spl0;
  242.  
  243.     isplay == 2 ? (
  244.       playpos+abs(playspeed) > vreclen ? isrec=isplay=playpos=0 : playpos=playpos+abs(playspeed);
  245.     ) : (
  246.       playpos=playpos+abs(playspeed)>vreclen?0:playpos+abs(playspeed);
  247.     )
  248. );
  249.