touch interface improvements in sc

master
Rob Canning 2022-09-07 12:04:52 +02:00
parent d2ec85ba95
commit a32fef059f
2 changed files with 164 additions and 55 deletions

189
gtr.scd
View File

@ -13,11 +13,25 @@
Ljudmila OTF Hackathon, Maribor 1-6 March 2022 */ Ljudmila OTF Hackathon, Maribor 1-6 March 2022 */
// GTR MAC address: 10:97:BD:36:D6:4E // GTR MAC address: 10:97:BD:36:D6:4E
(
s.reboot{
s.options.numBuffers = 1024 * 256; // increase this if you need to load more samples
s.options.sampleRate = 44100; // also tried with 44000 value
s.options.memSize = 8192 * 32; // increase this if you get "alloc failed" messages
s.options.numWireBufs = 64; // increase this if you get "exceeded number of interconnect buffers" messages
s.options.maxNodes = 1024 * 32; // increase this if you are getting drop outs and the message "too many nodes"
s.options.numInputBusChannels = 4;
s.options.numOutputBusChannels = 4;
} )
// RUNME 0 ========================================= // RUNME 0 =========================================
s.boot(); s.boot();
// RUNME 1 ========================================= // RUNME 1 =========================================
// ------------------------------------------------- // -------------------------------------------------
( // SETUP ----------------------------------------- - ( // SETUP ----------------------------------------- -
// --------------------------------------------------- // ---------------------------------------------------
// Allocate a 4 second mono buffer // Allocate a 4 second mono buffer
@ -33,6 +47,7 @@ thisProcess.openUDPPort(57121);
// RUNME 2 ========================================== // RUNME 2 ==========================================
// ------------------------------------------------- // -------------------------------------------------
( // DEFINE SYNTHS --------------------------------- <-- ( // DEFINE SYNTHS --------------------------------- <--
// ------------------------------------------------- // -------------------------------------------------
@ -67,6 +82,7 @@ SynthDef("recBuf",{
); );
// ---------~positionmode = 1; ------------------------------------------- // ---------~positionmode = 1; -------------------------------------------
( // Granulator -------------------------------------- ( // Granulator --------------------------------------
// ---------------------------------------------------- // ----------------------------------------------------
@ -76,32 +92,39 @@ SynthDef("recBuf",{
//z = Buffer.sendCollection(s, winenv.discretize, 1); //z = Buffer.sendCollection(s, winenv.discretize, 1);
// ~rndpos = LFNoise2.kr(0.1).range(0, 1); // ~rndpos = LFNoise2.kr(0.1).range(0, 1);
SynthDef(\buf_grain, { | out, gate = 1, amp = 1, SynthDef(\buf_grain, { | out, gate = 1, amp = 0.5,
sndbuf, envbuf, pan=0, imp=50, sndbuf, envbuf, pan=0, imp=50,
pitchmodeindex=0, sensorpitch=1, sensorgdur=0.1, sensorgpan=0, pitchmodeindex=0, sensorpitch=1, sensorgdur=0.1, sensorgpan=0,
positionmodeindex=0, gdurmodeindex=0, gpanmodeindex=0, positionmodeindex=1, gdurmodeindex=0, gpanmodeindex=0,
sensorposition=0, impulsemodeindex=0, sensorimpulse=0, sensorposition=0, impulsemodeindex=0, sensorimpulse=0,
rlow= -1, rhigh=1 | signalChannelIndex=1,
rlow= -1, rhigh=10 |
var signal, env, freqdev, pos, var signal, env, freqdev, pos,
pitchmode0, pitchmode1, pitch, pitchmode0, pitchmode1, pitch,
gdurmode0, gdurmode1, gdurmode2, gdur, gdurmode0, gdurmode1, gdurmode2, gdurmode3, gdurmode4, gdurmode5, gdurmode6, gdur,
gpanmode0, gpanmode1, gpan, gpanmode0, gpanmode1, gpan,
positionmode0, positionmode1, position, positionmode0, positionmode1, positionmode2, position,
impulsemode0, impulsemode1, impulse; impulsemode0, impulsemode1, impulse,
stereosignal, quadsignalL, quadsignalR, quadsignal, signalchannels;
// grain duration mode -untransposed, random, or sensor controlled // grain duration mode -untransposed, random, or sensor controlled
gdurmode0 = 0.1; gdurmode0 = 0.05;
gdurmode1 = LFNoise1.kr.range(0.2, 3.3); gdurmode1 = 0.1;
gdurmode2 = LFNoise1.kr.range(0.2, 3.3); gdurmode2 = LFNoise1.kr.range(0.1, 0.3);
gdurmode3 = LFNoise1.kr.range(0.1, 0.6);
gdurmode4 = LFNoise1.kr.range(0.6, 0.6);
gdurmode5 = LFNoise1.kr.range(0.1, 2.6);
gdurmode6 = LFNoise1.kr.range(1, 2);
gdur = Select.kr(gdurmodeindex, gdur = Select.kr(gdurmodeindex,
[gdurmode0, gdurmode1, gdurmode2, sensorgdur]); [gdurmode0, gdurmode1, gdurmode2, gdurmode3, gdurmode4, gdurmode5, gdurmode6, sensorgdur]);
// grain pan mode -untransposed, random, or sensor controlled // grain pan mode -untransposed, random, or sensor controlled
gpanmode0 = 0.1; gpanmode0 = 0;
gpanmode1 = LFNoise1.kr.range(0.1, 10.3); gpanmode1 = LFNoise1.kr(100).range(-1, 1);
gpan = Select.kr(gpanmodeindex, gpan = Select.kr(gpanmodeindex,
[gpanmode0, gpanmode1, sensorgpan]); [gpanmode0, gpanmode1, sensorgpan]);
@ -109,13 +132,16 @@ SynthDef(\buf_grain, { | out, gate = 1, amp = 1,
pitchmode0 = 1; pitchmode0 = 1;
pitchmode1 = LFNoise1.kr.range(rlow, rhigh); pitchmode1 = LFNoise1.kr.range(rlow, rhigh);
pitch = Select.kr(pitchmodeindex, pitch = Select.kr(pitchmodeindex,
[pitchmode0, pitchmode1, sensorpitch]); [pitchmode0, sensorpitch, pitchmode1 ]);
// granular playhead mode - fixed random or sensor controlled // granular playhead mode - fixed random or sensor controlled
positionmode0 = 1; positionmode0 = 0.1;
positionmode1 = LFNoise1.kr.range(0, 1); positionmode0 = (Phasor.ar(0, 1 * BufRateScale.ir(b), 0, BufSamples.ir(b)-1) + LFNoise1.ar(100).bipolar(0.1 * SampleRate.ir) ) / BufSamples.ir(b);
positionmode1 = LFNoise1.kr.range(0.05, 0.98);
positionmode2 = LFNoise1.kr.range(0.1, 0.2);
position = Select.kr(positionmodeindex, position = Select.kr(positionmodeindex,
[positionmode0, positionmode1, sensorposition]); [positionmode0, positionmode1, positionmode2, sensorposition]);
// grain impulse frequency mode - random, metric or sensor based impulse modes // grain impulse frequency mode - random, metric or sensor based impulse modes
impulsemode0 = Impulse.kr(imp); impulsemode0 = Impulse.kr(imp);
@ -123,18 +149,30 @@ SynthDef(\buf_grain, { | out, gate = 1, amp = 1,
impulse = Select.kr(impulsemodeindex, impulse = Select.kr(impulsemodeindex,
[impulsemode0, impulsemode1, sensorimpulse]); [impulsemode0, impulsemode1, sensorimpulse]);
env = EnvGen.kr( env = EnvGen.kr(~gpanmode=1;
Env([0, 1, 0], [1, 1], \sin, 1), gate, levelScale: amp, doneAction: 2); Env([0, 1, 0], [1, 1], \sin, 1), gate, levelScale: amp, doneAction: 2);
signal = GrainBuf.ar(2, signal = GrainBuf.ar(2,
impulse, // selectable between impulse.kr and dust.kr impulse, // selectable between impulse.kr and dust.kr
gdur, sndbuf, pitch, position, 2, gpan, envbuf); gdur, sndbuf, pitch, position, 2, gpan, envbuf);
signal = FreeVerb2.ar(signal[0], signal[1], //signal = FreeVerb2.ar(signal[0], signal[1], mix:0.4, room:0.5, damp:0);
mix:0.4, room:0.5, damp:0
);
signal = signal* env;
Out.ar(0,signal);
stereosignal = signal* env;
quadsignalL = PanAz.ar(4, signal[0], MouseX.kr(0,2));
quadsignalR = PanAz.ar(4, signal[1], MouseX.kr(0,2).range(2,0));
quadsignal = signal; //Mix.ar([quadsignalL, quadsignalR]);
signalchannels = Select.ar(signalChannelIndex, [stereosignal, quadsignal]);
//signal = signalchannels;
Out.ar(0, signalchannels);
}).add; }).add;
); );
) )
@ -143,6 +181,7 @@ SynthDef(\buf_grain, { | out, gate = 1, amp = 1,
// ---------------------------------------------------- // ----------------------------------------------------
(( // START SYNTHS --------------------------------- (( // START SYNTHS ---------------------------------
// ---------------------------------------------------- // ----------------------------------------------------
@ -157,7 +196,19 @@ SynthDef(\buf_grain, { | out, gate = 1, amp = 1,
// ---------------------------------------------------- // ----------------------------------------------------
(( // OSC Receivers // ENABLE SENSOR AND SWITCH VALUES <-- (( // OSC Receivers // ENABLE SENSOR AND SWITCH VALUES <--
// ---------------------------------------------------- // ----------------------------------------------------
~pitchmode = 0; ~positionmode = 0; ~impulsemode = 0; ~gdurmode=0; ~gpanmode=0; ~pitchmode = 0; ~positionmode = 0; ~impulsemode = 0; ~gdurmode=0; ~gpanmode=1; ~channelmode=0;
~btnstate = [];
~btnsA = [];
~btnsB = [];
~btnsC = [];
~btn0val = 0; ~btn1val = 0; ~btn2val = 0; ~btn3val = 0;
~btn4val = 0; ~btn5val = 0; ~btn6val = 0; ~btn7val = 0;
~btn8val = 0; // shift buttons
( // accel gyro quaternion mapping /////////////////// ( // accel gyro quaternion mapping ///////////////////
// msg[1] msg[2] msg[3] X Y Z ==> ROLL, PITCH, YAW // msg[1] msg[2] msg[3] X Y Z ==> ROLL, PITCH, YAW
@ -173,7 +224,7 @@ o = OSCdef(\test, { arg msg, time, addr, recvPort, rlow, rhigh;
~granulator1.set(\pitchmodeindex, ~pitchmode ); ~granulator1.set(\pitchmodeindex, ~pitchmode );
// POSITION ------- Z Yaw // POSITION ------- Z Yaw
~granulator1.set(\sensorposition, msg[2].linlin(-1, 1, 0, 4)); ~granulator1.set(\sensorposition, msg[2].linlin(-1, 1, 0.05, 3.99));
~granulator1.set(\positionmodeindex, ~positionmode ); ~granulator1.set(\positionmodeindex, ~positionmode );
// RATE ------- X (roll [with PAN]) // RATE ------- X (roll [with PAN])
@ -186,6 +237,10 @@ o = OSCdef(\test, { arg msg, time, addr, recvPort, rlow, rhigh;
~granulator1.set(\sensorgpan, msg[2].linlin(-1, 1, -1, 1)); ~granulator1.set(\sensorgpan, msg[2].linlin(-1, 1, -1, 1));
~granulator1.set(\gpanmodeindex, ~gpanmode ); ~granulator1.set(\gpanmodeindex, ~gpanmode );
~granulator1.set(\sensorgpan, msg[2].linlin(-1, 1, -1, 1));
~granulator1.set(\signalChannelIndex, ~channelmode );
//msg.postln; //msg.postln;
}; , '/euler'); }; , '/euler');
@ -195,16 +250,25 @@ o = OSCdef(\test, { arg msg, time, addr, recvPort, rlow, rhigh;
// button press mapping /////////////////////////////// // button press mapping ///////////////////////////////
// ---------------------------------------------------- // ----------------------------------------------------
~btn0val = 0; ~btn1val = 0; ~btn2val = 0; ~btn3val = 0;
~btn4val = 0; ~btn5val = 0; ~btn6val = 0; ~btn7val = 0;
~btn8val = 0; // shift buttons
// send message back to nodejs
m = NetAddr("127.0.0.1", 57120); // loopback m = NetAddr("127.0.0.1", 57100);
m.sendMsg("/chat", "Hello App 1"); m.sendMsg("/xyzc", 1);
m.sendMsg("/xyzc", 0);
p = OSCdef(\keys, { arg msg, time, addr, recvPort; p = OSCdef(\keys, { arg msg, time, addr, recvPort;
~btnsA[~btn2val, ~btn3val];
~btnsB[~btn4val, ~btn5val, ~btn6val, ~btn7val];
~btnsC[~btn5val];
~btnstate = [~btnsA, ~btnsB, ~btnsC];
if (msg[9] == 1 && msg[10] == 1, {~btnstate.postln;});
//msg.println; //msg.println;
// ============================== // ==============================
// BUTTON MAPPING // BUTTON MAPPING
@ -227,7 +291,7 @@ p = OSCdef(\keys, { arg msg, time, addr, recvPort;
0, { r.set(\l, 0); "RECORD LOOPING OFF".postln; }, 0, { r.set(\l, 0); "RECORD LOOPING OFF".postln; },
1, { r.set(\l, 1); "RECORD LOOPING ON".postln; }, 1, { r.set(\l, 1); "RECORD LOOPING ON".postln; },
2, { r.set(\l, 1); "RECORDING ONSET DETECTION ON".postln; }, //todo 2, { r.set(\l, 1); "RECORDING ONSET DETECTION ON".postln; }, //todo
) );
}); });
// BUTTON X ----> OVERDUB RECORDING MODE ON/OFF // BUTTON X ----> OVERDUB RECORDING MODE ON/OFF
@ -242,17 +306,24 @@ p = OSCdef(\keys, { arg msg, time, addr, recvPort;
}, /// SHIFT 0 LOGIC ENDS HERE }, /// SHIFT 0 LOGIC ENDS HERE
{ // SHIFT IN STATE 1 ======================= {
// SHIFT IN STATE 1 =======================
// BUTTON X ----- GRAIN DURATION MODE // BUTTON X ----- GRAIN DURATION MODE
if (msg[15]==1, if (msg[15]==1,
{ {
( ~btn8val = (~btn8val + 1) % 4 ) ; ( ~btn8val = (~btn8val + 1) % 7 ) ;
switch(~btn8val, switch(~btn8val,
0, { ~gdurmode = 0; "DURATION MODE 0".postln; }, 0, { ~gdurmode = 0; ~granulator1.set(\imp, 40); "DURATION MODE 0".postln; },
1, { ~gdurmode = 1; "DURATION MODE 1".postln; }, 1, { ~gdurmode = 1; ~granulator1.set(\imp, 0); "DURATION MODE 1".postln; },
2, { ~gdurmode = 2; "DURATION MODE 2".postln; }, 2, { ~gdurmode = 2; ~granulator1.set(\imp, 20); "DURATION MODE 2".postln; },
3, { ~gdurmode = 3; "DURATION MODE 3".postln; }, 3, { ~gdurmode = 3; ~granulator1.set(\imp, 15); "DURATION MODE 3".postln; },
4, { ~gdurmode = 4; ~granulator1.set(\imp, 10); "DURATION MODE 4".postln; },
5, { ~gdurmode = 5; ~granulator1.set(\imp, 5); "DURATION MODE 5".postln; },
6, { ~gdurmode = 6; ~granulator1.set(\imp, 3); "DURATION MODE 6".postln; },
) )
}); });
@ -270,11 +341,21 @@ p = OSCdef(\keys, { arg msg, time, addr, recvPort;
// BUTTON X ----- GRANULAR PITCH MODE // BUTTON X ----- GRANULAR PITCH MODE
if (msg[14]==1, if (msg[14]==1,
{ {
( ~btn6val = (~btn6val + 1) % 3 ) ; ( ~btn6val = (~btn6val + 1) % 7 ) ;
switch(~btn6val, switch(~btn6val,
0, { ~pitchmode = 0; "PITCH MODE FIXED".postln; }, 0, { ~pitchmode = 0; "PITCH MODE FIXED".postln; },
1, { ~pitchmode = 1; "PITCH MODE RANDOM".postln; }, 1, { ~pitchmode = 1; "PITCH MODE SENSOR".postln; },
2, { ~pitchmode = 2; "PITCH MODE SENSOR".postln; }, 2, { ~pitchmode = 2; ~granulator1.set(\rlow, 0.8); ~granulator1.set(\rhigh, 1.2); "PITCH RANDOM 1".postln; },
3, { ~pitchmode = 2; ~granulator1.set(\rlow, 0); ~granulator1.set(\rhigh, 1.5); "PITCH MODE RANDOM 2".postln; },
4, { ~pitchmode = 2; ~granulator1.set(\rlow, -1.5 ); ~granulator1.set(\rhigh, 0); "PITCH MODE RANDOM 3".postln; },
5, { ~pitchmode = 2; ~granulator1.set(\rlow, -5 ); ~granulator1.set(\rhigh, 5); "PITCH MODE RANDOM 4".postln; },
6, { ~pitchmode = 2; ~granulator1.set(\rlow, -30 ); ~granulator1.set(\rhigh, 30); "PITCH MODE RANDOM 5".postln; },
7, { ~pitchmode = 2; ~granulator1.set(\rlow, -100 ); ~granulator1.set(\rhigh, 100); "PITCH MODE RANDOM 6".postln; },
~granulator1.set(\rhigh, 2);
2, { },
) )
}); });
@ -293,6 +374,7 @@ p = OSCdef(\keys, { arg msg, time, addr, recvPort;
// BUTTON X && X RESET/ZERO SENSORS [in firmware just here for notificaton] // BUTTON X && X RESET/ZERO SENSORS [in firmware just here for notificaton]
if (msg[12] == 1, { " ===== EULER ZEROED! =====".postln }, {}); if (msg[12] == 1, { " ===== EULER ZEROED! =====".postln }, {});
// GTR INPUT ======================= // GTR INPUT =======================
if (msg[11]==1, if (msg[11]==1,
{ {
@ -303,16 +385,13 @@ p = OSCdef(\keys, { arg msg, time, addr, recvPort;
2, { ~gtrIn.set(\in, 1 ); "DRY + REVERB ON".postln; }, 2, { ~gtrIn.set(\in, 1 ); "DRY + REVERB ON".postln; },
) )
}); });
} // SHIFT ONE LOGIC ENDS HERE ================ } // SHIFT ONE LOGIC ENDS HERE ================
); /// closes SHIFT 1 ); /// closes SHIFT 1
} , '/keys'); } , '/keys');
); );
); );
GUI
// ---------------------------------------------------- // ----------------------------------------------------
// ---------------------------------------------------- // ----------------------------------------------------
// PERFORMABLE PARAMETERS ///////////////////////////// // PERFORMABLE PARAMETERS /////////////////////////////
@ -330,18 +409,22 @@ r.set(\overdub, 1); // overdub mode on - MAPPED TO SWITCH 4
r.set(\overdub, 0); // off r.set(\overdub, 0); // off
/// random pitch/rate low and high values /// random pitch/rate low and high values
~granulator1.set(\rlow, 0);
~granulator1.set(\rlow, -1); ~granulator1.set(\rlow, -1);
~granulator1.set(\rhigh, 1); ~granulator1.set(\rlow, 0.2);
~granulator1.set(\rhigh, 2); ~granulator1.set(\rhigh, 2);
~granulator1.set(\rhigh, 1.2);
~impulsemode = 0; // impulse ~impulsemode = 0; // impulse
~impulsemode = 1; // dust ~impulsemode = 1; // dust
~impulsemode = 2; // sensor ~impulsemode = 2; // sensor
~pitchmode = 0; // no transpose ~pitchmode = 0; // no transpose
~pitchmode = 1; // random ~pitchmode = 1; // sensor (pitch) input
~pitchmode = 2; // sensor (pitch) input ~pitchmode = 2; // random2
~pitchmode = 3; // random3
~pitchmode = 4; // random4
~pitchmode = 5; // random5
~pitchmode = 6; //
~positionmode = 0; // middle of sample ~positionmode = 0; // middle of sample
~positionmode = 1; // random position ~positionmode = 1; // random position
@ -350,13 +433,21 @@ r.set(\overdub, 0); // off
~gdurmode = 0 ; // random position ~gdurmode = 0 ; // random position
~gdurmode = 1 ; // random position ~gdurmode = 1 ; // random position
~gdurmode = 2 ; // random position ~gdurmode = 2 ; // random position
~gdurmode = 3 ; // random position
~gdurmode = 4 ; // random position
~gdurmode = 5 ; // random position
~gdurmode = 6 ; // random position
~gpanmode = 0 ; // random position ~gpanmode = 0 ; // random position
~gpanmode = 1 ; // random position ~gpanmode = 1 ; // random position
~gpanmode = 2 ; // random position ~gpanmode = 2 ; // random position
~channelmode = 1;
// set grain impulse rate // set grain impulse rate
~granulator1.set(\imp, 50); ~granulator1.set(\imp, 10);
// fix doneaction // fix doneaction
~granulator1.set(\gate, 1); // granulator on ~granulator1.set(\gate, 1); // granulator on

View File

@ -133,9 +133,21 @@ const scudp = new osc.UDPPort({
scudp.on('open', () => { scudp.on('open', () => {
console.log("UDP to OSC open") console.log("UDP to OSC open")
}) });
// turn on and off osc messages sent to UDP / Supercollider
scudp.on('message', (msg) => {
if (msg.address == "/xyzc"){
if ( msg.args[0] == '1' )
{ console.log("XYZ ON ---- ", msg.args[0]); osconoff = 1; }
else { console.log("XYZ OFF ---- "); console.log("ddddd", msg.args[0]); osconoff = 0 }
}
});
scudp.on('message', (msg) => { scudp.on('message', (msg) => {
console.log('got UDP msg', msg); console.log('got UDP msg', msg);
osclients.forEach( client => { osclients.forEach( client => {
if (client) { if (client) {
@ -144,6 +156,7 @@ scudp.on('message', (msg) => {
} }
}) })
}) })
scudp.on('error', (e) => { scudp.on('error', (e) => {
console.log('UDP OSC error!', e) console.log('UDP OSC error!', e)
}) })
@ -190,11 +203,15 @@ var threshdiff = 4;
var touchvalue = [40,40,40,40,40,40,40,40]; var touchvalue = [40,40,40,40,40,40,40,40];
var touchcount = [0,0,0,0,0,0,0,0]; var touchcount = [0,0,0,0,0,0,0,0];
var osconoff = 0;
const sendAll = (msg, info, oscWS, osclients) => { const sendAll = (msg, info, oscWS, osclients) => {
//if (msg.address == '/XYZcontrols') console.log("XYZ ON ------------------------------------ ", msg[1]);
if (msg.address == '/keys') { if (msg.address == '/keys') {
console.log("TOUCH MSG",msg.args); //console.log("TOUCH MSG",msg.args);
for (let i = 1; i < 8; i++) { for (let i = 1; i < 8; i++) {
touchvalue[i]=msg.args[i]; touchvalue[i]=msg.args[i];
@ -213,8 +230,8 @@ const sendAll = (msg, info, oscWS, osclients) => {
thresholds[i]=Math.round(floatthresholds[i]); thresholds[i]=Math.round(floatthresholds[i]);
} }
} }
console.log("TOUCH FLTHR ",floatthresholds); //console.log("TOUCH FLTHR ",floatthresholds);
console.log("TOUCH THR ",thresholds); //console.log("TOUCH THR ",thresholds);
/* // LOGIC FOR SHIFT BUTTON 0 /* // LOGIC FOR SHIFT BUTTON 0
@ -312,8 +329,9 @@ const sendAll = (msg, info, oscWS, osclients) => {
}) })
if (scudp) { if (scudp) {
console.log("SENDING UDP", msg) if (osconoff == 1)
scudp.send(msg) console.log("SENDING UDP", msg); scudp.send(msg)
//msg.slice(7,15); //msg.slice(7,15);
//scudp.send(msg.slice(7,15)) //scudp.send(msg.slice(7,15))
} }