/*RUN*/ OSCFunc.trace(true); // Turn posting on OSCFunc.trace(false); // Turn posting off Server.default.waitForBoot { // see below .bundle timings for starting synths etc. ~b1 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer ~b2 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer ~b3 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer ~b4 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer ~b5 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer ~b6 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer ~b7 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer ~b8 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer // SETUP OSC -------------------------------------- // Open port 57121 for ESP32 UDP OSC thisProcess.openUDPPort(57121); // allocate busses // create group order ~micGrp = Group.new; ~recGrp = Group.after(~micGrp); ~smpGrp = Group.after(~recGrp); // Setup MIDI MIDIClient.init; MIDIIn.connectAll; //MIDIOut.connectAll; ~m32_1 = MIDIOut.newByName("MidiSport 4x4", "MidiSport 4x4 MIDI 1").latency_(Server.default.latency); ~m32_2 = MIDIOut.newByName("MidiSport 4x4", "MidiSport 4x4 MIDI 2").latency_(Server.default.latency); g = Group.new; SynthDef.new(\mic, { arg in=0, out=0, amp=1; var sig; sig = SoundIn.ar(in) * amp; Out.ar(out, sig); }).add; // mono buffer recorder ---------------------------- // with loop and overdub modes ///////////////////// ////////////////////////////////////////////////////////////////// SynthDef.new(\recBuf,{ arg micIn=2, buf=~b1, t_trig=0, l=0, overdub=0; var sig, ptr, chain, onsets; //ptr = In.ar(ptrIn, 1); sig = SoundIn.ar(micIn, 1); // Onsets //chain = FFT(LocalBuf(512), sig); //onsets = Onsets.kr(chain, MouseX.kr(0,1), \rcomplex); RecordBuf.ar(sig, buf, loop:l, recLevel: 1, preLevel: overdub, doneAction: 0, trigger:t_trig, offset: 0); }).add; ////////////////////////////////////////////////////////////////// SynthDef.new(\sampler, { arg out=0, ploc=0, rate=1, buf=~b1, pos=10000, trate=100, amp=0.7; var sig, dur, clk, pan; // trate = //MouseY.kr(8,120,1); dur = 12 / trate; clk = Impulse.kr(trate); // pos = position // pos = MouseX.kr(0,BufDur.kr(b)) + TRand.kr(0, 0.01, clk); pan = WhiteNoise.kr(0.6); sig = TGrains.ar(2, clk, buf, rate, pos, dur, pan, amp * 0.20); Out.ar(out, sig); }).add; ////////////////////////////////////////////////////////////////// SynthDef.new(\sine, { | freq=1, atk=1, rel=1, pspd=0.1, ppos=0.8, release = 1, amp = 1, envc=0, gate = 0, beat=0.2 | var bal, soundL, soundR, cc1, cc2, cc3; var env = Env.new([0,1,0], [atk, rel], [1, -1]); //.circle(envc); TODO var gen = EnvGen.kr(env, gate, doneAction: 2); cc1 = \cc1.kr(0.5); // a control called cc1 cc2 = \cc2.kr(0.5); // a control called cc1 cc3 = \cc2.kr(0.5); // a control called cc1 /* soundL = SinOsc.ar(freq + (cc1 + cc2 )); soundR = SinOsc.ar(freq + (cc1 + cc2 + cc3 ));*/ soundL = SinOsc.ar(freq + (cc1 + cc2 )); soundR = SinOsc.ar(freq + beat ); bal = Balance2.ar(soundL, soundR, FSinOsc.kr(pspd, ppos)); Out.ar(0, bal * gen *0.1); }).add; ////////////////////////////////////////////////////////////// // DOEPFER POCKET DIAL MIDI CONTROLLER ////MIDI FOR ENVELOPED BEATIMG SINE WAVES ////////////////////////////////////////////////////////////// ~rndp = 0; ~tune = 0; ~beat = 0; MIDIFunc.cc({|val, ccNum, chan, src| val.postln; ~synth = Synth.new(\sine, [ \freq, exprand(50,4000), \atk, rrand(0.5,3), \rel, rrand(4,23), \ppos, rrand(-0.8,0.8), \pspd, rrand(0.02,0.3)], g); ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; }, ccNum:10, chan:0); MIDIFunc.cc({|val, ccNum, chan, src| ~tune = ~tune + 1; val.postln; ~synth.set(\cc2, ~tune); }, ccNum:10, chan:1); MIDIFunc.cc({|val, ccNum, chan, src| val.postln; ~beat = ~beat + 1; //~synth.set(\cc3, ~beat); g.set(\beat, rrand(0.02,3)) }, ccNum:10, chan:8); MIDIFunc.cc({|val, ccNum, chan, src| val.postln; ~synth = Synth.new(\sine, [ \midinote, 33, \harmonic, exprand(1,80).round, \atk, rrand(0.5,3), \rel, rrand(4,23), \ppos, rrand(-0.8,0.8)], g); ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; }, ccNum:10, chan:9); /////////////////////////// MIDIFunc.cc({|val, ccNum, chan, src| val.postln; ~s1.set( \rate, rrand(1,12)); }, ccNum:10, chan:2); ////////////////////////////////////////////////////////////// ///// KORG NANO CONTROLER //////////////////////////////////// // MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; }); n = MIDIFunc.cc({arg ...args; args.postln}); // match any noteOn // GRANULAR SAMPLER CONTROLS (4 INSTANCES ) // SLIDERS MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("A: AMP" + val).postln; ~s1.set( \amp, val); }, ccNum:0, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("B: AMP" + val).postln; ~s2.set( \amp, val); }, ccNum:1, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("C: AMP" + val).postln; ~s3.set( \amp, val); }, ccNum:2, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("D: AMP" + val).postln; ~s4.set( \amp, val); }, ccNum:3, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("E: AMP" + val).postln; ~s5.set( \amp, val); }, ccNum:4, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("F: AMP" + val).postln; ~s6.set( \amp, val); }, ccNum:5, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("G: AMP" + val).postln; ~s7.set( \amp, val); }, ccNum:6, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("H: AMP" + val).postln; ~s8.set( \amp, val); }, ccNum:7, chan:2); // RANDOM RATE TRIGGERS ///////// MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s1.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s1.set(\rate, 1); "A: trate random OFF".postln; } }, ccNum:32, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s2.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s2.set(\rate, 1); "B: trate random OFF".postln; } }, ccNum:33, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s3.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s3.set(\rate, 1); "C: trate random OFF".postln; } }, ccNum:34, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s4.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s4.set(\rate, 1); "D: trate random OFF".postln; } }, ccNum:35, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s5.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s5.set(\rate, 1); "E: trate random OFF".postln; } }, ccNum:36, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s6.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s6.set(\rate, 1); "F: trate random OFF".postln; } }, ccNum:37, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s7.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s7.set(\rate, 1); "G: trate random OFF".postln; } }, ccNum:38, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s8.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s8.set(\rate, 1); "H: trate random OFF".postln; } }, ccNum:39, chan:2); // RANDOM TRATE TRIGGERS ///////// MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s1.set(\trate, rrand(1,100)); "A: trate random!".postln; } { ~s1.set(\trate, 1); "A: trate random OFF".postln; } }, ccNum:48, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s2.set(\trate, rrand(1,100)); "B: trate random!".postln; } { ~s2.set(\trate, 1); "B: trate random OFF".postln; } }, ccNum:49, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s3.set(\trate, rrand(1,100)); "C: trate random!".postln; } { ~s3.set(\trate, 1); "C: trate random OFF".postln; } }, ccNum:50, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s4.set(\trate, rrand(1,100)); "D: trate random!".postln; } { ~s4.set(\trate, 1); "D: trate random OFF".postln; } }, ccNum:51, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s5.set(\trate, rrand(1,100)); "E: trate random!".postln; } { ~s5.set(\trate, 1); "E: trate random OFF".postln; } }, ccNum:52, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s6.set(\trate, rrand(1,100)); "F: trate random!".postln; } { ~s6.set(\trate, 1); "F: trate random OFF".postln; } }, ccNum:53, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s7.set(\trate, rrand(1,100)); "G: trate random!".postln; } { ~s7.set(\trate, 1); "G: trate random OFF".postln; } }, ccNum:54, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s8.set(\trate, rrand(1,100)); "H: trate random!".postln; } { ~s8.set(\trate, 1); "H: trate random OFF".postln; } }, ccNum:55, chan:2); // REC TRIGGERS ///////// MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r1.set(\t_trig, 1, \micIn, 2, \buf, ~b1, \l, 0, \overdub, 0 ); "A: SAMPLING!".postln; }}, ccNum:64, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r2.set(\t_trig, 1, \micIn, 2, \buf, ~b2, \l, 0, \overdub, 0 ); "B: SAMPLING!".postln; }}, ccNum:65, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r3.set(\t_trig, 1, \micIn, 2, \buf, ~b3, \l, 0, \overdub, 0 ); "C: SAMPLING!".postln; }}, ccNum:66, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r4.set(\t_trig, 1, \micIn, 2, \buf, ~b4, \l, 0, \overdub, 0 ); "D: SAMPLING!".postln; }}, ccNum:67, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r5.set(\t_trig, 1, \micIn, 2, \buf, ~b5, \l, 0, \overdub, 0 ); "A: SAMPLING!".postln; }}, ccNum:68, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r6.set(\t_trig, 1, \micIn, 2, \buf, ~b6, \l, 0, \overdub, 0 ); "B: SAMPLING!".postln; }}, ccNum:69, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r7.set(\t_trig, 1, \micIn, 0, \buf, ~b7, \l, 0, \overdub, 0 ); "C: SAMPLING!".postln; }}, ccNum:70, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r8.set(\t_trig, 1, \micIn, 0, \buf, ~b8, \l, 0, \overdub, 0 ); "D: SAMPLING!".postln; }}, ccNum:71, chan:2); // POTS MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b1.duration); ("A: POS" + val.postln; ~s1.set( \pos, val))} , ccNum:16, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b2.duration); ("B: POS" + val.postln; ~s2.set( \pos, val))} , ccNum:17, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b3.duration); ("C: POS" + val.postln; ~s3.set( \pos, val))} , ccNum:18, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b4.duration); ("D: POS" + val.postln; ~s4.set( \pos, val))} , ccNum:19, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b5.duration); ("E: POS" + val.postln; ~s5.set( \pos, val))} , ccNum:20, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b6.duration); ("F: POS" + val.postln; ~s6.set( \pos, val))} , ccNum:21, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b7.duration); ("G: POS" + val.postln; ~s7.set( \pos, val))} , ccNum:22, chan:2); MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b8.duration); ("H: POS" + val.postln; ~s8.set( \pos, val))} , ccNum:23, chan:2); ////////////////////////////////////////////////////////////// // OSC SETUP AND CONFIG FOR TACTUS SINE WAVE PLAYER ////////////////////////////////////////////////////////////// p = OSCFunc({ arg msg, time; postln(msg ); /// mesages from tetractys esp32 // 3C:E9:0E:AD:E5:00 // 48:E7:29:C3:EF:BC - tetractys if (msg[1] == '3C:E9:0E:AD:E2:E8') { // use esp32 mac address to determine source of msg postln("from tetratys esp32 " + msg ); w = case { msg[2] == 0} { postln("1" + msg[2] ); ~synth = Synth.new(\sine, [ \freq, exprand(50,400), \atk, rrand(0.5,3), \rel, rrand(4,23), \ppos, rrand(-0.8,0.8), \pspd, rrand(0.02,0.3) ], g); ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; postln("0" + msg[2] ); } { msg[2] == 1} { postln("1" + msg[2] ); ~synth = Synth.new(\sine, [ \freq, exprand(50,4000), \atk, rrand(0.5,3), \rel, rrand(4,23), \ppos, rrand(-0.8,0.8), \pspd, rrand(0.02,0.3) ], g); ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; } { msg[2] == 2} { postln("2" + msg[2] ); } { msg[2] == 3} { postln("3" + msg[2] ); } { msg[2] == 4} { postln("4" + msg[2] ); } { msg[2] == 5} { postln("5" + msg[2] ); } { msg[2] == 6} { postln("6" + msg[2] ); } { msg[2] == 7} { postln("6" + msg[2] ); ~synth = Synth.new(\sine, [ \freq, exprand(4000,8000), \atk, rrand(0.5,3), \rel, rrand(4,23), \ppos, rrand(-0.8,0.8), \pspd, rrand(0.02,0.3) ], g); //~synth.set([\gate, 0]); // ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; } }; },'/touch_121_A'); s.sync; s.wait(2); }; // END OF WAIT FOR SERVER BOOT ( // recorders ~r1 = Synth(\recBuf, [\micIn, 2, \buf, ~b1, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); ~r2 = Synth(\recBuf, [\micIn, 2, \buf, ~b2, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); ~r3 = Synth(\recBuf, [\micIn, 2, \buf, ~b3, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); ~r4 = Synth(\recBuf, [\micIn, 2, \buf, ~b4, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); ~r5 = Synth(\recBuf, [\micIn, 2, \buf, ~b5, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); ~r6 = Synth(\recBuf, [\micIn, 2, \buf, ~b6, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); ~r7 = Synth(\recBuf, [\micIn, 2, \buf, ~b7, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); ~r8 = Synth(\recBuf, [\micIn, 0, \buf, ~b8, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); // samplers ~s1 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b1, \amp, 0 ], ~smpGrp); ~s2 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b2, \amp, 0 ], ~smpGrp); ~s3 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b3, \amp, 0 ], ~smpGrp); ~s4 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b4, \amp, 0 ], ~smpGrp); ~s5 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b5, \amp, 0 ], ~smpGrp); ~s6 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b6, \amp, 0 ], ~smpGrp); ~s7 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b7, \amp, 0 ], ~smpGrp); ~s8 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b8, \amp, 0 ], ~smpGrp); ); /////////////////////////////////////////////////////////////////// // TODO make sure jack reconnects midi interface to mothers after server restart a = PatternProxy(Prand([1, 2, 3, 6,8,9 ], inf)); b = PatternProxy(Pseq([4, 5, 6], inf)); ~a1 = PatternProxy(Pseq([1, 2, 3], inf)); ~b1 = PatternProxy(Pseq([3, 4, 5,7], inf)); ( Pdefn(\m1, Pbind( \type, \midi, \midicmd, \noteOn, \midiout, ~m32_1, \root, 0, \scale, Scale.minor, \degree, a, \octave, b, //Pwrand([6,7,8], [25, 50, 25].normalizeSum, inf), \dur, 1/2 )).play; Pdefn(\m2, Pbind( \type, \midi, \midicmd, \noteOn, \midiout, ~m32_2, \root, 0, \scale, Scale.minor, \degree, ~a1, \octave, ~b1, //Pwrand([6,7,8], [25, 50, 25].normalizeSum, inf), \dur, 1/2 )).play; ); a.source = Prand([4, 5,6,7], inf); b.source = Prand([4, 5,6], inf); // Pdef(\m1).play(quant: 4); Pdef(\m2).play(quant: 4); //Pdef(\m1).play(quant: 4); Pdef(\m2).play(quant: 4); a.source = Prand([4, 2, 3,1,7], inf); ~a1.source = Prand([4, 2, 3,1,7], inf); b.source = Pseq([6,8,5,7], inf); ~b1.source = Prand([4,3,5,7], inf); ~b1.source = Prand([2,3,4], inf); b.source = Pseq([1, 2,3,4], inf); b.source = Prand([1, 3, 4, 5], inf); b.source = Prand([3, 5], inf); Pdef(\m1).stop; Pdef(\m1).stop; // // Pdef(\m2).play(quant: 4); // TOP MOTHER // // Pbindef(\m2, \octave, 6); // // // Pbindef(\m2, \octave, 3); // // Pbindef(\m2, \octave, 3); // // // z = Pseq([ // START SEQUENCER Ppar( [~m1, ~m2], 8 ) // chromatic slides ], 1 ).play(~t1, quant:1); // CONTROLS ---------------------- c.play(); z.pause; z.stop; c.start; z.resume; ~r1.set(\t_trig, 1, \micIn, 2, \buf, ~b1, \l, 1, \overdub, 0 ); "/////////// SAMPLING!".postln; ~r2.set(\t_trig, 1, \micIn, 2, \buf, ~b2, \l, 1, \overdub, 0 ); "/////////// SAMPLING!".postln; ~r3.set(\t_trig, 1, \micIn, 2, \buf, ~b3, \l, 1, \overdub, 0 ); "/////////// SAMPLING!".postln; ~r4.set(\t_trig, 1, \micIn, 2, \buf, ~b4, \l, 1, \overdub, 0 ); "/////////// SAMPLING!".postln; ~s1.set( \pos, 4111); ~s1.set( \trate, rrand(1,1)); ~s1.set( \rate, exprand(0.4, 10)); ~s2.set( \pos, 44111); ~s2.set( \trate, 0.1); ~s2.set( \rate, 1); ~s3.set( \pos, 45511); ~s3.set( \trate, 1); ~s3.set( \rate, 0.25); ~s1.free;