MarkovSet first order markov set
instance creation:
*new(args, updateSeeds)
args
a list of arrays that each represent
one node in the set:
[element, [next_elements], [weigths]]
next_elements
the next node is searched by simple equality.
if nil, this is a terminator node
weights
the array is normalized.
if weigths is nil, equal weight is used
if args is nil, the set is created and may be trained by the
other methods.
updateSeeds
if set to true, each element is always added to the seeds.
*fill(n, stream)
n number of items to read
stream a function or stream that returns items to read
instance methods
read(prev, next)
read a pair of values
put(element, next_elements, weights)
insert a node. any old node is overwritten
remove(prev, next)
remove a pair of values
next(for)
return a next item for the arg value.
if arg is nil, choose from seeds.
parse(stream, length)
read length items into the set from the stream
asStream
returns a stream that creates a markov chain
spy
decrepated: use Pspy (see examples)
// examples:
// direct node definition
(
m = MarkovSet([
[100, [120, 130]],
[120, [100, 1900]],
[130, nil],
]);
)
8.do { m.next(100).postln };
8.do { m.next(120).postln };
8.do { m.next(130).postln };
// training by a stream
m = MarkovSet.fill(100, Pseq([1, 2, 3, 4, Prand([5, 55, 555])], inf).asStream);
8.do { m.next(1).postln };
8.do { m.next(4).postln };
8.do { m.next(55).postln };
// training bit by bit
m = MarkovSet.new;
m.read(\x, \y);
m.read(\x, \z);
m.read(\z, \abcde);
m.read(\y, nil);
8.do { m.next(\x).postln };
8.do { m.next(\y).postln };
8.do { m.next(\z).postln };
m.read(\y, \mmmm);
8.do { m.next(\y).postln }; // now it sometimes terminates
m.remove(\y, \mmmm);
8.do { m.next(\y).postln };
////////// creating streams
(
m = MarkovSet([
[100, [120, 130]],
[120, [100, 1900]],
[130, [100]],
[1900, [1000, 2000, 3000]],
]);
)
m.makeSeeds;
x = m.asStream;
32.do { x.next.postln };
// spy out a stream to feed it in
z = Pseq([100, 200, 300, Prand([1.2, 1.4, 1.5])],inf).asStream;
z = Pspy(m, z).asStream;
32.do { x.next.postln };
15.do { z.next } // add some more elements from z
32.do { x.next.postln };
// event streams
(
SynthDef("mark", { arg out, freq, sustain=1, amp=0.1, pan;
var env, u=1;
env = EnvGen.kr(Env.perc(0.03, sustain, 5), 1, doneAction:2);
3.do { var d; d = exprand(0.01, 1); u = SinOsc.ar(d * 300, u, rrand(0.1, 0.4) * d, 1) };
Out.ar(out, Pan2.ar(SinOsc.ar(u + 1 * freq, 0, amp * env), pan));
}).store;
)
(
a = Pbind(
\freq, Pshuf([203, 490, 231, 764, 234], inf),
\dur, Pshuf([0.5, 0.5, 1.0, 0.25, 0.125, 0.5], inf)
);
m = MarkovSet.fill(20, Pevent(a, Event.default).asStream);
)
m.dict.keysValuesDo { |key, val| postf("key: %\t\tvalue: %\n", key, val) }; ""
// compare:
b = Pchain(Pfsm2(m), (instrument: \mark));
c = Pchain(a, (instrument: \mark));
Ppar([b, c]).play;