Pboolnet boolean network pattern

Pboolnet.new(list, repeats, loops)

Boolean network pattern after: [http://farben.latrobe.edu.au/mikropol/volume6/dorin_a/dorin_a.html]

list - a list of pairs of initial states (0 or 1) and binary boolean operation selectors (e.g., \and, \or, \xor).

repeats - number of times to repeat the pattern.

loops - number of times to loop a particular network configuration

// Print out the stream to demonstrate what it looks like

(var boolnet, stream;

boolnet = Pboolnet([

0, \and,

1, \and,

1, \or,

1, \or,

0, \and

], 2);

stream = boolnet.asStream;

11.do({stream.next.postln})

)

(// same as above, but with a loop

var boolnet, stream;

boolnet = Pboolnet([

0, \and,

1, \and,

1, \or,

1, \or,

0, \and

], 2, 2);

stream = boolnet.asStream;

11.do({stream.next.postln})

)

(// display some long evolutions

var nodeFunc, boolnets, displayFunc;

nodeFunc = {

Array.fill(7, {

[[0,1].choose, [\and, \or, \xor, \not].choose]

}).flat

};

boolnets = Array.fill(4, {Pboolnet(nodeFunc.value, inf)});

displayFunc = {arg stream;

105.do({arg i; // 105 is divisible by 7

stream.next.post;

((i+1)%7 == 0).if({"".postln});

})

};

boolnets.do({arg item;

displayFunc.value(item.asStream);

"--------------".postln

});

)

sound examples

(SynthDef("sine", { arg out=0, freq=440, dur=0.05, amp=0.1; var env; env = EnvGen.kr(Env.perc(0.01, dur, amp), doneAction:2); Out.ar(out, SinOsc.ar(freq, 0, env)) }).store;)

(// simple pattern

var boolnet, pattern;

boolnet = Pboolnet([

0, \or,

1, \and,

1, \xor,

1, \and,

0, \and,

1, \xor,

1, \and

], inf);

pattern = Pbind( \instrument, \sine,

\dur, 0.1,

\amp, boolnet * 0.3

);

pattern.play

)

(// more complex -- has a Pseq for the boolean operation

var boolnet, pattern;

boolnet = Pboolnet([

1, Pseq([\xor, \or, \and], inf),

1, Pseq([\and,\xor,\or], inf),

1, \xor,

1, \and,

1, \and,

1, \xor,

1, \and

], inf, 2);

pattern = Pbind(

\instrument, \sine,

\freq, 200,

\dur, 0.2,

\amp, boolnet * 0.3

);

pattern.play

)

(// play a couple of patterns in parallel

var boolnet, pattern1, pattern2;

boolnet = Pboolnet([

0, \or,

1, Pseq([\and,\and,\or], inf),

1, \xor,

1, \and,

0, \and,

1, \xor,

1, \and

], inf, 2);

pattern1 = Pbind(

\instrument, \sine,

\freq, 550,

\dur, 0.3,

\amp, boolnet * 0.3

);

boolnet = Pboolnet([

0, \or,

1, Pseq([\and,\and,\or], inf),

1, \xor,

1, \and,

0, \and,

1, \xor,

1, \and

], inf, 2);

pattern2 = Pbind(

\instrument, \sine,

\freq, 440,

\dur, 0.2,

\amp, boolnet * 0.1

);

Ppar([

pattern1,

pattern2

]).play

)

( // use a boolnet with a Pmulp and a Paddp to make meoldies and rhythms

var boolnet, pattern1, pattern2;

boolnet = Pboolnet([

1, Pseq([\xor, \or, \and], inf),

1, Pseq([\and,\xor,\not], inf),

1, \xor,

1, \and,

1, \and,

1, \xor,

1, \and

], inf, 2);

pattern1 = Pbind(

\instrument, \sine,

\freq, 500,

\dur, 0.4,

\amp, 0.5

);

pattern1 = Pmulp(

\amp, boolnet * 0.1,

pattern1

);

pattern2 = Pbind(

\instrument, \sine,

\degree, boolnet * 0.1,

\dur, 0.2,

\amp, 0.5

);

Ppar([pattern1, pattern2]).play

)