Lindenmayer system pattern for selfsimilar structures. Its dictionary (or event) maps one element to an array of child elements. The algorithm replaces iteratively (levels deep) elements by arrays of elements starting with the values in the pattern.
pattern |
starting value |
dict |
a dictionary or an event. |
levels |
number of levels IdentityDictionary[ elem1 -> [ otherElements ], elem2 -> [ otherElements ], elem2 -> [ otherElements ] ] |
The examples use the ()
shortcut for Event.
// A generative song
(
// Scale degrees going up
Pdef(\a, Pbind(\dur, 0.25, \degree, Pseq((0..3))));
// Scale degrees going down
Pdef(\b, Pbind(\dur, 0.25, \degree, Pseq((3..0))));
// Random scale degrees
Pdef(\c, Pbind(\dur, 0.125, \degree, Pwhite(0,10, 8)));
// Use the L-system to put together a sequence of keys
// Psym will then retrieve the patterns from the global Pdef dictionary
// See the post window for info about which of these are playing
Psym(
Prewrite(\a, // start with pattern \a
(
\a: #[\a, \b],
\b: #[\c, \a],
\c: #[\a, \b]
), 4).trace
).play
)
// Inspect the L-system to see what data it produces
(
a = Prewrite(0, // start with 0
(
0: #[2,0],
1: #[0,0,1],
2: #[1,0,1]
), 4);
x = a.asStream;
30.do({ x.next.postln });
)