ophiuchus/sc/radio_helsinki.scd

479 lines
16 KiB
Plaintext

/*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;