// This effect Copyright (C) 2004 and later Cockos Incorporated
// License: GPL - http://www.gnu.org/licenses/gpl.html
desc:disk streaming sound effect player
slider1:/sound_fx:none:Sound Effect
slider2:0<-120,12,1>volume (dB)
slider3:1<-8,8,0.1>play speed
slider4:1<0,10,1>start/stop trigger
slider5:0<0,1,1{one-shot,loop}>playback mode


@init
isplay=0;
mem_len=0;
mem_nch=1;
lslider1=-1;
myfile=-1;
lspl0=lspl1=0;

@slider

lslider1 != slider1 ? 
(
  lslider1 = slider1;
  file_close(myfile);
  myfile=file_open(slider1);
  mem_nch=mem_srate=0;
  file_riff(myfile,mem_nch,mem_srate);
  myfile_avail=mem_nch ? file_avail(myfile)/mem_nch : 0;
);

playmix=2 ^ (slider2/6);
trigstart=2 ^ (slider4|0);
playspeed=abs(slider3*mem_srate/srate);
doloop=slider5;
playsa=0;

@block
  trigger&trigstart ? 
  ( 
    isplay ? (
      isplay=0;
    ) : (
      isplay=1;
      file_rewind(myfile);
      myfile_avail=mem_nch ? file_avail(myfile)/mem_nch : 0;
    );
  );

@sample

isplay  && mem_nch ? (  
   myfile_avail <= 0 ? 
   ( 
     doloop ? 
     ( 
       file_rewind(myfile); myfile_avail=file_avail(myfile)/mem_nch;  
     ) 
     :
     (
       isplay=0;
     )
   );
   isplay ? 
   (
     playspeed > 1.0 ? 
     (
       playsa += playspeed;
       while(
         file_var(myfile,lspl0);
         mem_nch == 2 ? file_var(myfile,lspl1) : lspl1=lspl0;
         myfile_avail -= 1;
         playsa -= 1;
          
         playsa > 0.0;
       );
     )
     : 
     (
       playspeed < 1.0 ?  // repeat samples
       (
         playsa += playspeed;
         playsa >= 1.0 ? ( // we really will need to do some more accurate interpolation, I'm afraid, this is shite
           llspl0=nspl0;
           llspl1=nspl1;
           file_var(myfile,nspl0);
           mem_nch == 2 ? file_var(myfile,nspl1) : nspl1=nspl0;
           myfile_avail -= 1;
           playsa -= 1;
         );         
         t=playsa;
         lspl0 = nspl0*t + llspl0*(1-t);
         lspl1 = nspl1*t + llspl1*(1-t);         
       )
       :
       (
         file_var(myfile,lspl0);
         mem_nch == 2 ? file_var(myfile,lspl1) : lspl1=lspl0;
         myfile_avail -= 1;
       )
     );
     spl0 += lspl0*playmix;
     spl1 += lspl1*playmix;
   )
);
