{
   "labels" : [
      "midi",
      "samples",
      "sequences"
   ],
   "is_private" : null,
   "id" : "1-5is",
   "code" : "(\r\n\r\n  s.options.memSize_(2.pow(20));\r\n  s.options.blockSize_(64);\r\n  s.latency = 0.1;\r\n  s.freeAll;\r\n\r\n  s.makeGui;\r\n\r\n  MIDIIn.connectAll;\r\n\r\n  s.waitForBoot{\r\n    s.meter;\r\n\r\n\r\n//##############################################//\r\n////////////////// SETUP CODE ////////////////////\r\n//##############################################//\r\n    (\r\n\r\n        t = TempoClock(130/60).permanent_(true);\r\n\r\n        ~genGrp = Group();\r\n        ~fxGrp = Group.after(~genGrp);\r\n\r\n\r\n        s.newBusAllocators; // Reset Bus counters\r\n        ~reverbBus = Bus.audio(s,2);\r\n        ~delayBus = Bus.audio(s,2);\r\n\r\n        ~streams = (\r\n            BD: nil,\r\n            BD2: nil,\r\n            SD: nil,\r\n            SD2: nil,\r\n            HH: nil,\r\n            HH2: nil,\r\n            BASS: nil,\r\n            TOM: nil,\r\n            TOM2: nil,\r\n            FX: nil,\r\n            FX2: nil,\r\n            ATMO: nil,\r\n            NOISE: nil\r\n        );\r\n\r\n        ~atmo = nil;\r\n\r\n        ~ampBD = 0.3;\r\n        ~ampSD = 0.3;\r\n        ~ampHH = 0.3;\r\n        ~ampHH2 = 0.3;\r\n        ~ampBASS = 0.3;\r\n        ~ampTOM = 0.3;\r\n        ~ampFX = 0.3;\r\n        ~ampATMO = 0.2;\r\n\r\n        //Initialize Samples\r\n        (\r\n            ~makeBuffers = { |path, event|\r\n                var dir = PathName.new(path);\r\n                var contents = dir.entries;\r\n\r\n                if (contents.select({ |n| n.isFile }).size > 0)\r\n                {\r\n                    var files, bufArray;\r\n                    files = contents.select({ |n| n.isFile });\r\n                    files = files.select({ |n|\r\n                        [\"aif\", \"aiff\", \"wav\"].includesEqual(n.extension)\r\n                    });\r\n\r\n                    if (event[dir.folderName.asSymbol] != nil)\r\n                    { \"duplicate subfolder name ignored\".warn; }\r\n                    {\r\n                        bufArray = files.collect({ |n| Buffer.read(s, n.fullPath) });\r\n                        event[dir.folderName.asSymbol] = bufArray;\r\n                    };\r\n                };\r\n\r\n                if (contents.select({ |n| n.isFolder }).size > 0)\r\n                {\r\n                    var folders = contents.select({ |n| n.isFolder });\r\n                    folders.do({ |n| ~makeBuffers.(n.fullPath, event) });\r\n                };\r\n\r\n                event;\r\n            };\r\n\r\n            b = ~makeBuffers.(\"audio/\".resolveRelative, ());\r\n        );\r\n\r\n\r\n        /////////////////////////////////////\r\n        //////      E F F E C T S    ///////\r\n        ////////////////////////////////////\r\n\r\n        //REVERB\r\n        (\r\n            SynthDef(\\reverb, {\r\n                arg in = 0, out = 0, mix = 0.25;\r\n                var sig, wet;\r\n                sig = In.ar(in, 2);\r\n                wet = DelayN.ar(sig, 0.03, 0.03);\r\n                5.do({ |n|\r\n                    var del, coef, dec;\r\n                    del = { Rand(0.1 / (n + 2), 0.1 / (n + 1)) } ! 2;\r\n                    coef = Rand(0.6, 0.75);\r\n                    dec = del / (log10(coef) / 3.neg);\r\n                    wet = AllpassN.ar(wet, 0.1, del, dec);\r\n                });\r\n                sig = sig + (wet * mix);\r\n                Out.ar(out, sig);\r\n            }).add;\r\n        );\r\n\r\n        //DELAY\r\n        (\r\n            SynthDef(\\delay, {\r\n                arg in = 0, out = 0, delayTime = 0.2, feedback = 0.5, damp = 0.5;\r\n                var sig, echo, filteredFeedback;\r\n                sig = In.ar(in, 2);\r\n                echo = DelayN.ar(sig, delayTime, delayTime);\r\n                filteredFeedback = LPF.ar(echo, 5000 * (1 - damp), 1); // Tiefpassfilter\r\n                sig = sig + filteredFeedback * feedback;\r\n                sig = sig ! 2;\r\n                Out.ar(out, sig);\r\n            }).add;\r\n        );\r\n\r\n        /////////////////////////////////////\r\n        ////// I N S T R U M E N T S ///////\r\n        ////////////////////////////////////\r\n        s.makeBundle(s.latency, {SynthDef(\\BD, {\r\n            arg buf, amp = 0.3, rate = 1.0, pan = 0;\r\n            var sig;\r\n            sig = PlayBuf.ar(2, b[\\drums][3], rate, loop: 0, doneAction: 2); // Stereo playback, no loop, free synth after done\r\n            sig = sig * amp; // Apply amplitude\r\n            Out.ar(0, Pan2.ar(sig, pan)); // Pan the signal and send to speakers\r\n        }).add});\r\n\r\n        s.makeBundle(s.latency, {SynthDef(\\BASS, {\r\n            arg amp = 0.4, rate = 1.0, pan = 0;\r\n            var sig, phs;\r\n            sig = PlayBuf.ar(2, b[\\synth][4], rate, loop: 0, doneAction: 2);\r\n            sig = sig * amp;\r\n            sig = sig ! 2;\r\n            Out.ar(~reverbBus, sig);\r\n        }).add});\r\n\r\n        s.makeBundle(s.latency, {SynthDef(\\TOM, {\r\n            arg amp = 0.3, rate = 0.9, pan = 0;\r\n            var sig, phs;\r\n            sig = PlayBuf.ar(1, b[\\perc][2], rate, loop: 0, doneAction: 2);\r\n            sig = Pan2.ar(sig !2, pan, amp) ;\r\n            Out.ar(~reverbBus, sig);\r\n        }).add});\r\n\r\n        s.makeBundle(s.latency, {SynthDef(\\HH, {\r\n            arg amp = 0.3, rate = 1.0, pan = 0;\r\n            var sig, phs;\r\n            sig = PlayBuf.ar(2, b[\\drums][2], rate, loop: 0, doneAction: 2);\r\n            sig = sig * amp;\r\n            Out.ar(~reverbBus, Pan2.ar(sig, pan));\r\n        }).add});\r\n\r\n        s.makeBundle(s.latency, {SynthDef(\\SD, {\r\n            arg amp = 0.3, rate = 1.0, pan = 0;\r\n            var sig, phs;\r\n            sig = PlayBuf.ar(2, b[\\drums][5], rate, loop: 0, doneAction: 2);\r\n            sig = sig * amp;\r\n            Out.ar(~reverbBus, Pan2.ar(sig, pan));\r\n        }).add});\r\n\r\n        s.makeBundle(s.latency, {SynthDef(\\FX, {\r\n            arg amp = 0.3, rate = 0.9, pan = 0;\r\n            var sig, phs;\r\n            sig = PlayBuf.ar(2, b[\\drums][1], rate, loop: 0, doneAction: 2);\r\n            sig = sig * amp;\r\n            Out.ar(~reverbBus, Pan2.ar(sig, pan));\r\n        }).add});\r\n\r\n        s.makeBundle(s.latency, {SynthDef(\\FX2, {\r\n            arg amp = 0.3, rate = 0.9, pan = 0;\r\n            var sig, phs;\r\n            sig = PlayBuf.ar(2, b[\\drums][0], rate, loop: 0, doneAction: 2);\r\n            sig = sig * amp;\r\n            Out.ar(~reverbBus, Pan2.ar(sig, pan));\r\n        }).add});\r\n\r\n        // Sidechained drone SynthDef\r\n        SynthDef(\\ATMO, {\r\n            arg buf, amp = 0.6, sc_amt = 1.0, sc_bus = 1, gate = 1, fadeIn = 3;\r\n            var sig, control, env;\r\n            // Play drone\r\n            sig = PlayBuf.ar(2, b[\\loops][1], BufRateScale.kr(buf), loop: 1);\r\n            // Get amplitude of the sidechain signal (kick drum)\r\n            control = Amplitude.kr(In.ar(sc_bus)) * sc_amt;\r\n            // Apply volume envelope with fade-in\r\n            env = EnvGen.kr(Env.asr(fadeIn, 1, 1), gate, doneAction: 0);\r\n            sig = sig * env * amp; // Apply fade-in envelope and amp scaling\r\n            Out.ar(~reverbBus, sig);\r\n        }).add;\r\n\r\n\r\n        //multi synth drone\r\n        s.makeBundle(s.latency, {SynthDef.new(\\multi, {\r\n            var sig, amp, env, freq = 500;\r\n            // 5 Sekunden Sustain, dann 5 Sekunden Fade-Out\r\n            env = EnvGen.kr(Env.linen(0, 2, 2), doneAction: 2);\r\n            amp = SinOsc.kr({ExpRand(0.2,12)}!8).range(0,1);\r\n            sig = SinOsc.ar({ExpRand(freq/10, freq)}!8);\r\n            sig = sig * amp * env;\r\n            sig = Splay.ar(sig) * 0.1;\r\n            Out.ar(~reverbBus, sig);\r\n        }).add});\r\n\r\n\r\n        s.makeBundle(s.latency, {SynthDef.new(\\basspad, {\r\n            arg freq=40, wetAmt = 0.1;\r\n            var temp, sum, env, amp=0.3, mixed, dryAmt=1-wetAmt, wet;\r\n            sum = 0;\r\n            env = EnvGen.kr(Env.perc(0.01, 0.5, 0.5, -3),doneAction:2);\r\n            10.do{\r\n                temp = VarSaw.ar(\r\n                    freq * {Rand(0.99,1.02)}!2,\r\n                    {Rand(0.0, 1.0)}!2,\r\n                    {ExpRand(0.005, 0.05)}!2\r\n                );\r\n                sum = sum + temp;\r\n            };\r\n            sum = sum * 0.05 * env * amp;\r\n            Out.ar(~reverbBus,sum);\r\n\r\n        }).add});\r\n\r\n\r\n        //Whitenoise\r\n        SynthDef(\\whiteNoise, {\r\n            arg gate = 1; // Steuerparameter für Ein/Aus\r\n            var sig, env;\r\n            sig = PinkNoise.ar(0.5 ! 2);\r\n            8.do({sig = LPF.ar(sig, 10000)});\r\n            env = EnvGen.kr(Env.perc, gate, doneAction: 2); // ADSR-Hüllkurve mit `gate`\r\n            sig = sig * env * ~ampATMO;\r\n            Out.ar(~reverbBus, sig);\r\n        }).add;\r\n\r\n\r\n        s.sync;\r\n        ~reverb = s.makeBundle(s.latency, {Synth(\\reverb, [\\in, ~reverbBus.index, \\out, 0, \\mix, 0.3, \\room, 0.3], ~fxGrp)});\r\n        ~delay = s.makeBundle(s.latency, {Synth(\\delay, [\\in, ~delayBus.index, \\out, 0, \\delayTime, 0.3, \\feedback, 0.5, \\damp, 0.5], ~fxGrp)});\r\n        s.makeBundle(s.latency, {~noiseSynth = Synth(\\whiteNoise, [\\gate, 0], ~genGrp)});\r\n        ~atmo = Synth(\\ATMO, [\\amp, ~ampATMO, \\fadeIn, 3, \\gate, 0], ~genGrp);\r\n\r\n        /////////////////////////////////////\r\n        //////   S E Q U E N C E S   ///////\r\n        ////////////////////////////////////\r\n\r\n        // Kickdrum sequence 4-To-The-Floor\r\n        ~p_BD = EventPatternProxy(Pbind(\r\n            \\instrument, \\BD,\r\n            \\dur, Pseq([\r\n                Pseq([1/2, Rest(1/2),   1/2, Rest(1/2),    1/2, Rest(1/2),    1/2, Rest(1/2)]), //bar1\r\n                Pseq([1/2, Rest(1/2),   1/2, Rest(1/2),    1/2, Rest(1/2),    1/2, Rest(1/2)]), //bar2\r\n                Pseq([1/2, Rest(1/2),   1/2, Rest(1/2),    1/2, Rest(1/2),    1/2, Rest(1/2)]), //bar3\r\n                Pseq([1/2, Rest(1/2),   1/2, Rest(1/2),    1/2, 1/2,          1/2, 1/2])        //bar4\r\n            ] , inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-20], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp, Pfunc({~ampBD}),\r\n        ));\r\n\r\n        ~p_BD2 = EventPatternProxy(Pbind(\r\n            \\instrument, \\BD,\r\n            \\dur, Pseq([\r\n                Pseq([1/2, Rest(1/2),   Rest(1/2), Rest(1/2),    1/2, Rest(1/2),    Rest(1/2), Rest(1/2)]), //bar1\r\n                Pseq([1/2, Rest(1/2),   Rest(1/2), Rest(1/2),    1/2, Rest(1/2),    Rest(1/2), Rest(1/2)]), //bar2\r\n                Pseq([1/2, Rest(1/2),   Rest(1/2), Rest(1/2),    1/2, Rest(1/2),    Rest(1/2), Rest(1/2)]), //bar3\r\n                Pseq([1/2, Rest(1/2),   Rest(1/2), Rest(1/2),    1/2, Rest(1/2),    1/2, Rest(1/2)])        //bar4\r\n            ] , inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-20], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp, Pfunc({~ampBD}),\r\n        ));\r\n\r\n\r\n        // Bassline sequence\r\n        ~p_BASS = Pbind(\r\n            \\instrument, \\BASS,\r\n            \\dur, Pseq([\r\n                Pseq([Rest(1/2), 1/2,   Rest(1/2), Rest(1/2),   Rest(1/2), 1/2,  Rest(1/2), Rest(1/2)   ]), //bar 1\r\n                Pseq([Rest(1/2), 1/2,   Rest(1/2), Rest(1/2),   Rest(1/2), 1/2,  Rest(1/2), Rest(1/2)   ]),  //bar 2\r\n                Pseq([Rest(1/2), 1/2,   Rest(1/2), Rest(1/2),   Rest(1/2), 1/2,  Rest(1/2), Rest(1/2)   ]), //bar 3\r\n                Pseq([Rest(1/2), 1/2,   Rest(1/2), Rest(1/2),   Rest(1/2), 1/2,  Rest(1/2), 1/2         ]) //bar 4\r\n            ],\r\n            inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-20, -10], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp,  Pfunc({~ampBASS}),\r\n        );\r\n\r\n        ~p_BASS_pt2 = Pbind(\r\n            \\instrument, \\BASS,\r\n            \\dur, Pseq([\r\n                Pseq([Rest(1/2), 1/2,   Rest(1/2), 1/2,   Rest(1/2), 1/2,  Rest(1/2), 1/2   ]), //bar 1\r\n                Pseq([Rest(1/2), 1/2,   Rest(1/2), 1/2,   Rest(1/2), 1/2,  Rest(1/2), 1/2   ]),  //bar 2\r\n                Pseq([Rest(1/2), 1/2,   Rest(1/2), 1/2,   Rest(1/2), 1/2,  Rest(1/2), 1/2   ]), //bar 3\r\n                Pseq([Rest(1/2), 1/2,   Rest(1/2), 1/2,         1/2, 1/2,        Rest(1/2), 1/2         ]) //bar 4\r\n            ],\r\n            inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-10, -10], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp,  Pfunc({~ampBASS}),\r\n        );\r\n\r\n        // Bassline2 sequence\r\n        ~p_TOM = Pbind(\r\n            \\instrument, \\TOM,\r\n            \\dur, Pseq([\r\n                Pseq([Rest(1/2), Rest(1/2),  Rest(1/2), 1/2,  Rest(1/2), Rest(1/2),   Rest(1/2), 1/2]), //bar 1\r\n                Pseq([Rest(1/2), Rest(1/2),  Rest(1/2), 1/2,  Rest(1/2), 1/2,         Rest(1/2), 1/2]),  //bar 2\r\n                Pseq([Rest(1/2), Rest(1/2),  Rest(1/2), 1/2,  Rest(1/2), 1/2,         Rest(1/2), 1/2]), //bar 3\r\n                Pseq([Rest(1/2), Rest(1/2),  Rest(1/2), 1/2,  Rest(1/2), Rest(1/2),   1/2,       1/2]) //bar 4\r\n            ],\r\n            inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-20, -10], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp, Pfunc({~ampTOM}),\r\n        );\r\n\r\n\r\n        // Bassline2 sequence\r\n        ~p_TOM2 = Pbind(\r\n            \\instrument, \\TOM,\r\n            \\dur, Pseq([\r\n                Pseq([1/2, 1/2,  Rest(1/2), 1/2,  1/2, 1/2,   Rest(1/2), 1/2]), //bar 1\r\n                Pseq([1/2, 1/2,  Rest(1/2), 1/2,  1/2, 1/2,   Rest(1/2), 1/2]),  //bar 2\r\n                Pseq([1/2, 1/2,  Rest(1/2), 1/2,  1/2, 1/2,   Rest(1/2), 1/2]), //bar 3\r\n                Pseq([Rest(1/2), 1/2,  Rest(1/2), 1/2,  Rest(1/2), 1/2,   1/2,       1/2]) //bar 4\r\n            ],\r\n            inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-20, -10], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp, Pfunc({~ampTOM}),\r\n        );\r\n\r\n        // off-beat Hihat sequence\r\n        ~p_HH = Pbind(\r\n            \\instrument, \\HH,\r\n            \\dur, Pseq([\r\n                Pseq([Rest(1/2), 1/2, Rest(1/2), 1/2, Rest(1/2), 1/2]), //bar 1\r\n                Pseq([Rest(1/2), 1/2, Rest(1/2), 1/2, Rest(1/2), 1/2]), //bar 2\r\n                Pseq([Rest(1/2), 1/2, Rest(1/2), 1/2, Rest(1/2), 1/2]), //bar 2\r\n                Pseq([Rest(1/2), 1/2, Rest(1/2), 1/2, Rest(1/2), 1/2]) //bar 4\r\n            ],\r\n            inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-20, -10], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp,  Pfunc({~ampHH}),\r\n        );\r\n        // on-beat hihat sequence\r\n        ~p_HH2 = Pbind(\r\n            \\instrument, \\HH,\r\n            \\dur, Pseq([\r\n                Pseq([1/2, Rest(1/2), 1/2, Rest(1/2), 1/2, Rest(1/2)]), //bar 1\r\n                Pseq([1/2, Rest(1/2), 1/2, Rest(1/2), 1/2, Rest(1/2)]), //bar 2\r\n                Pseq([1/2, Rest(1/2), 1/2, Rest(1/2), 1/2, Rest(1/2)]), //bar 2\r\n                Pseq([1/2, Rest(1/2), 1/2, Rest(1/2), 1/2,Rest(1/2)]) //bar 4\r\n            ],\r\n            inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-20, -10], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp,  Pfunc({~ampHH2}),\r\n        );\r\n        // Snare sequence\r\n        ~p_SD = Pbind(\r\n            \\instrument, \\SD,\r\n            \\dur, Pseq([\r\n                Pseq([1/2, Rest(1/2),    Rest(1/2), Rest(1/2),    1/2, Rest(1/2), Rest(1/2), Rest(1/2) ]), //bar1\r\n                Pseq([1/2, Rest(1/2),    Rest(1/2), Rest(1/2),    1/2, Rest(1/2), Rest(1/2), Rest(1/2) ]), //bar2\r\n                Pseq([1/2, Rest(1/2),    Rest(1/2), Rest(1/2),    1/2, Rest(1/2), Rest(1/2), Rest(1/2) ]), //bar3\r\n                Pseq([1/2, Rest(1/2),    Rest(1/2), Rest(1/2),    1/2, Rest(1/2), 1/2, 1/2 ])        //bar4\r\n            ] , inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-20], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp,  Pfunc({~ampSD}),\r\n        );\r\n\r\n        // Snare roll\r\n        ~p_SD2 = Pbind(\r\n            \\instrument, \\SD,\r\n            \\dur, Pseq([\r\n                Pseq([1/2, 1/2,   1/2, 1/2,    1/2, 1/2,    1/2, 1/2]), //bar1\r\n                Pseq([1/2, 1/2,   1/2, 1/2,    1/2, 1/2,    1/2, 1/2]), //bar2\r\n                Pseq([1/2, 1/2,   1/2, 1/2,    1/2, 1/2,    1/2, 1/2]), //bar3\r\n                Pseq([1/2, 1/2,   1/2, 1/2,    1/2, 1/2,    1/2, 1/2])  //bar4\r\n            ] , inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-20], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp,  Pfunc({~ampSD}),\r\n        );\r\n\r\n        ~p_FX1 = Pbind(\r\n            \\instrument, \\FX,\r\n            \\dur,  Pseq([1/2, Rest(1/2), Rest(1/2), Rest(1/2), Rest(1/2)],1),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-30], 1),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp,  Pfunc({~ampFX}),\r\n        );\r\n\r\n        ~p_FX = Pbind(\r\n            \\instrument, \\FX,\r\n            \\dur,  Pseq([1/2, Rest(1/2),   Rest(1/2), Rest(1/2),   Rest(1/2), Rest(1/2),   Rest(1/2), Rest(1/2)],inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-30], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp,  Pfunc({~ampFX}),\r\n        );\r\n\r\n        ~p_FX2 = Pbind(\r\n            \\instrument, \\FX2,\r\n            \\dur,  Pseq([Rest(1/2), Rest(1/2),   Rest(1/2), Rest(1/2),   1/2, Rest(1/2),   Rest(1/2), Rest(1/2)],inf),\r\n            \\group, ~genGrp,\r\n            \\degree, Pseq([-30], inf),\r\n            \\cut, Pwhite(20, 1500),\r\n            \\rez, Pwhite(0.1, 0.8),\r\n            \\amp,  Pfunc({~ampFX}),\r\n        );\r\n\r\n\r\n\r\n        /////////////////////////////////////\r\n        //////         M I D I       ///////\r\n        ////////////////////////////////////\r\n\r\n        //VOLUME MAPPING\r\n        //KICK VOLUME\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 21, {\r\n                ~ampBD = val.linlin(0, 127, 0.0, 1.0);\r\n            });\r\n        }, 21).permanent_(true);\r\n        //SNARE VOLUME\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 22, {\r\n                ~ampSD = val.linlin(0, 127, 0.0, 1.0);\r\n            });\r\n        }, 22).permanent_(true);\r\n        //Hihat 1 VOLUME\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 23, {\r\n                ~ampHH = val.linlin(0, 127, 0.0, 1.0);\r\n            });\r\n        }, 23).permanent_(true);\r\n        //Hihat 2 VOLUME\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 24, {\r\n                ~ampHH2 = val.linlin(0, 127, 0.0, 1.0);\r\n            });\r\n        }, 24).permanent_(true);\r\n        //BASS 1 VOLUME\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 25, {\r\n                ~ampBASS = val.linlin(0, 127, 0.0, 1.0);\r\n            });\r\n        }, 25).permanent_(true);\r\n        //BASS 2 VOLUME\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 26, {\r\n                ~ampTOM = val.linlin(0, 127, 0.0, 1.0);\r\n            });\r\n        }, 26).permanent_(true);\r\n        //FX VOLUME\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 27, {\r\n                ~ampFX = val.linlin(0, 127, 0.0, 1.0);\r\n            });\r\n        }, 27).permanent_(true);\r\n        //ATMO VOLUME\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 28, {\r\n                ~ampATMO = val.linlin(0, 127, 0.0, 0.2);\r\n                if (~atmo.notNil) { // Überprüfen, ob ~atmo existiert\r\n                    ~atmo.set(\\amp, ~ampATMO);\r\n                }\r\n            });\r\n        }, 28).permanent_(true);\r\n\r\n        /// MIDI CC SETUP TO TRIGGER SEQUENCES BY KEYPRESS\r\n        //KICK DRUM 4/4\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 44, {\r\n                if (val == 127, {\r\n                    \"Starting BD\".postln;\r\n                    ~streams[\\BD] = ~p_BD.play(t, quant: 1);\r\n                }, {\r\n                    \"Stopping BD\".postln;\r\n                    ~streams[\\BD].stop;\r\n                });\r\n            });\r\n        }, 44); // Listen for CC 44 messages\r\n\r\n        //KICK DRUM SLOW\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 36, {\r\n                if (val == 127, {\r\n                    \"Starting BD2\".postln;\r\n                    ~streams[\\BD2] = ~p_BD2.play(t, quant: 1);\r\n                }, {\r\n                    \"Stopping BD2\".postln;\r\n                    ~streams[\\BD2].stop;\r\n                });\r\n            });\r\n        }, 36);\r\n\r\n        // SNARE DRUM\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 45, {\r\n                if (val == 127, {\r\n                    \"Starting SD\".postln;\r\n                    ~streams[\\SD] = ~p_SD.play(t, quant: 4);\r\n                }, {\r\n                    \"Stopping SD\".postln;\r\n                    ~streams[\\SD].stop;\r\n                });\r\n            });\r\n        }, 45);\r\n\r\n        // SNARE DRUM ROLL\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 37, {\r\n                if (val == 127, {\r\n                    \"Starting SD2\".postln;\r\n                    ~streams[\\SD2] = ~p_SD2.play(t, quant: 2);\r\n                }, {\r\n                    \"Stopping SD2\".postln;\r\n                    ~streams[\\SD2].stop;\r\n                });\r\n            });\r\n        }, 37);\r\n\r\n        // SLOW HI-HAT\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 46, {\r\n                if (val == 127, {\r\n                    \"Starting HH1\".postln;\r\n                    ~streams[\\HH] = ~p_HH.play(t, quant: 1);\r\n                }, {\r\n                    \"Stopping HH1\".postln;\r\n                    ~streams[\\HH].stop;\r\n                });\r\n            });\r\n        }, 46);\r\n\r\n        // FAST HI-HAT\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 47, {\r\n                if (val == 127, {\r\n                    \"Starting HH2\".postln;\r\n                    ~streams[\\HH2] = ~p_HH2.play(t, quant: 1);\r\n                }, {\r\n                    \"Stopping HH2\".postln;\r\n                    ~streams[\\HH2].stop;\r\n                });\r\n            });\r\n        }, 47);\r\n\r\n        //BASS LINE 1\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 48, {\r\n                if (val == 127, {\r\n                    \"Starting BASS\".postln;\r\n                    ~streams[\\BASS] = ~p_BASS.play(t, quant: 4);\r\n                }, {\r\n                    \"Stopping BASS\".postln;\r\n                    ~streams[\\BASS].stop;\r\n                });\r\n            });\r\n        }, 48);\r\n\r\n        //BASS LINE 1 pt.2\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 40, {\r\n                if (val == 127, {\r\n                    \"Starting BASS\".postln;\r\n                    ~streams[\\BASS] = ~p_BASS_pt2.play(t, quant: 4);\r\n                }, {\r\n                    \"Stopping BASS\".postln;\r\n                    ~streams[\\BASS].stop;\r\n                });\r\n            });\r\n        }, 40);\r\n\r\n        //TOM\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 49, {\r\n                if (val == 127, {\r\n                    \"Starting TOM\".postln;\r\n                    ~streams[\\TOM] = ~p_TOM.play(t, quant: 1);\r\n                }, {\r\n                    \"Stopping TOM\".postln;\r\n                    ~streams[\\TOM].stop;\r\n                });\r\n            });\r\n        }, 49);\r\n\r\n        //TOM2\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 41, {\r\n                if (val == 127, {\r\n                    \"Starting TOM2\".postln;\r\n                    ~streams[\\TOM2] = ~p_TOM2.play(t, quant: 1);\r\n                }, {\r\n                    \"Stopping TOM2\".postln;\r\n                    ~streams[\\TOM2].stop;\r\n                });\r\n            });\r\n        }, 41);\r\n\r\n        //FX\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 50, {\r\n                if (val == 127, {\r\n                    \"Starting FX\".postln;\r\n                    ~streams[\\FX] = ~p_FX.play(t, quant: 4);\r\n                }, {\r\n                    \"Stopping FX\".postln;\r\n                    ~streams[\\FX].stop;\r\n                });\r\n            });\r\n        }, 50);\r\n\r\n        //FX2\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 42, {\r\n                if (val == 127, {\r\n                    \"Starting FX2\".postln;\r\n                    ~streams[\\FX2] = ~p_FX2.play(t, quant: 4);\r\n                }, {\r\n                    \"Stopping FX2\".postln;\r\n                    ~streams[\\FX2].stop;\r\n                });\r\n            });\r\n        }, 42);\r\n\r\n        //ATMO LOOP\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 51, {\r\n                if (val > 0, {\r\n\r\n                    \"Starting ATMO\".postln;\r\n                    if (~atmo.isPlaying.not { // Überprüfe, ob der Synth bereits läuft\r\n                        ~atmo.set(\\gate, 1); // Starte den Synth, falls er noch nicht läuft\r\n                        ~atmo.run;\r\n                    },{\r\n                        ~atmo.set(\\gate, 1);\r\n                    });\r\n                }, {\r\n                    \"Stopping ATMO\".postln;\r\n                    ~atmo.set(\\gate, 0); // Release the envelope\r\n                });\r\n            });\r\n        }, 51).permanent_(true);\r\n\r\n        //WHITE NOISE\r\n        MIDIFunc.cc({ |val, num, chan, src|\r\n            if (num == 43, {\r\n                if (val == 127, {\r\n                    \"Starting Whitenoise\".postln;\r\n                    ~noiseSynth.set(\\gate, 1);\r\n                }, {\r\n                    \"Stopping Whitenoise\".postln;\r\n                    ~noiseSynth.set(\\gate, 0);\r\n                });\r\n            });\r\n        }, 43).permanent_(true);\r\n\r\n\r\n        (\r\n            //~bend = 0;\r\n            //~group = Group();\r\n            ~notes = Array.newClear(128, nil);\r\n            //MIDIdef.freeAll;\r\n\r\n            MIDIdef.noteOn(\\on, {\r\n                |val, num, chan, src|\r\n                try {\r\n                    ~notes.put(\r\n                        num,\r\n                        Synth(\\basspad, [\r\n                            \\freq, num.midicps,\r\n                            \\gate, 1,\r\n                            \\amp, val.linexp(0, 127, 0.01, 1.0), // Dynamische Lautstärke\r\n                            \\out, ~reverbBus\r\n                        ], ~genGrp)\r\n                    );\r\n                } { |err|\r\n                    \"Fehler beim Erstellen des monoSynth: \".postln;\r\n                    err.reportError;\r\n                };\r\n            }).permanent_(true);\r\n\r\n            MIDIdef.noteOff(\\off, {\r\n                arg val, num, chan, src;\r\n                ~notes[num].set(\\gate, 0);\r\n                ~notes.put(num, nil);\r\n            }).permanent_(true);\r\n        )\r\n\r\n    )\r\n  }\r\n)\r\n//##############################################//\r\n///////////////// END SETUP CODE ////////////////\r\n//##############################################//\r\n\r\n//##############################################//\r\n///////////////// Play code /////////////////////\r\n//##############################################//\r\n//Pattern 1\r\n(\r\n~streams[\\BD] = ~p_BD.play(t, quant: 4);\r\n~streams[\\BASS] = ~p_BASS.play(t, quant:4);\r\n~streams[\\BASS2] = ~p_BASS2.play(t, quant:4);\r\n~streams[\\FX] = ~p_FX1.play(t, quant:4);\r\n)\r\n\r\n//Pattern 2\r\n(\r\n~streams[\\BD] = ~p_BD.play(t, quant: 4);\r\n~streams[\\BASS] = ~p_BASS.play(t, quant:4);\r\n~streams[\\BASS2] = ~p_BASS2.play(t, quant:4);\r\n~streams[\\FX] = ~p_FX1.play(t, quant:[4,3]);\r\n~streams[\\SD] = ~p_SD.play(t, quant: 4);\r\n~streams[\\HH] = ~p_HH.play(t, quant:4);\r\n)\r\n\r\n//Pattern 3\r\n(\r\n~streams[\\BD] = ~p_BD.play(t, quant: 4);\r\n~streams[\\BASS] = ~p_BASS.play(t, quant:4);\r\n~streams[\\BASS2] = ~p_BASS2.play(t, quant:4);\r\n~streams[\\FX] = ~p_FX1.play(t, quant:[4,3]);\r\n~streams[\\SD] = ~p_SD.play(t, quant: 4);\r\n~streams[\\HH] = ~p_HH2.play(t, quant:4);\r\n)\r\n\r\n//stop individual streams\r\n~streams[\\BD].stop;\r\n~streams[\\SD].stop;\r\n~streams[\\BASS].stop;\r\n~streams[\\TOM].stop;\r\n~streams[\\FX].stop;\r\n~streams[\\HH].stop;\r\n~streams[\\HH2].stop;\r\n\r\n//play individual instruments\r\n~streams[\\BD] = ~p_BD.play(t, quant: 4);\r\n~streams[\\BASS] = ~p_BASS.play(t, quant:4);\r\n~streams[\\TOM] = ~p_TOM.play(t, quant:4);\r\n~streams[\\FX] = ~p_FX1.play(t, quant:[4,3]);\r\n~streams[\\SD] = ~p_SD.play(t, quant: 4);\r\n~streams[\\HH] = ~p_HH.play(t, quant:4);\r\n~streams[\\HH2] = ~p_HH2.play(t, quant:4);\r\n\r\n// Start the sidechained drone\r\nx = Synth(\\ATMO, [amp:0.2]);\r\nx.stop;\r\n\r\n~p_FX1.play(t, quant:4);\r\n\r\n(\r\n[50, 52, 64, 78].do({\r\n\targ n;\r\n\tSynth(\\pad, [freq: n.midicps]);\r\n});\r\n)\r\n\r\n(\r\n[68, 72, 76, 80, 84].do({\r\n\targ n;\r\n\tSynth(\\pad, [freq: n.midicps]);\r\n});\r\n)",
   "author" : "misc29377",
   "name" : "Simple performance script to launch patterns a la Ableton",
   "description" : "This script was my first Supercollider project to create a performance tool something similar like Ableton Live. \r\n\r\nThe script sets up a reverb and delay bus, loads samples (Kickdrum, snare, hihat, tom, bass, fx and pad) and creates sequences for each instrument, that can be triggered via Midi CC. For each channel the volume can be controlled via midi cc, too. \r\nThe script to load the samples was taken from the book example of Eli Fieldsteel and loads all samples in folder \"audio\" and all sub-folders where script is stored iteratively and names the array keys according to the folders and the index defines the nth sample in this folder. So the PlayBuf have to be modified to match your need. \r\n\r\nAdditionally a synth is create that can be played via Midi keys.\r\n\r\nAt the end of the script is the Play code that can be used to test the patterns without having a midi controller at hand. \r\n\r\nMaybe the MidiCC mapping has to be adjusted according your controller. \r\nThere may be a lot of mistakes in the script, but at least it runs ;).",
   "ancestor_list" : []
}
