#lang scribble/manual @(require (for-label racket)) @title{Psync} synchronise and limit pattern duration@section{related} Classes/Pfindur @section{categories} Streams-Patterns-Events>Patterns>Repetition @section{description} Psync behaves somewhat like link::Classes/Pfindur:: -- it has a teletype::maxdur:: argument that limits the total duration of the event stream. The difference is in what happens if the event pattern stops on its own before teletype::maxdur:: is reached. If the total duration of the event pattern is shorter than the given maximum duration: @section{list} ## Pfindur simply ends: no further time manipulation. ## Psync inserts a rest to round the total duration up to the nearest multiple of the given teletype::quant::. :: @section{table} ## strong::Pbind's natural duration:: || @racketblock[Pfindur(16, Pbind(....)):: strong::behavior:: || ] @racketblock[Psync(Pbind(....), 4, 16):: strong::behavior:: ## 6 beats || Pfindur plays only 6 beats || Psync rounds up to 8 beats (adds a two-beat rest) ## 18 beats || Pfindur cuts off after 16 beats || Psync cuts off after 16 beats :: teletype::maxdur:: may be omitted. If the Pbind stops by itself, the rest will be inserted according to teletype::quant::, but the total duration will be unlimited. ] @section{ClassMethods} @section{method} new @section{argument} pattern a pattern that returns events. @section{argument} quant rounding factor for total duration (effectively a "bar length") @section{argument} maxdur maximum duration @section{argument} tolerance difference threshhold that a pattern must exceed max to be ended. @section{Examples} @racketblock[ ( SynthDef(\help_sinegrain, { arg out=0, freq=440, sustain=0.05, pan; var env; env = EnvGen.kr(Env.perc(0.01, sustain, 0.3), doneAction: Done.freeSelf); Out.ar(out, Pan2.ar(SinOsc.ar(freq, 0, env), pan)) }).add; ) ( // a fixed duration pattern: f = Pbind( \dur, 0.5, \degree, Pn(4,1), \instrument, \help_sinegrain ); // this pattern has indetermined length: a = Prand([ Pbind( \dur, Pseq([0.02, 0.002, 0.1, 0.1],2), \degree, Pseq([9, 7, 5],inf), \instrument, \help_sinegrain ), Pbind( \dur, Pseq([1, 0.35],2), \degree, Pseq([0, [2b,5b]],inf), \instrument, \help_sinegrain ), Pbind( \dur, Pseq([0.15, 0.25, 1.3],2), \degree, Pseq([2b,4,5b],inf), \instrument, \help_sinegrain ) ]); ) Pseq([f, f, a, a], inf).play; // play a sequence // Psync allows to limit the duration of a stream relative to a beat grid b = Psync(a, 1, 1); // create a sequence of exactly 1 beat elements Pseq([f, f, b, b], inf).play; b = Psync(a, 1, 2); // create a sequence of elements of either 1 or 2 beats length Pseq([f, f, b, b], inf).play; ( b = Psync(a, 2); // create a sequence of elements with a minimum of 2 beats, // but with undetermined upper limit Ppar([ Pseq([f, f, b, b], inf), // sequence Pbind(\instrument, \help_sinegrain, \freq, 1000, \sustain, 0.01, \dur, 2) // metronome ]).play; ) :: ]