// ============================== // it's techno, in supercollider. // ============================== s.boot // WAIT UNTIL NOTIFICATION IS ON!!! // --- ALL INSTRUMENT SYNTHDEFS --- ( ( // lead sound (granular synth) SynthDef(\lead,{ arg freq=440,amp=1,rate=0.003,length=0.005,out=0; var signal, outsignal; var sinoscs; sinoscs = 2; rate = rate * MouseY.kr(0.5,10); length = length * MouseY.kr(0.5,10); signal = Saw.ar(freq); signal = Resonz.ar(signal,MouseX.kr(100,4000)); signal = signal * EnvGen.ar(Env.sine(length,1),Impulse.kr((rate*2).reciprocal)); signal = signal * (sinoscs.reciprocal); outsignal = Mix.fill(sinoscs,{ arg i; DelayL.ar(signal,2,rate * i) }); outsignal = outsignal * EnvGen.ar(Env.new(#[1,0],#[0.2]),doneAction:2); outsignal = outsignal * amp; Out.ar(out,outsignal); }).load(s); // lead sound (simple synth) SynthDef(\lead2,{ arg freq=440,amp=1,out=0; var signal, outsignal; signal = Saw.ar(freq/2); signal = Resonz.ar(signal,MouseX.kr(100,4000),0.1); signal = signal * EnvGen.ar(Env.new(#[1,0],#[0.2]),doneAction:2); signal = signal * 2 * amp; Out.ar(out,signal); }).load(s); // kickdrum SynthDef(\kick,{ arg amp = 0.4,out=0; var signal; signal = SinOsc.ar(XLine.kr(330,20,0.15)); signal = signal * EnvGen.ar(Env.new(#[1,0],#[0.15]),doneAction:2); signal = signal * amp; Out.ar(out,signal); }).load(s); // cymbal SynthDef(\cymbal,{ arg amp = 0.5,out=0; var signal; signal = WhiteNoise.ar(1); signal = HPF.ar(signal,5000); signal = signal * EnvGen.ar(Env.new(#[1,0],#[0.6]),doneAction:2); signal = signal * amp; Out.ar(out,signal); }).load(s); // open hihat SynthDef(\openhat,{ arg amp = 0.5,out=0; var signal; signal = WhiteNoise.ar(1); signal = HPF.ar(signal,10000); signal = signal * EnvGen.ar(Env.new(#[1,0],#[0.3]),doneAction:2); signal = signal * amp; Out.ar(out,signal); }).load(s); // closed hihat SynthDef(\closedhat,{ arg amp = 0.5,out=0; var signal; signal = WhiteNoise.ar(1); signal = HPF.ar(signal,10000); signal = signal * EnvGen.ar(Env.new(#[1,0],#[0.05]),doneAction:2); signal = signal * amp; Out.ar(out,signal); }).load(s); // snare SynthDef(\snare,{ arg amp = 0.5,out=0; var signal; signal = WhiteNoise.ar(1); signal = HPF.ar(signal,2000); signal = signal * EnvGen.ar(Env.new(#[1,0],#[0.2]),doneAction:2); signal = signal * amp; Out.ar(out,signal); }).load(s); // bassline SynthDef(\bass,{ arg freq = 55, amp = 0.4,out=0; var signal; signal = Saw.ar(freq); signal = LPF.ar(signal,freq*8); signal = signal * EnvGen.ar(Env.new(#[1,0],#[0.3]),doneAction:2); signal = signal * amp; Out.ar(out,signal); }).load(s); ); // --- ALL EFFECT SYNTH DEFS --- ( // mute SynthDef(\mute, { arg in = 8, out = 0; }).load(s); // no effects SynthDef(\nofx, { arg in = 9, out = 0; var signal; signal = In.ar(in); Out.ar(out,signal!2); }).load(s); // high pass filter SynthDef(\fx1, { arg in = 10, out = 0; var signal; signal = In.ar(in); signal = HPF.ar(signal,(SinOsc.kr(4)*2000)+4000); Out.ar(out,signal!2); }).load(s); // simple multitap feedback delay SynthDef(\fx2, { arg in = 11, out = 0; var signal, delay; signal = In.ar(in) + LocalIn.ar(1); delay = DelayL.ar(signal,0.1,0.1); signal = signal + delay; LocalOut.ar(delay*0.6); // send the delay'ed portion back to LocalIn Out.ar(out,signal!2); }).load(s); // tremolo (sine wave modulation of amplitude) SynthDef(\fx3, { arg in = 12, out = 0; var signal, delay; signal = In.ar(in); signal = signal * SinOsc.kr(20); Out.ar(out,signal!2); }).load(s); // phaser SynthDef(\fx4, { arg in = 13, out = 0; var signal, delay; signal = In.ar(in); signal = signal + DelayL.ar(signal,1,SinOsc.kr(100,mul:0.01,add:0.02)); signal = signal/2; Out.ar(out,signal!2); }).load(s); // chorus SynthDef(\fx5, { arg in = 14, out = 0; var signal, modulated, numDelays = 12; signal = In.ar(in); modulated = Array.fill(numDelays, {arg i; LFPar.kr(0.05 * rrand(0.94, 1.06), 0.05 * i, 0.1, 0.08);}); signal = DelayC.ar(signal, 0.5, modulated); signal = signal.sum / 4; Out.ar(out,signal!2); }).load(s); ); // --- SETUP EFFECT SYNTHS --- ( ~mute.free; ~nofilter.free; ~filter1.free; ~filter2.free; ~filter3.free; ~filter4.free; ~filter5.free; ~mute = Synth.new("mute"); ~nofilter = Synth.new("nofx"); ~filter1 = Synth.new("fx1"); ~filter2 = Synth.new("fx2"); ~filter3 = Synth.new("fx3"); ~filter4 = Synth.new("fx4"); ~filter5 = Synth.new("fx5"); ); // --- initial pattern --- ~currentPattern = 0; ~followSequencer = true; //start variables ~drumpattern = 1; ~kickdrumfx = 0; ~drumfx = 1; ~bassline = 1; ~bassfx = 0; ~synthline = 0; ~synthfx = 2; // pattern sequencer ~nextPattern = { ~currentPattern = ~currentPattern+1; ("current pattern = " ++ ~currentPattern).postln; if (~currentPattern == 1, { //start variables ~drumpattern = 1; ~kickdrumfx = 0; ~drumfx = 1; ~bassline = 1; ~bassfx = 0; ~synthline = 0; ~synthfx = 2; }); if (~currentPattern == 2, { //1 more bass ~bassline = 2; }); if (~currentPattern == 3, { //hihats ~drumpattern = 2; }); if (~currentPattern == 4, { //weird pattern with gabba bass ~drumpattern = 5; ~kickdrumfx = 4; ~drumfx = 2; ~bassline = 2; ~bassfx = 4; }); if (~currentPattern == 5, { //back to normal with chugginess ~drumpattern = 3; ~kickdrumfx = 0; ~drumfx = 1; ~bassline = 2; ~bassfx = 0; }); if (~currentPattern == 6, { //add synth ~synthline = 1; }); if (~currentPattern == 7, { // just synth ~drumpattern = 0; ~bassline = 0; }); if (~currentPattern == 8, { //double synth and kick ~drumpattern = 1; ~synthline = 2; }); if (~currentPattern == 9, { //add hats ~drumpattern = 2; }); if (~currentPattern == 10, { //no drums ~drumpattern = 0; }); if (~currentPattern == 11, { // rock! ~drumpattern = 3; ~bassline = 2; ~synthline = 2; }); if (~currentPattern == 12, { // no drums ~drumpattern = 0; }); if (~currentPattern == 13, { // full on ~drumpattern = 4; ~bassline = 3; ~synthline = 3; }); if (~currentPattern == 14, { // cut up synth ~synthfx = 3; }); if (~currentPattern == 15, { // wicked synth ~synthfx = 4; }); if (~currentPattern == 16, { // slower bassline and only open hats ~drumpattern = 3; ~bassline = 2; }); if (~currentPattern == 17, { // only closed hats ~drumpattern = 2; }); if (~currentPattern == 18, { // no hats ~drumpattern = 1; }); if (~currentPattern == 19, { // no drums, initial bass ~drumpattern = 0; ~bassline = 1; }); if (~currentPattern == 20, { // no bass, double synth ~bassline = 0; ~synthline = 2; }); if (~currentPattern == 21, { // single synth ~synthline = 1; }); if (~currentPattern == 22, { ~synthline = 0; t.stop; }); }; // --- THE MAIN 'PATTERN' LOOP t = TempoClock(18); ( t.clear; t.schedAbs(t.beats.ceil, { arg beat, sec; // drum patterns if (beat % 256==0, { if (~followSequencer, { ~nextPattern.value; }); Synth(\cymbal,[\out,(~kickdrumfx+9)]) }); if ((~drumpattern>0), { if (beat % 8==0, {Synth(\kick,[\out,(~kickdrumfx+9)])}); }); if ((~drumpattern==2), { if (((beat % 2==0) && (rrand(0,3)==0)) || (rrand(0,10)==0), {Synth(\closedhat,[\out,(~drumfx+9)])}); }); if ((~drumpattern==3) || (~drumpattern==4), { if (beat % 16==8, {Synth(\snare,[\out,(~drumfx+9)])}); if (beat % 8==4, {Synth(\openhat,[\out,(~drumfx+9)])}); }); if ((~drumpattern==4), { if ((beat % 8==2) || (beat % 8==6) || (beat % 8==0), {Synth(\closedhat,[\out,(~drumfx+9)])}); }); if ((~drumpattern==5), { if (((beat % 2==0) && (rrand(0,3)==0)) || (rrand(0,10)==0), {Synth(\closedhat,[\out,(~drumfx+9)])}); if (((beat % 4==0) && (rrand(0,3)==0)), {Synth(\openhat,[\out,(~drumfx+9)])}); }); // basslines if ((~bassline>0), { if (beat % 8==4, {Synth(\bass,[\freq,55,\out,(~bassfx+9)])}); }); if ((~bassline==2) || (~bassline==3), { if (beat % 128==126, {Synth(\bass,[\freq,110,\out,(~bassfx+9)])}); }); if ((~bassline==3), { if (((beat % 8==2) || (beat % 8==6)) && (beat % 128!=126) , {Synth(\bass,[\freq,55,\out,(~bassfx+9)])}); }); // synthlines if ((~synthline>0), { if (beat % 8==0, {Synth(\lead,[\freq,220,\out,(~synthfx+9)])}); }); if ((~synthline==2), { if (((beat % 2==0) && (beat % 8!=0)) || ((beat % 1==0) && (rrand(0,8)==0)), {Synth(\lead2,[\freq,[440,220,110,880,55].choose,\out,(~synthfx+9)])}); }); if ((~synthline==3), { if (((beat % 2==0) && (beat % 8!=0)) || ((beat % 1==0) && (rrand(0,8)==0)), {Synth(\lead2,[\freq,[440,220,110,880,55].choose,\out,(~synthfx+9)])}); if (((beat % 2==0) && (beat % 8!=0)) || ((beat % 1==0) && (rrand(0,8)==0)), {Synth(\lead2,[\freq,[440,220,110,880,55].choose,\out,(~synthfx+9)])}); }); 1; // repeat }); ) ) // ===== MANUAL SEQUENCER BELOW IF YOU WANT ======= ~followSequencer = true; //1 more bass ~bassline = 2; //hihats ~drumpattern = 2; //weird pattern with gabba bass ( ~drumpattern = 5; ~kickdrumfx = 4; ~drumfx = 2; ~bassline = 1; ~bassfx = 4; ) //normal with chugginess ( ~drumpattern = 3; ~kickdrumfx = 0; ~drumfx = 1; ~bassline = 2; ~bassfx = 0; ) //add synth ~synthline = 1; //just synth ( ~drumpattern = 0; ~bassline = 0; ) //double synth and kick ( ~drumpattern = 1; ~synthline = 2; ) //add hats ~drumpattern = 2; //no drums ~drumpattern = 0; // rock! ( ~drumpattern = 3; ~bassline = 2; ~synthline = 2; ) // no drums ~drumpattern = 0; // full on ( ~drumpattern = 4; ~bassline = 3; ~synthline = 3; ) // cut up synth ~synthfx = 3; // wicked synth ~synthfx = 4; // slower bassline and only open hats ( ~drumpattern = 3; ~bassline = 2; ) // only closed hats ~drumpattern = 2; // no hats ~drumpattern = 1; // no drums, initial bass ( ~drumpattern = 0; ~bassline = 1; ) // no bass, double synth ( ~bassline = 0; ~synthline = 2; ) // single synth ~synthline = 1; t.stop;