{
   "labels" : [
      "space",
      "patterns",
      "pads",
      "generative",
      "eternal music",
      "meditation",
      "majestic",
      "calm",
      "vastness"
   ],
   "id" : "1-5el",
   "is_private" : null,
   "code" : "(\r\ns.options.memSize_(65536 * 10);\r\ns.reboot;\r\ns.waitForBoot({\r\n    var bass_pattern, lead_pattern, lead_pattern_var, seq_pattern, noise_pattern, kick_pattern, hihat_pattern, pattern;\r\n    var reverb_out = Bus.audio(s, 2);\r\n    \r\n    ~group1 = Group();\r\n    ~group2 = Group(~group1, \\addAfter);\r\n    \r\n    SynthDef(\\drone, {\r\n        | out,freq, dur, amp, pan, width |\r\n        var env = EnvGen.kr(Env.new([0, 1, 1, 0], [1.0, dur, 3.0]), doneAction:Done.freeSelf);\r\n        var sig = Array.fill(20, {\r\n            var multiplier = [\r\n                0.99, 1, 1.01,\r\n                1.99, 2, 2.01,\r\n                3.99, 4, 4.01].choose;\r\n            var ampmult = multiplier.reciprocal;\r\n            RLPF.ar(\r\n                in: LFSaw.ar(\r\n                    freq:LFNoise1.kr(0.5.rrand(1.0)).range(freq*(1-width), freq*(1+width))*multiplier,\r\n                    iphase:0.0.rrand(2pi)),\r\n                rq: LFNoise1.kr(0.5).range(0.1,0.6),\r\n                mul:LFNoise0.kr(2.0).range(16.reciprocal, ampmult));\r\n        });\r\n        var finalsig = Splay.ar(env*sig);\r\n        var finalsig_panned = Balance2.ar(\r\n            finalsig[0],\r\n            finalsig[1],\r\n            pan*SinOsc.kr(LFNoise1.kr(1).range(0.05,0.2)));\r\n        Out.ar(out, amp*finalsig_panned);\r\n    },\r\n    metadata: (\r\n        credit: \"Stefaan Himpe\",\r\n        category: \\pad,\r\n        tags: [\\pitched]\r\n    )).add;\r\n    \r\n    s.sync;\r\n    \r\n    SynthDef(\\lead, {\r\n        | out, freq, dur, amp, pan, wobblelow=0.3, wobblehigh=1.0 |\r\n        var atk = 0.5;\r\n        var env = EnvGen.kr(Env([0, 1, 1, 0], [atk, dur-atk, 10]), doneAction:Done.freeSelf);\r\n        var freqenv = EnvGen.kr(Env([0.7, 1, 1], [0.3, dur]), doneAction:Done.none);\r\n        var sharpness = freq.cpsmidi.linlin(0,127,1,15);\r\n        var wobble = SinOsc.kr(6).range(wobblelow, wobblehigh);\r\n        var sig = RLPF.ar(\r\n            in: LFSaw.ar(freqenv*freq*LFNoise1.kr(1.0).range(0.995,1.005)),\r\n            freq:freq*sharpness,\r\n            rq:LFNoise1.kr(3).range(0.2,0.5),\r\n            mul:wobble);\r\n        var panned_sig;\r\n        var n = 10;\r\n        n.do({ sig = AllpassN.ar(sig, 0.050, [Rand(0, 0.05), Rand(0, 0.05)], 1) });\r\n        panned_sig = Pan2.ar(sig/n, pan);\r\n        Out.ar(out, amp*env*panned_sig);\r\n    },\r\n    metadata: (\r\n        credit: \"Stefaan Himpe\",\r\n        category: \\pad,\r\n        tags: [\\pitched]\r\n    )).add;\r\n    \r\n    s.sync;\r\n    \r\n    SynthDef(\\seq, {\r\n        | out, freq, dur, amp, pan, glissdir, gliss |\r\n        var laggliss = Lag.kr(gliss, 0.1);\r\n        var env = EnvGen.kr(Env.perc(0.01, 2.0), doneAction:Done.freeSelf);\r\n        var freqenv = EnvGen.kr(Env([1 + (glissdir*laggliss), 1 - (glissdir*laggliss), 1, 1], [0.07, 0.07, 1]), doneAction:Done.none);\r\n        var filtenv = EnvGen.kr(Env([0.5, 1, 1], [0.15, dur]), doneAction:Done.none);\r\n        var sig = LPF.ar(Pulse.ar(freqenv*freq), freq*filtenv*3);\r\n        var panned_sig = Pan2.ar(sig, pan);\r\n        Out.ar(sig, amp*env*panned_sig);\r\n    },\r\n    metadata: (\r\n        credit: \"Stefaan Himpe\",\r\n        category: \\bell,\r\n        tags: [\\pitched]\r\n    )).add;\r\n    \r\n    s.sync;\r\n    \r\n    SynthDef(\\noise, {\r\n        | out, dur, amp, pan |\r\n        var env = EnvGen.kr(Env.perc(1.0, dur*0.8, curve:10.neg), doneAction:Done.freeSelf);\r\n        var sig = LPF.ar(WhiteNoise.ar()*LFPulse.kr(LFNoise1.kr(0.5).range(3,12)), LFNoise1.kr(2).range(2, 1)*4000);\r\n        Out.ar(out, Pan2.ar(env*amp*sig, pan));\r\n    }, metadata: (\r\n        credit: \"Stefaan Himpe\",\r\n        category: \\noise,\r\n        tags: [\\unpitched]\r\n    )).add;\r\n    \r\n    s.sync;\r\n    \r\n    SynthDef(\\kick, {\r\n        | out = 0, pan = 0, amp = 1, curve = -4, drumAmp = 1, beaterAmp = 0.02,\r\n        drumFreq = 50, drumHarmonic = 2, drumSweep = 0.02, drumAtt = 0.005, drumRel = 0.4,\r\n        drumFilter = 1000, modIndex = 6.5, modFreq = 5,\r\n        beaterFreq = 500, beaterHarmonic = 12, beaterSweep = 0.03, beaterAtt = 0.01, beaterRel = 0.3|\r\n        \r\n        var drumEnv, drumContour, drum, beaterContour, beaterEnv, beater, snd;\r\n        drumEnv = Env.perc(attackTime: drumAtt, releaseTime: drumRel, level: drumAmp, curve: curve).kr;\r\n        drumContour = Line.kr(start: drumFreq * drumHarmonic, end: drumFreq, dur: drumSweep);\r\n        drum = PMOsc.ar(\r\n            carfreq: drumContour,\r\n            modfreq: modFreq,\r\n            pmindex: modIndex);\r\n        drum = LPF.ar(in: drum, freq: drumFilter, mul: drumEnv);\r\n        beaterEnv = Env.perc(attackTime: beaterAtt, releaseTime: beaterRel, level: beaterAmp, curve: curve).kr;\r\n        beaterContour = Line.kr(start: beaterFreq * beaterHarmonic, end: beaterFreq, dur: beaterSweep);\r\n        beater = HPF.ar(in: WhiteNoise.ar, freq: beaterFreq);\r\n        beater = LPF.ar(in: beater, freq: beaterContour, mul: beaterEnv);\r\n        snd = Mix.ar(drum + beater) * amp;\r\n        DetectSilence.ar(in: snd, doneAction: 2);\r\n        Out.ar(out, Pan2.ar(snd, pan));\r\n    },\r\n    metadata: (\r\n        credit: \"Renick Bell\",\r\n        category: \\drums,\r\n        tags: [\\pitched, \\kick, \\sos]\r\n    )\r\n    ).add;\r\n    \r\n    s.sync;\r\n    \r\n    SynthDef(\\reverb, {\r\n        var in = In.ar(\\in.kr(),2);\r\n        var out = \\out.ar();\r\n        10.do({ in = AllpassN.ar(in, 0.050, [Rand(0, 0.05), Rand(0, 0.05)], 1) });\r\n        Out.ar(out, in);\r\n    }).add;\r\n    \r\n    s.sync;\r\n    \r\n    // define a 2d markov chain (pseudo-)object\r\n    ~markov2d = (\r\n        \\safeReg : {\r\n            // adding methods to the event using safeReg will warn you if you overwrite methods\r\n            // that already have a pre-defined meaning (like: \"next\").\r\n            | self, name, implementation, strict=true, verbose=0 |\r\n            var symbolicname = name.asSymbol;\r\n            if (self.respondsTo(symbolicname)) {\r\n                var txt = \"Error! Registering\" + \"\\\\\" ++ symbolicname + \"would overwrite a member that exists already.\";\r\n                txt.postln;\r\n                if (strict) {\r\n                    Exception(txt).throw;\r\n                }\r\n            } {  \r\n                if (self.keys.includes(symbolicname)) {           \r\n                    var txt = \"Error! Cannot register\" + \"\\\\\" ++ symbolicname + \"twice.\";\r\n                    txt.postln;\r\n                    if (strict) {\r\n                        Exception(txt).throw;\r\n                    }\r\n                } {\r\n                    if (verbose != 0) {\r\n                        (\"Registered\" + \"\\\\\" ++ symbolicname ++ \".\").postln;\r\n                    };\r\n                    self[symbolicname] = implementation;\r\n                };\r\n            };\r\n        },\r\n        \\storage : (\r\n            // state to track 2nd last and last state, needed to select the next state\r\n            \\previous : nil,\r\n            \\previous_previous : nil\r\n        );\r\n    );\r\n    ~markov2d.safeReg(\\setup, {\r\n        // function called to setup the next-state table\r\n        | self, first, second, list_of_pair_of_next_prob |\r\n        var key = (\"\"++first++\"_\"++second).asSymbol;\r\n        if (self.storage[key].isNil) {\r\n            var next = [];\r\n            var prob = [];\r\n            list_of_pair_of_next_prob.do({\r\n                |el|\r\n                next = next.add(el[0]);\r\n                prob = prob.add(el[1]);\r\n            });\r\n            self.storage[key] = [next, prob.normalizeSum];\r\n        };\r\n    });\r\n    ~markov2d.safeReg(\\getnext, {\r\n        // selects the next state, given the previous state\r\n        // internally, it will also track the 2nd last state and use both\r\n        // 2nd last and last state to select the next state\r\n        | self, previous |\r\n        var next_prob, key, next;\r\n        self.storage.previous_previous = self.storage.previous;\r\n        self.storage.previous = previous;\r\n        if (self.storage.previous.isNil) {\r\n            next = 1;\r\n        } {\r\n            if (self.storage.previous_previous.isNil) {\r\n                next = [3, 4, 5, 6].choose;\r\n            } {\r\n                key = (\"\"++self.storage.previous_previous++\"_\"++previous).asSymbol;\r\n                if (self.storage[key].isNil) {\r\n                    (\"Warning:\"+key+\"not found in markov table!\").debug;\r\n                    [1, 2, 3, 4, 5, 6].choose;\r\n                } {\r\n                    next_prob = self.storage[key];\r\n                    next = Pwrand(next_prob[0], next_prob[1], 1).asStream.next;\r\n                }\r\n            };\r\n        };\r\n    });\r\n    \r\n    // generate slightly better than random harmonic progressions using a 2nd order markov chain (initialized \"by ear\")\r\n    // table is defined as follows:\r\n    // setup(2nd_last tonal function, last tonal function, [ [next tonal function 1, prob1], [next2, prob2], ... ]\r\n    ~markov2d.setup(1, 2, [[4, 0.5], [5, 1], [6, 0.5]]);\r\n    ~markov2d.setup(1, 3, [[5, 1], [1, 1], [4, 0.7], [6, 1.5]]);\r\n    ~markov2d.setup(1, 4, [[5, 1], [3, 0.5], [6, 0.5], [2, 0.4]]);\r\n    ~markov2d.setup(1, 5, [[1, 1], [4, 1], [3, 0.6], [6, 0.5], [2, 0.5]]);\r\n    ~markov2d.setup(1, 6, [[5, 1], [4, 1], [3, 0.6], [1, 0.5], [2, 0.5]]);\r\n    ~markov2d.setup(2, 1, [[5, 1],[4,1],[6,0.5]]);\r\n    ~markov2d.setup(2, 3, [[6, 1],[4,0.3],[5,0.3],[1,0.3]]);\r\n    ~markov2d.setup(2, 4, [[5, 1], [1, 0.7], [3, 0.5], [6, 0.4]]);\r\n    ~markov2d.setup(2, 5, [[1, 1], [3, 0.2], [6, 0.2]]);\r\n    ~markov2d.setup(2, 6, [[5,1]]);\r\n    ~markov2d.setup(3, 1, [[4, 1], [6, 1]]);\r\n    ~markov2d.setup(3, 2, [[1, 1], [6, 1], [5, 1], [4, 1]]);\r\n    ~markov2d.setup(3, 4, [[5, 1], [1, 1]]);\r\n    ~markov2d.setup(3, 5, [[1, 1], [2, 0.3], [6, 0.5]]);\r\n    ~markov2d.setup(3, 6, [[2, 1], [5, 1], [1, 1], [4, 1]]);\r\n    ~markov2d.setup(4, 1, [[4, 1], [5, 1], [3, 1], [2, 1], [6, 0.3]]);\r\n    ~markov2d.setup(4, 2, [[1, 1], [5, 1], [3, 1], [6, 1]]);\r\n    ~markov2d.setup(4, 3, [[6, 1], [1, 1], [5, 1], [2, 0.3]]);\r\n    ~markov2d.setup(4, 5, [[1, 2], [6, 1], [3, 0.3], [2, 0.1]]);\r\n    ~markov2d.setup(4, 6, [[5, 1], [1, 1], [4, 0.5]]);\r\n    ~markov2d.setup(5, 1, [[4, 1], [3, 1], [2, 1]]);\r\n    ~markov2d.setup(5, 2, [[1, 1], [4, 1], [3, 1], [4, 1], [5, 1]]);\r\n    ~markov2d.setup(5, 3, [[1,1]]);\r\n    ~markov2d.setup(5, 4, [[1,1], [5, 0.5], [6, 1], [2,1]]);\r\n    ~markov2d.setup(5, 6, [[3,1], [4,0.5], [2, 0.5], [1, 0.3]]);\r\n    ~markov2d.setup(6, 1, [[3, 1], [5,1], [2, 0.3], [4, 0.3]]);\r\n    ~markov2d.setup(6, 2, [[5,1], [3,1]]);\r\n    ~markov2d.setup(6, 3, [[4,1], [2,1], [1,1], [5,1]]);\r\n    ~markov2d.setup(6, 4, [[5,1], [2, 0.7], [1, 0.5], [3, 0.5]]);\r\n    ~markov2d.setup(6, 5, [[4,1], [1,1], [2,0.3], [3,0.5]]);\r\n    \r\n    \r\n    ~rev = Synth(\\reverb, [\\in, reverb_out, \\out, 0], ~group2);\r\n    ~previous_tonal_function = nil;\r\n    ~tonal_function_just_changed = true;\r\n    ~duration_scaler = 3;\r\n    ~scale = [ Scale.ionian(\\just), Scale.aeolian(\\just) ].choose;\r\n    ~gliss_amt = 0;\r\n    (\"\\nSet scale to:\"+~scale.name+\"and gliss_amt to:\" + ~gliss_amt).debug;\r\n    \r\n    bass_pattern = Pbind(\r\n        \\instrument, \\drone,\r\n        [\\degree,\\octave, \\tonalfunction], Pfunc({\r\n            | event |\r\n            ~previous_tonal_function = ~markov2d.getnext(~previous_tonal_function);\r\n            [~previous_tonal_function-1, [2,3].choose, ~previous_tonal_function]\r\n        }),\r\n        \\dur, Pfunc { var dur = [5,10,20,25].choose; (\"\\nfor the next\"+dur+\"beats, \").debug; dur},\r\n        \\amp, 0.9,\r\n        \\out, reverb_out,\r\n        \\width, Pbrown(0.01, 0.04, 0.005, inf),\r\n        \\pan, Pbrown(-0.7,0.7,0.1,inf),\r\n        \\group, ~group1,\r\n        \\scale, Pfunc { ~scale },\r\n        \\settonalfunction, Pfunc{\r\n            |event|\r\n            var new_tonal_function = event[\\tonalfunction];\r\n            \r\n            if (0.03.coin) {\r\n                ~gliss_amt = if (0.5.coin) { 0.0 } { 0.0.rrand(0.4); };\r\n                (\"changed gliss_amt to:\" + ~gliss_amt).debug;\r\n            };\r\n            \r\n            new_tonal_function.debug(\"tonal function switched to\");\r\n            if (new_tonal_function == 1) {\r\n                ~allowed_lead_degrees = [0, 2, 4, 11, Rest()];\r\n                ~allowed_lead_probabilities = [1, 1, 1, 0.1, 3].normalizeSum;\r\n                if (~previous_tonal_function != 1) {\r\n                    ~previous_tonal_function = 1;\r\n                    ~tonal_function_just_changed = true;\r\n                };\r\n            };\r\n            if (new_tonal_function == 2) {\r\n                ~allowed_lead_degrees = [1, 3, 5, 7, Rest()];\r\n                ~allowed_lead_probabilities = [1, 1, 1, 0.3, 3].normalizeSum;\r\n                if (~previous_tonal_function != 2) {\r\n                    ~previous_tonal_function = 2;\r\n                    ~tonal_function_just_changed = true;\r\n                };\r\n                \r\n            };\r\n            if (new_tonal_function == 3) {\r\n                ~allowed_lead_degrees = [2, 4, 6, Rest()];\r\n                ~allowed_lead_probabilities = [1, 1, 1, 3].normalizeSum;\r\n                if (~previous_tonal_function != 3) {\r\n                    ~previous_tonal_function = 3;\r\n                    ~tonal_function_just_changed = true;\r\n                };\r\n                \r\n            };\r\n            if (new_tonal_function == 4) {\r\n                ~allowed_lead_degrees = [3, 0, 5, Rest()];\r\n                ~allowed_lead_probabilities = [1, 1, 1, 3].normalizeSum;\r\n                if (~previous_tonal_function != 4) {\r\n                    ~previous_tonal_function = 4;\r\n                    ~tonal_function_just_changed = true;\r\n                };\r\n            };\r\n            if (new_tonal_function == 5) {\r\n                ~allowed_lead_degrees = [4, 3, 1, 6, Rest()];\r\n                ~allowed_lead_probabilities = [1, 1, 1, 0.3, 3].normalizeSum;\r\n                if (~previous_tonal_function != 5) {\r\n                    ~previous_tonal_function = 5;\r\n                    ~tonal_function_just_changed = true;\r\n                };\r\n            };\r\n            if (new_tonal_function == 6) {\r\n                ~allowed_lead_degrees = [5, 2, 0, Rest()];\r\n                ~allowed_lead_probabilities = [1, 1, 1, 3].normalizeSum;\r\n                if (~previous_tonal_function != 6) {\r\n                    ~previous_tonal_function = 6;\r\n                    ~tonal_function_just_changed = true;\r\n                };\r\n            };\r\n            0.01\r\n        }\r\n    );\r\n    \r\n    lead_pattern = Pbind(\r\n        \\instrument, \\lead,\r\n        \\degree, Pfunc {\r\n            |event|\r\n            if (~tonal_function_just_changed == true) {\r\n                ~tonal_function_just_changed = false;\r\n                Pseq([~allowed_lead_degrees[0]], 1).asStream.next;\r\n            } /* else */ {\r\n                Pwrand(~allowed_lead_degrees, ~allowed_lead_probabilities, inf).asStream.next;\r\n            };\r\n        },\r\n        \\octave, Prand([4,5], inf),\r\n        \\dur, Prand([0.25, 0.5, 0.75, 1.0]*~duration_scaler, inf),\r\n        \\amp, 1.0,\r\n        \\pan, Pwhite(-0.5, 0.5, inf),\r\n        \\wobblelow, Pbrown(0.0, 0.2, 0.05, inf),\r\n        \\legato, 0.7,\r\n        \\scale, Pfunc { ~scale },\r\n        \\group, ~group1,\r\n        \\out, reverb_out\r\n    );\r\n    \r\n    lead_pattern_var = Pbind(\r\n        \\instrument, \\lead,\r\n        \\degree,\r\n        Pseq([\r\n            Pseq([Rest()], 50),\r\n            Prand([\r\n                Pseq([Rest()], 50),\r\n                Pfunc {\r\n                    |event|\r\n                    if (~tonal_function_just_changed == true) {\r\n                        ~tonal_function_just_changed = false;\r\n                        Pseq([~allowed_lead_degrees[0]], 1).asStream.next;\r\n                    } /* else */ {\r\n                        if (0.01.coin) {\r\n                            nil;\r\n                        } {\r\n                            Pwrand(~allowed_lead_degrees, ~allowed_lead_probabilities, 50).asStream.next;\r\n                        };\r\n                    };\r\n                },\r\n            ], inf),\r\n        ], 1),\r\n        \\octave, Prand([4,5,6,Rest()], inf),\r\n        \\dur, Prand([0.25, 0.5, 0.75, 1.0], inf),\r\n        \\amp, 1.0,\r\n        \\pan, Pwhite(-0.7, 0.7, inf),\r\n        \\wobblelow, 0.0,\r\n        \\legato, 0.7,\r\n        \\scale, Pfunc { ~scale },\r\n        \\group, ~group1,\r\n        \\out, reverb_out\r\n    );\r\n    \r\n    seq_pattern = Pbind(\r\n        \\instrument, \\seq,\r\n        \\degree, Pseq([\r\n            Pseq([Rest()], 400),\r\n            Prand([\r\n                Pfunc { if (0.01.coin) { nil; } { ~allowed_lead_degrees.choose}; },\r\n                Pseq([Rest()], 200)], inf),\r\n        ], inf),\r\n        \\octave, Prand([5, 6, 7, Rest(), Rest(), Rest()],inf),\r\n        \\dur, Prand([0.125], inf),\r\n        \\amp, Pbrown(0.05, 0.1, 0.01, inf)*5,\r\n        \\scale, Pfunc { ~scale },\r\n        \\pan, Pwhite(-0.7,0.7,inf),\r\n        \\glissdir, Pwhite(-1.0,1.0,inf),\r\n        \\gliss, Plazy { Pbrown(0.0, ~gliss_amt, 0.1, inf) },\r\n        \\out, 0,\r\n    );\r\n    \r\n    noise_pattern = Pbind(\r\n        \\instrument, \\noise,\r\n        \\degree, Pseq([0, Rest()], inf),\r\n        \\dur, Prand([5.0, 10.0, 20.0], inf),\r\n        \\amp, 0.3,\r\n        \\pan, 0,\r\n        \\out, 0,\r\n    );\r\n    \r\n    kick_pattern = Pbind(\r\n        \\instrument, \\kick,\r\n        \\deg, Pseq([\r\n            Pseq([0], 50),\r\n            Pseq([0], 100),\r\n            Pseq([0], 100),\r\n            Pseq([0], 100),\r\n            Pseq([0], 100),\r\n            Pseq([0], 100)\r\n        ], inf),\r\n        \\dur, Pseq([\r\n            Pseq([Rest()], 50),\r\n            Pseq([1], 100),\r\n            Pseq([0.5], 100),\r\n            Pseq([0.75], 100),\r\n            Pseq([0.5], 100),\r\n            Pseq([1], 100),\r\n        ], inf),\r\n        \\amp, Pfunc { 0.7 + (0.0.rrand(0.15)); }\r\n    );\r\n    \r\n    pattern = Ptpar([\r\n        0.0, bass_pattern,\r\n        0.1, lead_pattern,\r\n        0.1, seq_pattern,\r\n        0.1, noise_pattern,\r\n        0.1, kick_pattern,\r\n        100.1, lead_pattern_var,\r\n        100.1, lead_pattern_var,\r\n    ],\r\n    inf);\r\n    \r\n    ~player = pattern.play(quant:0.25);\r\n    \r\n});\r\n\r\n)",
   "name" : "Eternal Elevator Ensemble",
   "author" : "56228375",
   "ancestor_list" : [],
   "description" : "Legend has it that on December 14th of 1287, the day that lives by the name of St. Lucia's Flood, a metalic artifact was unearthed filled with undecipherable hieroglyphs. Long believed to be forged in the fires of hell, mankind had no idea what to make of it... until someone decided to throw it in the flames of supercollider, as it's common knowledge that hell consists mostly of music amateurs. Unless you are made of the stuff that withstands Vogon poetry, you are strongly advised to stay away from this majestic meditation muzak maker that might haunt you for all eternity (maybe it won't, but are you willing to take that chance?!). Lasciate ogni speranza, voi ch'entrate! Synthesizer greatest hits vol. 8, here we come!"
}
