{
   "labels" : [
      "simple",
      "ambience",
      "random",
      "endless",
      "generative",
      "algorithmic",
      "sequence",
      "polyphonic",
      "boreas"
   ],
   "code" : "/*\r\n*  Boreas by Alexander Zhagun-Linnik\r\n*  Moscow, 2020\r\n*\r\n*  Endless generative composition based on random polyphonic sequences.\r\n*\r\n*  etherguide@gmail.com\r\n*/\r\n(\r\nServer.default = s;\r\no=s.options;\r\no.memSize;\r\no.sampleRate;\r\no.memSize = 2.pow(16);\r\no.sampleRate = 44100;\r\ns.quit;\r\ns.waitForBoot({\r\n\t{\r\n\tvar num = 0;\r\n\tvar rseq = {Array.fill(num = rrand(2, 8), {arg i; rrand(0, 8)})};\r\n\tvar durlist = [2, 1, 1/2, 1/4, 1/8, 1/16, 1/32, 1/3, 1/6, 1/12];\r\n\tvar scale = Scale.at(Scale.names.choose);\r\n\tvar time = 5;\r\n\tvar root = rrand(0, 12);\r\n\tvar mg = 4;\r\n\tvar masterSetup = false;\r\n\t\tSynthDef(\\sin, {arg freq=440, amp = 0.9, gate=1, out=0, release=1, attack=0.01, mg=4, decay=1, detune=0.01;\r\n\t\t\tvar sig = Mix.fill(12, {arg i;\r\n\t\t\t\tSinOsc.ar(freq+(freq*Rand(detune.neg, detune)), Rand(0.0, 1.0), amp / mg / 10);\r\n\t\t\t});\r\n\t\t\tsig = (sig * Env.adsr(attack, decay, 1.0, release).kr(2, gate));\r\n\t\t\tsig = Pan2.ar(sig, Line.kr(Rand(-1.0, 1.0), Rand(-1.0, 1.0), Rand(0.01, 3.0)));\r\n\t\t\tOut.ar(out, sig);\r\n\t\t}).add;\r\n\t\tSynthDef(\\sim, {arg freq=440, out=0, release=1, mg=4;\r\n\t\t\tvar amp = Rand(0.0, 0.5);\r\n\t\t\tvar sig = SinOsc.ar(freq, Rand(0.0, 1.0), amp / mg * 1.2);\r\n\t\t\tsig = sig * Env.perc(0.0001, releaseTime: release, curve: -8).kr(2);\r\n\t\t\tsig = CombC.ar(sig, Rand(0.01, 0.4), Rand(0.01, 0.4), Rand(0.01, 0.3), Rand(0.01, 2));\r\n\t\t\tsig = Pan2.ar(sig, Line.kr(Rand(-1.0, 1.0), Rand(-1.0, 1.0), Rand(0.01, 3.0)));\r\n\t\t\tOut.ar(out, sig);\r\n\t\t}).add;\r\n\t\tSynthDef(\\str, {arg freq=440, amp = 1.0, gate=1, out=0, verb=0.5, release=1, attack=0.01, mg=4, decay=1, detune=0.01;\r\n\t\t\tvar sig = Mix.fill(12, {\r\n\t\t\t\tVarSaw.ar(freq+(freq*Rand(detune.neg, detune)), Rand(0.0, 1.0), Rand(0.0, 1.0),  amp / mg / 10);\r\n\t\t\t});\r\n\t\t\tattack = attack*2;\r\n\t\t\tsig = sig * Env.adsr(attack, decay, 1.0, release * 2).kr(2, gate);\r\n\t\t\tsig = Pan2.ar(sig, Line.kr(Rand(-1.0, 1.0), Rand(-1.0, 1.0), Rand(0.01, 3.0)));\r\n\t\t\tOut.ar(out, sig);\r\n\t\t}).add;\r\n\t\tSynthDef(\\cha, {arg freq=440, amp = 1.0, gate=1, out=0, verb=0.5, release=1, attack=0.01, mg=4, decay=1, detune=0.01;\r\n\t\t\tvar sig = WhiteNoise.ar(Rand(0.0, 0.9));\r\n\t\t\tsig = RLPF.ar(sig, freq, 0.1 + LFDNoise3.ar(1).abs * Rand(0.0, 0.1)) * 0.1 / mg;\r\n\t\t\tsig = sig.softclip * Env.adsr(attack, decay, 1.0, release).kr(2, gate);\r\n\t\t\tsig = Pan2.ar(sig, Line.kr(Rand(-1.0, 1.0), Rand(-1.0, 1.0), Rand(0.01, 3.0)));\r\n\t\t\tOut.ar(out, sig);\r\n\t\t}).add;\r\n\t\ts.sync;\r\n\t\tloop{\r\n\t\t\trseq = {Array.fill(num = rrand(2, 12), {arg i; rrand(0, 8)})};\r\n\t\t\tif(rrand(1, 5)==4, {\r\n\t\t\t\tscale = Scale.at(Scale.names.choose);\r\n\t\t\t});\r\n\t\t\tif(rrand(1, 5)==4, {\r\n\t\t\t\troot = rrand(0, 12);\r\n\t\t\t});\r\n\t\t\tPdef(\\main,\r\n\t\t\t\tPpar(Array.fill(rrand(1, 12), {arg i;\r\n\t\t\t\t\tvar seq = rseq.value;\r\n\t\t\t\t\tvar cursor = rrand(0, durlist.size - 1);\r\n\t\t\t\t\tvar durnum = rrand(1, 5);\r\n\t\t\t\t\tvar durs = Array.fill(durnum, {\r\n\t\t\t\t\t\tcursor = cursor + rrand(-2, 2);\r\n\t\t\t\t\t\tdurlist.clipAt(cursor);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tPbind(\r\n\t\t\t\t\t\t\\instrument, [\\sin, \\str, \\str, \\cha].choose,\r\n\t\t\t\t\t\t\\scale, scale,\r\n\t\t\t\t\t\t\\dur, Pseq(Array.fill(seq.size, {durs.choose * time}), inf),\r\n\t\t\t\t\t\t\\degree, Pseq(seq, inf),\r\n\t\t\t\t\t\t\\octave, [2, 3, 4, 5, 6].choose,\r\n\t\t\t\t\t\t\\type, Pfunc({[\\note, \\note, \\rest].choose}),\r\n\t\t\t\t\t\t\\verb, rrand(0.05, 0.8),\r\n\t\t\t\t\t\t\\release, rrand(0.0, 8.0),\r\n\t\t\t\t\t\t\\attack, rrand(0.001, 3.0),\r\n\t\t\t\t\t\t\\root, root,\r\n\t\t\t\t\t\t\\mg, Pbrown(0.1, 6.0, Pfunc({rrand(0.1, 1.0)}), inf),\r\n\t\t\t\t\t\t\\detune, rrand(0.005, 0.015),\r\n\t\t\t\t\t\t\\decay, Pfunc({rrand(0.01, 2.0)}),\r\n\t\t\t\t\t)\r\n\t\t\t\t}))\r\n\t\t\t).play();\r\n\t\t\tif(masterSetup == false, {\r\n\t\t\t\tNdef(\\proc, {\r\n\t\t\t\t\tvar sig = (In.ar(0, 2) * (1 + (8 * LFDNoise3.ar(0.1).abs))).softclip;\r\n\t\t\t\t\tsig = FreeVerb.ar(\r\n\t\t\t\t\t\tsig,\r\n\t\t\t\t\t\tLFDNoise3.ar(0.1).abs,\r\n\t\t\t\t\t\tLFDNoise3.ar(0.1).abs,\r\n\t\t\t\t\t\tLFDNoise3.ar(0.1).abs\r\n\t\t\t\t\t);\r\n\t\t\t\t\tOut.ar(0, sig);\r\n\t\t\t\t}).fadeTime_(3.0);\r\n\t\t\t\tmasterSetup = true;\r\n\t\t\t});\r\n\t\t\t([8, 4, 2, 1].choose*time).sleep;\r\n\t\t}\r\n\t}.fork;\r\n});\r\n)",
   "id" : "1-5d1",
   "is_private" : null,
   "name" : "Boreas",
   "author" : "Alexander Zhagun-Linnik",
   "ancestor_list" : [],
   "description" : "The second piece in this generative series. Note lengths are now variable within a line, but as the result the total duration of a pattern became variable too so lines are not always playing in sync. This, however, adds to overall unpredictabilty and I've decided to leave it like that for this one.\r\n\r\nThe piece sounds wet and cold with much ambience. It is also more harsh than the previous one. Distorted windy tones go out of control sometimes, but I find them really expressive."
}
