PseqFunc : Pseq
PseqFunc executes a function on each list item before embedding the item in the stream. This is different from Pattern:collect, which executes the function on the values yielded by the stream.
This is useful for manipulating SequenceNote objects prior to embedding in the stream. SequenceNotes may be compound; thus manipulations after .yield can be incorrect.
*new(list, repeats, offset, func)
The arguments are the same as Pseq, with the addition of func, which is the function to execute.
Example:
// create a sequence with compound notes -- parsing turns 0.03 durations into grace notes
x = MIDIRecBuf(\pseqfunc, [
#[60, 63, 60, 65, 66, 65, 62, 63, 60],
#[0.4, 0.6, 0.4, 0.03, 0.57, 0.4, 0.03, 0.57, 1],
#[0.4, 0.6, 0.4, 0.03, 0.57, 0.4, 0.03, 0.57, 1],
0.5
].asNotes).parse;
// stream the notes out
p = Pseq(x.notes, 1).asStream;
p.nextN(10).do(_.postln);
[ 60, 0.4, 0.4, 0.5 ]
[ 63, 0.6, 0.6, 0.5 ]
[ 60, 0.4, 0.4, 0.5 ]
[ 65, 0.03, 0.03, 0.5 ] // grace notes are preserved
[ 66, 0.57, 0.57, 0.5 ]
[ 65, 0.4, 0.4, 0.5 ]
[ 62, 0.03, 0.03, 0.5 ]
[ 63, 0.57, 0.57, 0.5 ]
[ 60, 1, 1, 0.5 ]
nil
// play it, hear the grace notes
p = Pbind(
\note, Pseq(x.notes, 1),
#[midinote, delta, sustain], Pfunc({ |ev|
#[freq, dur, length].collect({ |key| ev[\note].tryPerform(key) });
}),
\instrument, \default,
\amp, 0.4
).play;
// apply arbitrary duration with Pseq and .collect -- grace note relationships are lost
p = Pseq(x.notes, 1).collect({ |n| n.copy.dur_(rrand(1, 8) * 0.25) }).asStream;
p.nextN(10).do(_.postln);
[ 60, 1, 0.4, 0.5 ]
[ 63, 1, 0.6, 0.5 ]
[ 60, 1.75, 0.4, 0.5 ]
[ 65, 0.75, 0.03, 0.5 ] // grace note durations are destroyed
[ 66, 1.5, 0.57, 0.5 ]
[ 65, 1.5, 0.4, 0.5 ]
[ 62, 1, 0.03, 0.5 ]
[ 63, 2, 0.57, 0.5 ]
[ 60, 1.25, 1, 0.5 ]
nil
p = Pbind(
\note, Pseq(x.notes, 1).collect({ |n| n.copy.dur_(rrand(1, 8) * 0.25) }),
#[midinote, delta, sustain], Pfunc({ |ev|
#[freq, dur, length].collect({ |key| ev[\note].tryPerform(key) });
}),
\instrument, \default,
\amp, 0.4
).play;
// apply arbitrary duration with PseqFunc -- grace note relationships are kept
p = PseqFunc(x.notes, 1, func: { |n| n.copy.dur_(rrand(1, 8) * 0.25) }).asStream;
p.nextN(10).do(_.postln);
[ 60, 1, 0.4, 0.5 ]
[ 63, 0.25, 0.6, 0.5 ]
[ 60, 0.5, 0.4, 0.5 ]
[ 65, 0.025, 0.03, 0.5 ] // grace note is still here
[ 66, 0.475, 0.57, 0.5 ]
[ 65, 0.5, 0.4, 0.5 ]
[ 62, 0.0125, 0.03, 0.5 ]
[ 63, 0.2375, 0.57, 0.5 ]
[ 60, 0.5, 1, 0.5 ]
nil
p = Pbind(
\note, PseqFunc(x.notes, 1, func: { |n| n.copy.dur_(rrand(1, 8) * 0.25) }),
#[midinote, delta, sustain], Pfunc({ |ev|
#[freq, dur, length].collect({ |key| ev[\note].tryPerform(key) });
}),
\instrument, \default,
\amp, 0.4
).play;