sclang: ServerShmInterface - try to avoid multiple destructor calls
[supercollider.git] / HelpSource / Classes / Pfsm.schelp
blobc1abd3a69871cda1be4699f4e53ad7b370a50ebf
1 class:: Pfsm
2 summary:: Finite State Machine
3 related:: Classes/Pdfsm
4 categories:: Streams-Patterns-Events>Patterns>List>Indexing
6 description::
8 Every state consists of an item and an array of integer indices of possible strong::next states::. The initial state is chosen at random from the array of strong::entry states::. That chosen state's item is returned, and the next state is chosen from its array of possible strong::next states::. When the end state is chosen, the stream ends.
10 Examples::
12 definitionList::
13 ## list:
14 || [
15 definitionList::
16 ## [ entry states ], ||
17 ## item, [ next states ], ||
18 ## item, [ next states ], ||
19 ## ... ||
20 ## end item (or nil), nil ||
22 ## ] ||
25 next states: nil is terminal
27 code::
29 SynthDef(\help_sinegrain,
30         { arg out=0, freq=440, sustain=0.05;
31                 var env;
32                 env = EnvGen.kr(Env.perc(0.01, sustain, 0.2), doneAction:2);
33                 Out.ar(out, SinOsc.ar(freq, 0, env))
34         }).add;
39 a = Pfsm([
40                 #[0,1],
41                 67, #[0, 0, 3],
42                 72, #[2],
43                 73, #[0, 2],
44                 Pseq([74, 75, 76, 77]), #[2, 3, 3],
45                 nil, nil
46         ], inf).asStream;
47 Routine({
48         loop({
49                 Synth(\help_sinegrain, [\freq, a.next.midicps]);
50                 0.1.wait;
51         })
52 }).play;
56 Pfsm([
57         #[5, 6, 7], // entry states
59         //e1 (== state 0)
60         Pbind( \dur, Pseq([ 1/8, 3/8 ]), \midinote, Pseq([ 86, 75 ]) ),
61         //#[1], // as given in CMJ
62         // my de-boredom-ated version..
63         #[1, 1, 1, 1, 1, 1, 1, 8],
64         //e2 (== state 1)
65         Pbind( \dur, 1/2, \midinote, Pseq([ 69 ]) ),
66         #[0, 1],
67         //e3 (== state 2)
68         Pbind( \dur, 1/3, \midinote, Pseq([ 55, 60, 66 ]) ),
69         #[0, 1, 2, 2, 2, 2, 3, 3, 3, 3],
70         //e4 (== state 3)
71         Pbind( \dur, 1/4, \midinote, Pseq([ 81, 80, 77, 76 ]) ),
72         #[1, 4, 4, 4, 4],
73         //e5 (== state 4)
74         Pbind( \dur, Pseq([1, 2/3, 2/3, 2/3, 1]), \midinote, Pseq([ \, 70, 70, 70, \ ]) ),
75         #[2, 3],
76         //e6 (== state 5)
77         Pbind( \dur, 1/4, \midinote, Pseq([ 59, 61 ]) ),
78         #[0, 2, 4, 5, 5, 5, 5, 5, 5, 5],
79         //e7 (== state 6)
80         Pbind( \dur, 1/4, \midinote, Pseq([ 87, 88 ], 2) ),
81         #[4, 4, 4, 4, 6, 6, 6, 7, 7, 7],
82         //e8 (== state 7)
83         Pbind( \dur, 1, \midinote, Pseq([ 56 ]) ),
84         #[1, 3, 6, 6, 6],
85         // terminal state
86         nil, nil
87 ]).play;