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