fix for noise on touch0 lowpass and new threshold logic
parent
980417d6a5
commit
3f595e5750
|
@ -48,6 +48,8 @@ GPIO:
|
||||||
|
|
||||||
momentary switchs
|
momentary switchs
|
||||||
|
|
||||||
|
on diagram (0,1,2,3)
|
||||||
|
|
||||||
4 TOUCH0 - SHIFT KEY
|
4 TOUCH0 - SHIFT KEY
|
||||||
|
|
||||||
0 TOUCH1 - record to buffer 0
|
0 TOUCH1 - record to buffer 0
|
||||||
|
@ -56,7 +58,7 @@ momentary switchs
|
||||||
|
|
||||||
15 TOUCH3
|
15 TOUCH3
|
||||||
|
|
||||||
toggle switchs
|
on diagram (4,5,6,7)
|
||||||
|
|
||||||
13 TOUCH4
|
13 TOUCH4
|
||||||
|
|
||||||
|
|
98
gtr.scd
98
gtr.scd
|
@ -68,7 +68,7 @@ SynthDef("recBuf",{ arg in=0, out=0, bufnum=0, t_trig=0, l=0, overdub=0;
|
||||||
}).add;
|
}).add;
|
||||||
);
|
);
|
||||||
|
|
||||||
// ----------------------------------------------------
|
// ---------~positionmode = 1; -------------------------------------------
|
||||||
( // Granulator --------------------------------------
|
( // Granulator --------------------------------------
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
|
|
||||||
|
@ -81,16 +81,30 @@ SynthDef("recBuf",{ arg in=0, out=0, bufnum=0, t_trig=0, l=0, overdub=0;
|
||||||
SynthDef(\buf_grain, { | out, gate = 1, amp = 1,
|
SynthDef(\buf_grain, { | out, gate = 1, amp = 1,
|
||||||
|
|
||||||
sndbuf, envbuf, pan=0, imp=50,
|
sndbuf, envbuf, pan=0, imp=50,
|
||||||
pitchmodeindex=0, sensorpitch=1,
|
pitchmodeindex=0, sensorpitch=1, sensorgdur=0.1, sensorgpan=0,
|
||||||
positionmodeindex=0, sensorposition=0,
|
positionmodeindex=0, gdurmodeindex=0, gpanmodeindex=0,
|
||||||
impulsemodeindex=0, sensorimpulse=0,
|
sensorposition=0, impulsemodeindex=0, sensorimpulse=0,
|
||||||
rlow= -1, rhigh=1 |
|
rlow= -1, rhigh=1 |
|
||||||
|
|
||||||
var signal, env, freqdev, pos,
|
var signal, env, freqdev, pos,
|
||||||
pitchmode0, pitchmode1, pitch,
|
pitchmode0, pitchmode1, pitch,
|
||||||
|
gdurmode0, gdurmode1, gdur,
|
||||||
|
gpanmode0, gpanmode1, gpan,
|
||||||
positionmode0, positionmode1, position,
|
positionmode0, positionmode1, position,
|
||||||
impulsemode0, impulsemode1, impulse;
|
impulsemode0, impulsemode1, impulse;
|
||||||
|
|
||||||
|
// grain duration mode -untransposed, random, or sensor controlled
|
||||||
|
gdurmode0 = 0.1;
|
||||||
|
gdurmode1 = LFNoise1.kr.range(0.2, 3.3);
|
||||||
|
gdur = Select.kr(gdurmodeindex,
|
||||||
|
[gdurmode0, gdurmode1, sensorgdur]);
|
||||||
|
|
||||||
|
// grain pan mode -untransposed, random, or sensor controlled
|
||||||
|
gpanmode0 = 0.1;
|
||||||
|
gpanmode1 = LFNoise1.kr.range(0.1, 10.3);
|
||||||
|
gpan = Select.kr(gpanmodeindex,
|
||||||
|
[gpanmode0, gpanmode1, sensorgpan]);
|
||||||
|
|
||||||
// grain pitch mode -untransposed, random, or sensor controlled
|
// grain pitch mode -untransposed, random, or sensor controlled
|
||||||
pitchmode0 = 1;
|
pitchmode0 = 1;
|
||||||
pitchmode1 = LFNoise1.kr.range(rlow, rhigh);
|
pitchmode1 = LFNoise1.kr.range(rlow, rhigh);
|
||||||
|
@ -113,7 +127,7 @@ SynthDef(\buf_grain, { | out, gate = 1, amp = 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
|
||||||
0.1, sndbuf, pitch, position, 2, pan, 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
|
||||||
);
|
);
|
||||||
|
@ -142,8 +156,7 @@ 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 = 2; ~impulsemode = 0; ~gdurmode=0; ~gpanmode=0;
|
||||||
~pitchmode = 0; ~positionmode = 2; ~impulsemode = 0;
|
|
||||||
|
|
||||||
( // 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
|
||||||
|
@ -152,6 +165,7 @@ o = OSCdef(\test, { arg msg, time, addr, recvPort, rlow, rhigh;
|
||||||
|
|
||||||
// PAN ------- X Roll
|
// PAN ------- X Roll
|
||||||
~granulator1.set(\pan, msg[1].linlin(-0.3, 0.3, -1, 1));
|
~granulator1.set(\pan, msg[1].linlin(-0.3, 0.3, -1, 1));
|
||||||
|
~granulator1.set(\panmodeindex, ~panmode );
|
||||||
|
|
||||||
// PITCH ------- Y Pitch
|
// PITCH ------- Y Pitch
|
||||||
~granulator1.set(\sensorpitch, msg[3].linlin(-1, 1, 0, 4));
|
~granulator1.set(\sensorpitch, msg[3].linlin(-1, 1, 0, 4));
|
||||||
|
@ -164,6 +178,13 @@ o = OSCdef(\test, { arg msg, time, addr, recvPort, rlow, rhigh;
|
||||||
// RATE ------- X (roll [with PAN])
|
// RATE ------- X (roll [with PAN])
|
||||||
~granulator1.set(\sensorimpulse, msg[2].linlin(-1, 1, 5, 50));
|
~granulator1.set(\sensorimpulse, msg[2].linlin(-1, 1, 5, 50));
|
||||||
~granulator1.set(\impulsemodeindex, ~impulsemode );
|
~granulator1.set(\impulsemodeindex, ~impulsemode );
|
||||||
|
|
||||||
|
~granulator1.set(\sensorgdur, msg[2].linlin(-1, 1, 0.1, 1));
|
||||||
|
~granulator1.set(\gdurmodeindex, ~gdurmode );
|
||||||
|
|
||||||
|
~granulator1.set(\sensorgpan, msg[2].linlin(-1, 1, -1, 1));
|
||||||
|
~granulator1.set(\gpanmodeindex, ~gpanmode );
|
||||||
|
|
||||||
//msg.postln;
|
//msg.postln;
|
||||||
|
|
||||||
}; , '/euler');
|
}; , '/euler');
|
||||||
|
@ -173,26 +194,35 @@ o = OSCdef(\test, { arg msg, time, addr, recvPort, rlow, rhigh;
|
||||||
// button press mapping ///////////////////////////////
|
// button press mapping ///////////////////////////////
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
|
|
||||||
p = OSCdef(\keys, { arg msg, time, addr, recvPort;
|
~btn2val = 0;
|
||||||
|
|
||||||
|
p = OSCdef(\keys, { arg msg, time, addr, recvPort;
|
||||||
|
//msg.println;
|
||||||
// ==============================
|
// ==============================
|
||||||
// BUTTON MAPPING
|
// BUTTON MAPPING
|
||||||
// ==============================
|
// ==============================
|
||||||
|
|
||||||
// BUTTON X && X RESET/ZERO SENSORS [in firmware]
|
|
||||||
|
|
||||||
if (msg[9] == 1 && msg[10] == 1,
|
|
||||||
{ " ===== EULER ZEROED! =====".postln },
|
|
||||||
{});
|
|
||||||
|
|
||||||
// TRIGGER BUTTONS (3) ------------------------------
|
// TRIGGER BUTTONS (3) ------------------------------
|
||||||
|
|
||||||
// BUTTON X ----- TRIGGER ONESHOT BUFFER RECORD
|
// if SHIFT key is 0:
|
||||||
|
if (msg[9] == 0, {
|
||||||
|
|
||||||
|
// BUTTON X ----- TRIGGER ONESHOT BUFFER RECORD
|
||||||
if (msg[10] == 1, { r.set( \in, 0, \l, 0, \t_trig, 1);
|
if (msg[10] == 1, { r.set( \in, 0, \l, 0, \t_trig, 1);
|
||||||
" /////////// SAMPLING!".postln }, {});
|
" /////////// SAMPLING!".postln }, {});
|
||||||
|
|
||||||
~btn2val;
|
|
||||||
|
|
||||||
|
if (msg[16]==1,
|
||||||
|
{
|
||||||
|
( ~btn2val = (~btn2val + 1) % 3 ) ;
|
||||||
|
|
||||||
|
switch(~btn2val,
|
||||||
|
0, { ~positionmode = 0; "TEST MODE FIXED".postln; },
|
||||||
|
1, { ~positionmode = 1; "POSITION MODE RANDOM".postln; },
|
||||||
|
2, { ~positionmode = 2; "POSITION MODE SENSOR".postln; },
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
// BUTTON X ----- GRANULAR POSITION MODE
|
// BUTTON X ----- GRANULAR POSITION MODE
|
||||||
|
|
||||||
|
@ -201,15 +231,15 @@ p = OSCdef(\keys, { arg msg, time, addr, recvPort;
|
||||||
( ~btn2val = (~btn2val + 1) % 3 ) ;
|
( ~btn2val = (~btn2val + 1) % 3 ) ;
|
||||||
|
|
||||||
switch(~btn2val,
|
switch(~btn2val,
|
||||||
0, { ~granulator1.set(\positionmodeindex, 0 ); "POSITION MODE FIXED".postln; },
|
0, { ~positionmode = 0; "POSITION MODE FIXED".postln; },
|
||||||
1, { ~granulator1.set(\positionmodeindex, 1 ); "POSITION MODE RANDOM".postln; },
|
1, { ~positionmode = 1; "POSITION MODE RANDOM".postln; },
|
||||||
2, { ~granulator1.set(\positionmodeindex, 2 ); "POSITION MODE SENSOR".postln; },
|
2, { ~positionmode = 2; "POSITION MODE SENSOR".postln; },
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
// BUTTON X ----- GRANULAR PITCH MODE
|
// BUTTON X ----- GRANULAR PITCH MODE
|
||||||
|
|
||||||
if (msg[12]==1,
|
if (msg[15]==1,
|
||||||
{
|
{
|
||||||
( ~btn2val = (~btn2val + 1) % 3 ) ;
|
( ~btn2val = (~btn2val + 1) % 3 ) ;
|
||||||
|
|
||||||
|
@ -237,6 +267,7 @@ p = OSCdef(\keys, { arg msg, time, addr, recvPort;
|
||||||
|
|
||||||
// BUTTON X ----> LOOP RECORDING MODE ON/OFF
|
// BUTTON X ----> LOOP RECORDING MODE ON/OFF
|
||||||
|
|
||||||
|
|
||||||
if (msg[13]==1,
|
if (msg[13]==1,
|
||||||
{
|
{
|
||||||
( ~btn2val = (~btn2val + 1) % 2 ) ;
|
( ~btn2val = (~btn2val + 1) % 2 ) ;
|
||||||
|
@ -261,6 +292,21 @@ p = OSCdef(\keys, { arg msg, time, addr, recvPort;
|
||||||
};
|
};
|
||||||
);
|
);
|
||||||
|
|
||||||
|
}, /// SHIFT 0 LOGIC ENDS HERE
|
||||||
|
|
||||||
|
{ // SHIFT IN STATE 1 =======================
|
||||||
|
|
||||||
|
// BUTTON X && X RESET/ZERO SENSORS [in firmware]
|
||||||
|
|
||||||
|
if (msg[11] == 1,
|
||||||
|
{ " ===== EULER ZEROED! =====".postln },
|
||||||
|
{});
|
||||||
|
|
||||||
|
|
||||||
|
} // SHIFT ONE LOGIC ENDS HERE ================
|
||||||
|
|
||||||
|
); /// closes SHIFT 1
|
||||||
|
|
||||||
} , '/keys');
|
} , '/keys');
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -284,9 +330,9 @@ 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, 0);
|
||||||
~granulator1.set(\rlow, -10);
|
~granulator1.set(\rlow, -1);
|
||||||
~granulator1.set(\rhigh, 1);
|
~granulator1.set(\rhigh, 1);
|
||||||
~granulator1.set(\rhigh, 10);
|
~granulator1.set(\rhigh, 3);
|
||||||
|
|
||||||
~impulsemode = 0; // impulse
|
~impulsemode = 0; // impulse
|
||||||
~impulsemode = 1; // dust
|
~impulsemode = 1; // dust
|
||||||
|
@ -300,6 +346,14 @@ r.set(\overdub, 0); // off
|
||||||
~positionmode = 1; // random position
|
~positionmode = 1; // random position
|
||||||
~positionmode = 2; // sensor (position) input
|
~positionmode = 2; // sensor (position) input
|
||||||
|
|
||||||
|
~gdurmode = 0 ; // random position
|
||||||
|
~gdurmode = 1 ; // random position
|
||||||
|
~gdurmode = 2 ; // random position
|
||||||
|
|
||||||
|
~gpanmode = 0 ; // random position
|
||||||
|
~gpanmode = 1 ; // random position
|
||||||
|
~gpanmode = 2 ; // random position
|
||||||
|
|
||||||
// set grain impulse rate
|
// set grain impulse rate
|
||||||
~granulator1.set(\imp, 50);
|
~granulator1.set(\imp, 50);
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,11 @@ float GyX, GyY, GyZ;
|
||||||
|
|
||||||
// Keys
|
// Keys
|
||||||
//byte keys[] = {16, 17, 5, 18};
|
//byte keys[] = {16, 17, 5, 18};
|
||||||
|
|
||||||
|
// noise on
|
||||||
byte keys[] = {4, 0, 2, 15, 13, 14, 12, 27}; // TOUCH0 - TOUCH7
|
byte keys[] = {4, 0, 2, 15, 13, 14, 12, 27}; // TOUCH0 - TOUCH7
|
||||||
|
//byte keys[] = {33, 0, 2, 15, 13, 14, 12, 27}; // TOUCH8, TOUCH1 - TOUCH7
|
||||||
|
|
||||||
|
|
||||||
byte pressed[] = {0, 0, 0, 0, 0, 0, 0, 0};
|
byte pressed[] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
byte KEYLEN = 8;
|
byte KEYLEN = 8;
|
||||||
|
|
|
@ -35,8 +35,8 @@ const DEBUG = true
|
||||||
// Odprti serijski OSC link
|
// Odprti serijski OSC link
|
||||||
let scon = null
|
let scon = null
|
||||||
|
|
||||||
let buttonHeld = [false, false, false, false]
|
let buttonHeld = [false, false, false, false, false, false, false, false]
|
||||||
let buttonValue = [false, false, false, false]
|
let buttonValue = [false, false, false, false, false, false, false, false]
|
||||||
|
|
||||||
let switchHeld = [false, false, false, false]
|
let switchHeld = [false, false, false, false]
|
||||||
let switchValue = [false, false, false, false]
|
let switchValue = [false, false, false, false]
|
||||||
|
@ -183,63 +183,86 @@ function eulerFromQuaternion(quaternion) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var threshold = 20;
|
var threshold = 15;
|
||||||
|
var thresholds = [15,15,15,15,15,15,15,15];
|
||||||
|
var floatthresholds = [15,15,15,15,15,15,15,15];
|
||||||
|
var threshdiff = 4;
|
||||||
|
var touchvalue = [40,40,40,40,40,40,40,40];
|
||||||
|
var touchcount = [0,0,0,0,0,0,0,0];
|
||||||
|
|
||||||
const sendAll = (msg, info, oscWS, osclients) => {
|
const sendAll = (msg, info, oscWS, osclients) => {
|
||||||
|
|
||||||
if (msg.address == '/keys') {
|
if (msg.address == '/keys') {
|
||||||
// keys 0 + 3 = euler reset
|
|
||||||
if (msg.args[0] <= threshold && msg.args[3] <= threshold ) {
|
console.log("TOUCH MSG",msg.args);
|
||||||
eulerRotation = [0, 0, 0];
|
|
||||||
console.log("EULER ROTATION RESET");
|
for (let i = 1; i < 8; i++) {
|
||||||
|
touchvalue[i]=msg.args[i];
|
||||||
|
}
|
||||||
|
touchvalue[0]=msg.args[0];
|
||||||
|
// LOW PASS FILTER BUTTON 0
|
||||||
|
// touchvalue[0]=touchvalue[0]*0.95+msg.args[0]*0.05;
|
||||||
|
//console.log("TOUCH VAL",touchvalue);
|
||||||
|
|
||||||
|
// SELF-CALIBRATING TOUCH THRESHOLDS
|
||||||
|
for (let i = 0; i < 8; i++) {
|
||||||
|
if (floatthresholds[i]==15) thresholds[i]=floatthresholds[i]=msg.args[i]-threshdiff;
|
||||||
|
|
||||||
|
if (msg.args[i]>(thresholds[i]+(threshdiff/2))) {
|
||||||
|
floatthresholds[i]=0.99 * floatthresholds[i] + 0.01*(msg.args[i]-threshdiff);
|
||||||
|
thresholds[i]=Math.round(floatthresholds[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
console.log("TOUCH FLTHR ",floatthresholds);
|
||||||
var waiting = false;
|
console.log("TOUCH THR ",thresholds);
|
||||||
|
|
||||||
function waitFalse() {
|
|
||||||
waiting = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function wait4Second() {
|
/* // LOGIC FOR SHIFT BUTTON 0
|
||||||
waiting = true;
|
|
||||||
setTimeout(waitFalse, 1000);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// LOGIC FOR SHIFT BUTTON 0
|
|
||||||
for (let i = 0; i < 1; i++) {
|
for (let i = 0; i < 1; i++) {
|
||||||
// momentary state between 0 and 1
|
// momentary state between 0 and 1
|
||||||
if (msg.address == '/keys') {
|
if (msg.args[i] <= thresholds[i] ) {
|
||||||
if (msg.args[i] <= threshold ) {
|
|
||||||
buttonValue[i] = 1;
|
buttonValue[i] = 1;
|
||||||
} else {
|
} else {
|
||||||
buttonValue[i] = 0;
|
buttonValue[i] = 0;
|
||||||
}
|
}
|
||||||
msg.args.push(buttonValue[i] ? 1 : 0)
|
msg.args.push(buttonValue[i])
|
||||||
}
|
}
|
||||||
}
|
*/
|
||||||
|
|
||||||
// LOGIC FOR MOMENTARY BUTTONS (1 - 3)
|
// LOGIC FOR MOMENTARY BUTTONS (1 - 3)
|
||||||
for (let i = 1; i < 8; i++) {
|
for (let i = 0; i < 8; i++) {
|
||||||
// momentary state between 0 and 1
|
// momentary state between 0 and 1
|
||||||
if (msg.address == '/keys') {
|
|
||||||
buttonValue[i] = 0;
|
buttonValue[i] = 0;
|
||||||
if (msg.args[i] <= threshold ) {
|
if (touchvalue[i] <= thresholds[i] ) {
|
||||||
if (buttonHeld[i] == false) {
|
if (buttonHeld[i] == false) {
|
||||||
|
if (i!=0 || touchcount[i]) {
|
||||||
buttonHeld[i] = true
|
buttonHeld[i] = true
|
||||||
buttonValue[i] = 1;
|
buttonValue[i] = 1;
|
||||||
|
console.log("TOUCH PRESS ",i,touchvalue[i],msg.args[i],thresholds[i],floatthresholds[i]);
|
||||||
}
|
}
|
||||||
} else if (msg.args[i] >= threshold+5) {
|
}
|
||||||
|
touchcount[i]++;
|
||||||
|
} else if (touchvalue[i] > thresholds[i]+(threshdiff/2)) {
|
||||||
|
if (buttonHeld[i]) console.log("TOUCH PRESS RELEASE ",i,touchvalue[i],msg.args[i],thresholds[i],floatthresholds[i],touchcount[i]);
|
||||||
buttonHeld[i] = false;
|
buttonHeld[i] = false;
|
||||||
|
touchcount[i]=0;
|
||||||
}
|
}
|
||||||
msg.args.push(buttonValue[i] ? 1 : 0)
|
|
||||||
|
//0 IS SHIFT KEY, SENDS 1 ALL TIME WHEN HELD
|
||||||
|
if (i==0 && buttonHeld[0]) buttonValue[0]=1;
|
||||||
|
|
||||||
|
msg.args.push(buttonValue[i])
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// keys 0 + 3 = euler reset
|
||||||
|
if (buttonHeld[0] && buttonHeld[3]) {
|
||||||
|
eulerRotation = [0, 0, 0];
|
||||||
|
console.log("EULER ROTATION RESET");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// LOGIC FOR TOGGLE SWITCHES (4-7)
|
// LOGIC FOR TOGGLE SWITCHES (4-7)
|
||||||
|
|
||||||
// for (let i = 4; i < 8; i++) {
|
// for (let i = 4; i < 8; i++) {
|
||||||
|
@ -261,6 +284,8 @@ const sendAll = (msg, info, oscWS, osclients) => {
|
||||||
// }
|
// }
|
||||||
//------------------------------------------------
|
//------------------------------------------------
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Convert quaternion diff to euler angle diff
|
// Convert quaternion diff to euler angle diff
|
||||||
if (msg.address == '/quaternionDiff') {
|
if (msg.address == '/quaternionDiff') {
|
||||||
const euler = eulerFromQuaternion(msg.args, 'XYZ');
|
const euler = eulerFromQuaternion(msg.args, 'XYZ');
|
||||||
|
|
Loading…
Reference in New Issue