529 lines
23 KiB
Plaintext
529 lines
23 KiB
Plaintext
/*RUN*/
|
|
|
|
OSCFunc.trace(true); // Turn posting on
|
|
OSCFunc.trace(false); // Turn posting off
|
|
|
|
// Setup MIDI
|
|
|
|
MIDIClient.init;
|
|
MIDIIn.connectAll;
|
|
|
|
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
|
|
|
|
g = Group.new;
|
|
|
|
~micGrp = Group.new;
|
|
~recGrp = Group.after(~micGrp);
|
|
~smpGrp = Group.after(~recGrp);
|
|
|
|
//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);
|
|
|
|
// SYNTH DEFS //////////////////////////////////////
|
|
|
|
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);
|
|
|
|
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;
|
|
|
|
SynthDef("sineSeq", { arg out, freq, atk=0.1, sustain=1, amp=1, pan;
|
|
var env, u=1;
|
|
env = EnvGen.kr(Env.perc(atk, sustain), 1, doneAction: Done.freeSelf);
|
|
// 1.do { var d; d = exprand(1, 1); u = SinOsc.ar(d * 300, u, rrand(0.1,1.2) * d, 1) };
|
|
Out.ar(out, Pan2.ar(SinOsc.ar(freq, 0, amp * env), pan));
|
|
}).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;
|
|
~synth = Synth.new(\sine, [ \freq, 440, \atk, rrand(2,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:2);
|
|
/*
|
|
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:3);*/
|
|
|
|
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 );
|
|
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} {
|
|
~tfreq= [440,220,880,110, 55, 1760, 1760*2, 1760*3].choose;
|
|
postln("2; TUNING PITCH 440hz " + ~tfreq );
|
|
~synth = Synth.new(\sine, [
|
|
\freq, ~tfreq,
|
|
\atk, rrand(2,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] == 3} {
|
|
|
|
postln("1" + msg[2] + "chord [2]" );
|
|
2.do{
|
|
~synth = Synth.new(\sine, [
|
|
\freq, exprand(50,4000),
|
|
\atk, rrand(0.5,3), \rel, rrand(4,23),
|
|
\ppos, rrand(-0.8,0.8),
|
|
\tune, rrand(-3.8,3.8),
|
|
\pspd, rrand(0.02,0.3)
|
|
], g);
|
|
|
|
~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0;
|
|
};
|
|
}
|
|
|
|
{ msg[2] == 4} {
|
|
|
|
postln("1" + msg[2] + "chord [3]" );
|
|
3.do{
|
|
~synth = Synth.new(\sine, [
|
|
\freq, exprand(50,4000),
|
|
\atk, rrand(0.5,3), \rel, rrand(4,23),
|
|
\ppos, rrand(-0.8,0.8),
|
|
\tune, rrand(-3.8,3.8),
|
|
\pspd, rrand(0.02,0.3)
|
|
], g);
|
|
|
|
~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0;
|
|
};
|
|
|
|
}
|
|
|
|
{ msg[2] == 5} {
|
|
|
|
postln("1" + msg[2] + "chord [4]" );
|
|
4.do{
|
|
~synth = Synth.new(\sine, [
|
|
\freq, exprand(50,4000),
|
|
\atk, rrand(0.5,3), \rel, rrand(4,23),
|
|
\ppos, rrand(-0.8,0.8),
|
|
\tune, rrand(-3.8,3.8),
|
|
\pspd, rrand(0.02,0.3)
|
|
], g);
|
|
|
|
~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0;
|
|
};
|
|
|
|
}
|
|
|
|
{ msg[2] == 6} {
|
|
|
|
postln("6" + msg[2] + "4k - 10k Hz");
|
|
~synth = Synth.new(\sine, [
|
|
\freq, exprand(400,1000),
|
|
\atk, rrand(0.05,0.1), \rel, rrand(2,10),
|
|
\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] == 7} {
|
|
|
|
postln("7" + msg[2] + "4k - 10k Hz");
|
|
~synth = Synth.new(\sine, [
|
|
\freq, exprand(4000,10000),
|
|
\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;
|
|
|
|
}
|
|
|
|
// TACTUS A - $ CONTROLS
|
|
|
|
{ msg[2] == 8} { postln("8" + msg[2] + "4k - 10k Hz"); }
|
|
{ msg[2] == 9} { postln("9" + msg[2] + "4k - 10k Hz"); }
|
|
|
|
{ msg[2] == 10} { postln("10" + msg[2] + "START SINE SEQUENCE");
|
|
|
|
Pbindef(\a, \instrument, \sineSeq,\scale, Scale.chromatic,
|
|
\degree, Pseq([0, 1, 2, 3, 4,5,6,7,8, 9 ,10,11 ], inf),
|
|
\octave, Prand([2, 3, 4,5,6,7,8], inf), \gate, 1,
|
|
\dur, Pwrand([4, 3, 2,1,1/2,1/4], [1,2,13,5,8,13].normalizeSum, inf),
|
|
\atk, Pwhite(0.01, 1),
|
|
\pan, Pwhite(-1, 1),
|
|
\sustain, Pwhite(0.2, 7.5)
|
|
).play;
|
|
|
|
}
|
|
{ msg[2] == 11} { postln("11" + msg[2] + "STOP SINE SEQUENCE");
|
|
Pbindef(\a, \instrument, \sineSeq).stop;
|
|
|
|
}
|
|
};
|
|
|
|
},'/touch_121_A');
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
MIDIFunc.cc({|val, ccNum, chan, src|
|
|
val = val%11;
|
|
w = case
|
|
{ val == 0} { x = [0]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); }
|
|
{ val == 1} { x = [0, 7]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); }
|
|
{ val == 2} { x = [0, 7, 3]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); }
|
|
{ val == 3} { x = [0, 7, 3 ,5]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); }
|
|
{ val == 4} { x = [0, 7, 3 , 5, 9]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); }
|
|
{ val == 5} { x = [0, 7, 3, 5, 9, 11]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); }
|
|
{ val == 6} { x = [0, 7, 3, 5, 9, 11]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); }
|
|
{ val == 7} { x = [0, 7, 3 , 5, 9]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); }
|
|
{ val == 8} { x = [0, 7, 3 ,5]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); }
|
|
{ val == 9} { x = [0, 7, 3]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); }
|
|
{ val == 10} { x = [0, 7]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); }
|
|
}, ccNum:10, chan:4);
|
|
|
|
MIDIFunc.cc({|val, ccNum, chan, src|
|
|
val = val%11;
|
|
w = case
|
|
{ val == 0} { x = [0]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); }
|
|
{ val == 1} { x = [0, 7]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); }
|
|
{ val == 2} { x = [0, 7, 3]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); }
|
|
{ val == 3} { x = [0, 7, 3 ,5]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); }
|
|
{ val == 4} { x = [0, 7, 3 , 5, 9]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); }
|
|
{ val == 5} { x = [0, 7, 3, 5, 9, 11]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); }
|
|
{ val == 6} { x = [0, 7, 3, 5, 9, 11]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); }
|
|
{ val == 7} { x = [0, 7, 3 , 5, 9]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); }
|
|
{ val == 8} { x = [0, 7, 3 ,5]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); }
|
|
{ val == 9} { x = [0, 7, 3]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); }
|
|
{ val == 10} { x = [0, 7]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); }
|
|
}, ccNum:10, chan:12);
|
|
|
|
|
|
// set the central octave / register
|
|
|
|
MIDIFunc.cc({|val, ccNum, chan, src|
|
|
val = val%6;
|
|
w = case
|
|
{ val == 0} { x = [0]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); }
|
|
{ val == 1} { x = [0, 1]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); }
|
|
{ val == 2} { x = [0, 1, 2]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); }
|
|
{ val == 3} { x = [0, 1, 2]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); }
|
|
{ val == 4} { x = [0, 1, 2, 3]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); }
|
|
{ val == 5} { x = [0, 1, 2, 3, 4]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); }
|
|
}, ccNum:10, chan:5);
|
|
|
|
MIDIFunc.cc({|val, ccNum, chan, src|
|
|
val = val%6;
|
|
|
|
w = case
|
|
|
|
{ val == 0} { x = [0]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); }
|
|
{ val == 1} { x = [0, 1]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); }
|
|
{ val == 2} { x = [0, 1, 2]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); }
|
|
{ val == 3} { x = [0, 1, 2]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); }
|
|
{ val == 4} { x = [0, 1, 2, 3]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); }
|
|
{ val == 5} { x = [0, 1, 2, 3, 4]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); };
|
|
}, ccNum:10, chan:13);
|
|
|
|
|
|
// set the central duration sequence
|
|
|
|
MIDIFunc.cc({|val, ccNum, chan, src|
|
|
val = val%11;
|
|
|
|
w = case
|
|
|
|
{ val == 0} { x = [1]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 1} { x = [1/2]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 2} { x = [1/3]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 3} { x = [1/4]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 4} { x = [1/5]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 5} { x = [1/5]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 6} { x = [1/6]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 7} { x = [1/7]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 8} { x = [1/8]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 9} { x = [1/16]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); }
|
|
{ val == 10} { x = [3, 2, 1, 1/2, 1/4, 1/8]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pwrand(x, [0.25, 0.5, 1, 3, 5, 8].normalizeSum, inf); };
|
|
|
|
}, ccNum:10, chan:6);
|
|
|
|
MIDIFunc.cc({|val, ccNum, chan, src|
|
|
val = val%11;
|
|
|
|
w = case
|
|
|
|
{ val == 0} { x = [1]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 1} { x = [1/2]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 2} { x = [1/3]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 3} { x = [1/4]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 4} { x = [1/5]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 5} { x = [1/5]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 6} { x = [1/6]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 7} { x = [1/7]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 8} { x = [1/8]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 9} { x = [1/16]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); }
|
|
{ val == 10} { x = [3, 2, 1, 1/2, 1/4, 1/8]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pwrand(x, [0.25, 0.5, 1, 3, 5, 8].normalizeSum, inf); };
|
|
|
|
}, ccNum:10, chan:14);
|
|
|
|
|
|
|
|
~poct1 = 3; ~oct1 = 0;
|
|
~poct2 = 3; ~oct2 = 0;
|
|
|
|
q = OSCFunc({ arg msg, time;
|
|
postln(msg );
|
|
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
|
|
|
|
// tactus changes
|
|
{ msg[2] == 4} { postln("4" + msg[2] ); }
|
|
{ msg[2] == 5} {
|
|
postln("5" + msg[2] ); Pbindef(\m1, \dur, ~pdur1);} // initiate selected duration set
|
|
{ msg[2] == 6} { ~oct1 = ~oct1 + 1; ~oct1 = ~oct1%9;
|
|
postln("6" + msg[2] + ~oct1); Pbindef(\m1, \octave, ~poct1 + ~oct1);} // initiate selected octave set
|
|
{ msg[2] == 7} { postln("7" + msg[2] ); Pbindef(\m1, \degree, ~pseq1);} // initiate selected pitch set
|
|
// tactus 4 playback controls
|
|
{ msg[2] == 10} { postln("10" + msg[2] ); Pbindef(\m1).play; } // stop sequence
|
|
{ msg[2] == 11} { postln("11" + msg[2] ); Pbindef(\m1).stop; } // start sequence
|
|
|
|
// tactus changes
|
|
{ msg[2] == 0} { postln("0" + msg[2] ); }
|
|
{ msg[2] == 1} { postln("5" + msg[2] ); Pbindef(\m2, \dur, ~pdur2);} // initiate selected duration set
|
|
{ msg[2] == 2} {
|
|
~oct2 = ~oct2 + 1; ~oct2 = ~oct2%9;
|
|
postln("2" + msg[2] + ~oct2); Pbindef(\m2, \octave, ~poct2 + ~oct2);} // initiate selected octave set} // initiate selected octave set
|
|
{ msg[2] == 3} { postln("3" + msg[2] ); Pbindef(\m2, \degree, ~pseq2); } // initiate selected pitch set
|
|
// tactus 4 playback controls
|
|
{ msg[2] == 8} { postln("8" + msg[2] ); Pbindef(\m2).play; } // stop sequence
|
|
{ msg[2] == 9} { postln("9" + msg[2] ); Pbindef(\m2).stop; }; // start sequence
|
|
|
|
}},'/touch_121_B');
|
|
|
|
|
|
|
|
|
|
|
|
}; // END OF WAIT FOR SERVER BOOT
|