//jr: modified for patterns in dur argument.
//nil is now accepted as 'wait until duration is over' and get next duration

Pfindur2 : FilterPattern {
    var <>dur, <>tolerance;
    *new { arg dur, pattern, tolerance = 0.001;
        ^super.new(pattern).dur_(dur).tolerance_(tolerance)
    }
    asStream {
     
        ^Routine.new({ arg inevent;
            var item, stream, delta, duration, durStream;
            var sawNil=false, elapsed = 0.0, nextElapsed=0.0;
       
           
            durStream = dur.asStream;
         
            loop({
             
             duration = durStream.value;
             stream = pattern.asStream;
             elapsed = 0.0;
             sawNil = false;
             if(duration.notNil, {
              
              while({
              inevent = stream.next(inevent);
               
     if(inevent.isNil, {
                   sawNil = true;
                   inevent = Event.protoEvent.use({  ~freq = \rest;
                          ~delta = 0.0 })
                  });
                  
                 delta = inevent.delta;
              nextElapsed = elapsed + delta;
                  sawNil.not && (nextElapsed.round(tolerance) < duration)
                 }, {
                      elapsed = nextElapsed;
                      inevent = inevent.yield;
                     
                     });
                     
                     inevent = inevent.copy;
                     // fix delta time.
                     inevent.put(\delta, duration - elapsed);
                    inevent = inevent.yield;
              }, {
              nil.alwaysYield;
              });
         });
         });
     }

}













This page was created by SimpleText2Html 1.0.3 on 13-Aug-101.