Preciscena koda, popravljen reset, resetiraj na unmute
parent
b75a05a053
commit
f924d667f7
98
danijela.js
98
danijela.js
|
@ -12,6 +12,7 @@ const midiKanalSenzor = {
|
||||||
3: 22
|
3: 22
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Kanal za hitrost podatkov
|
||||||
const senzorCCKanal = {
|
const senzorCCKanal = {
|
||||||
1: 75,
|
1: 75,
|
||||||
2: 76,
|
2: 76,
|
||||||
|
@ -35,7 +36,8 @@ const DEBUG = {
|
||||||
osc: false
|
osc: false
|
||||||
}
|
}
|
||||||
|
|
||||||
const batMin = 0.09
|
// 0.095—0.133 je razpon baterije
|
||||||
|
const batMin = 0.095
|
||||||
const batMax = 0.133
|
const batMax = 0.133
|
||||||
|
|
||||||
const procentBaterije = baterija => Math.round((baterija - batMin) / (batMax - batMin) * 100)
|
const procentBaterije = baterija => Math.round((baterija - batMin) / (batMax - batMin) * 100)
|
||||||
|
@ -46,6 +48,7 @@ const izhodisceQ = {
|
||||||
2: new Quat(),
|
2: new Quat(),
|
||||||
3: new Quat()
|
3: new Quat()
|
||||||
}
|
}
|
||||||
|
let kalibriraj = true
|
||||||
|
|
||||||
const prejsnjiQ = {
|
const prejsnjiQ = {
|
||||||
1: new Quat(),
|
1: new Quat(),
|
||||||
|
@ -59,22 +62,38 @@ const eulerRotacija = {
|
||||||
3: [0, 0, 0]
|
3: [0, 0, 0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Roll/pitch/yaw rotacija (sredina je 64, sinusoidno se giblje gor in dol)
|
||||||
|
const rotacijaMidi = {
|
||||||
|
1: {
|
||||||
|
r: 0,
|
||||||
|
p: 0,
|
||||||
|
y: 0
|
||||||
|
},
|
||||||
|
2: {
|
||||||
|
r: 0,
|
||||||
|
p: 0,
|
||||||
|
y: 0
|
||||||
|
},
|
||||||
|
3: {
|
||||||
|
r: 0,
|
||||||
|
p: 0,
|
||||||
|
y: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Poslji samo spremembe!
|
||||||
|
const staraRotacijaMidi = JSON.parse(JSON.stringify(rotacijaMidi))
|
||||||
|
|
||||||
|
// Vrednost hitrost podatkov (kako hitro se vrti?)
|
||||||
const senzorCC = {
|
const senzorCC = {
|
||||||
1: 64,
|
1: 64,
|
||||||
2: 64,
|
2: 64,
|
||||||
3: 64
|
3: 64
|
||||||
}
|
}
|
||||||
|
|
||||||
let staroVrtenjeZMidi = {
|
|
||||||
1: 0,
|
|
||||||
2: 0,
|
|
||||||
3: 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const muteMidi = {
|
const muteMidi = {
|
||||||
1: 0,
|
1: false,
|
||||||
2: 0,
|
2: false,
|
||||||
3: 0
|
3: false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stetje prejetih paketov (na sekundo)
|
// Stetje prejetih paketov (na sekundo)
|
||||||
|
@ -89,26 +108,30 @@ mi.openVirtualPort("danijela-midi")
|
||||||
mi.on('message', (deltaTime, msg) => {
|
mi.on('message', (deltaTime, msg) => {
|
||||||
if (msg[0] === midiKanal) {
|
if (msg[0] === midiKanal) {
|
||||||
if (Object.values(senzorCCKanal).includes(msg[1])) {
|
if (Object.values(senzorCCKanal).includes(msg[1])) {
|
||||||
|
// Hitrost podatkov MIDI
|
||||||
const s = Object.values(senzorCCKanal).indexOf(msg[1]) + 1
|
const s = Object.values(senzorCCKanal).indexOf(msg[1]) + 1
|
||||||
if (!muteMidi[s]) {
|
if (!muteMidi[s]) {
|
||||||
senzorCC[s] = msg[2]
|
senzorCC[s] = msg[2]
|
||||||
console.log(`senzor ${s}: ${msg[2]}`)
|
console.log(`senzor ${s}: ${msg[2]}`)
|
||||||
}
|
}
|
||||||
} else if (Object.values(senzorCCMute).includes(msg[1])) {
|
} else if (Object.values(senzorCCMute).includes(msg[1])) {
|
||||||
|
// (Un)Mute kanala MIDI
|
||||||
const s = Object.values(senzorCCMute).indexOf(msg[1]) + 1
|
const s = Object.values(senzorCCMute).indexOf(msg[1]) + 1
|
||||||
if (msg[2]) {
|
if (msg[2]) {
|
||||||
console.log(`senzor UNMUTE ${s}`)
|
console.log(`senzor UNMUTE ${s}`)
|
||||||
muteMidi[s] = false;
|
muteMidi[s] = false;
|
||||||
|
// resetiraj izhodisce quaterniona
|
||||||
|
izhodisceQ[s] = prejsnjiQ[s].mul(izhodisceQ[s])
|
||||||
|
console.log(`senzor KALIBRACIJA ${s}`)
|
||||||
} else {
|
} else {
|
||||||
|
console.log(`senzor MUTE ${s} (${muteMidi[s]})`)
|
||||||
muteMidi[s] = true;
|
muteMidi[s] = true;
|
||||||
console.log(`senzor MUTE ${s}`)
|
|
||||||
}
|
}
|
||||||
} else if (Object.values(senzorCCkalibracija).includes(msg[1])) {
|
} else if (Object.values(senzorCCkalibracija).includes(msg[1])) {
|
||||||
|
// Kalibracija senzorja MIDI (ponastavi izhodisce)
|
||||||
const s = Object.values(senzorCCkalibracija).indexOf(msg[1]) + 1
|
const s = Object.values(senzorCCkalibracija).indexOf(msg[1]) + 1
|
||||||
// resetiraj izhodisce quaterniona
|
// resetiraj izhodisce quaterniona
|
||||||
izhodisceQ[s] = prejsnjiQ[s].conjugate()
|
izhodisceQ[s] = prejsnjiQ[s].mul(izhodisceQ[s])
|
||||||
// nastavi CC vrednost na sredino - 64
|
|
||||||
senzorCC[s] = 64;
|
|
||||||
console.log(`senzor KALIBRACIJA ${s}`)
|
console.log(`senzor KALIBRACIJA ${s}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,34 +231,40 @@ oscWS.on('message', ({ address, args }) => {
|
||||||
//console.log('IDX', index)
|
//console.log('IDX', index)
|
||||||
// Izracunaj spremembo rotacije
|
// Izracunaj spremembo rotacije
|
||||||
const novQ = new Quat({w: args[0], x: args[1], y: args[2], z: args[3]})
|
const novQ = new Quat({w: args[0], x: args[1], y: args[2], z: args[3]})
|
||||||
const novQC = novQ.mul(izhodisceQ[index])
|
|
||||||
|
// Prvi podatek = izhodiscni polozaj
|
||||||
|
if (kalibriraj) {
|
||||||
|
izhodisceQ[index] = novQ
|
||||||
|
kalibriraj = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const novQC = novQ.div(izhodisceQ[index])
|
||||||
const qWd = novQC.div(prejsnjiQ[index])
|
const qWd = novQC.div(prejsnjiQ[index])
|
||||||
prejsnjiQ[index] = novQC;
|
prejsnjiQ[index] = novQC;
|
||||||
|
|
||||||
const eulerD = qWd.toEuler()
|
const eulerD = qWd.toEuler()
|
||||||
//console.log(index, eulerD)
|
//console.log(index, eulerD)
|
||||||
eulerRotacija[index][0] += eulerD.roll * (senzorCC[index] / 64);
|
//eulerRotacija[index][0] += eulerD.roll * (senzorCC[index] / 64)
|
||||||
eulerRotacija[index][1] += eulerD.pitch * (senzorCC[index] / 64);
|
//eulerRotacija[index][1] += eulerD.pitch * (senzorCC[index] / 64)
|
||||||
eulerRotacija[index][2] += eulerD.yaw * (senzorCC[index] / 64);
|
eulerRotacija[index][2] += eulerD.yaw * (senzorCC[index] / 64)
|
||||||
|
|
||||||
const vrtenjeX = Math.abs(Math.sin(eulerRotacija[index][0]));
|
// roll (os vzdolz senzorja)
|
||||||
/*
|
//const rotacijaR = normSin(eulerRotacija[index][0])
|
||||||
posljiMidi(180, 20, Math.round(vrtenjeX * 127));
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Roka dol/gor
|
// Pitch (ce je na ravno iztegnjeni roki, gor/dol)
|
||||||
const vrtenjeY = Math.abs(Math.sin(eulerRotacija[index][1]));
|
//const rotacijaP = normSin(eulerRotacija[index][1])
|
||||||
//posljiMidi(180, 20, Math.round(vrtenjeY * 127));
|
|
||||||
//posljiMidi(181, 20, Math.round(vrtenjeY * 127));
|
|
||||||
|
|
||||||
|
// Yaw (ce je na ravno iztegnjeni roki, vrtenje po osi pokoncnega telesa)
|
||||||
|
const rotacijaY = normSin(eulerRotacija[index][2])
|
||||||
|
|
||||||
const vrtenjeZ = normSin(eulerRotacija[index][2])
|
// Samo yaw trenutno gledamo
|
||||||
const vrtenjeZmidi = Math.round(vrtenjeZ * 127)
|
if (!muteMidi[index]) {
|
||||||
|
rotacijaMidi[index].y = Math.round(rotacijaY * 127)
|
||||||
|
|
||||||
if (vrtenjeZmidi !== staroVrtenjeZMidi[index]
|
if (rotacijaMidi[index].y !== staraRotacijaMidi[index].y) {
|
||||||
&& !muteMidi[index]) {
|
staraRotacijaMidi[index].y = rotacijaMidi[index].y
|
||||||
posljiMidi(182, midiKanalSenzor[index], vrtenjeZmidi)
|
posljiMidi(182, midiKanalSenzor[index], rotacijaMidi[index].y)
|
||||||
staroVrtenjeZMidi[index] = vrtenjeZmidi
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vsako sekundo shranimo stevec
|
// Vsako sekundo shranimo stevec
|
||||||
|
@ -244,11 +273,10 @@ oscWS.on('message', ({ address, args }) => {
|
||||||
cas = Date.now()
|
cas = Date.now()
|
||||||
stPaketovNaSekundo = stPaketov;
|
stPaketovNaSekundo = stPaketov;
|
||||||
stPaketov = 0;
|
stPaketov = 0;
|
||||||
// 0.086 - 0.133 je razpon baterije
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
izpisiStanje(vrtenjeZmidi, baterija, stPaketovNaSekundo)
|
// Izpisi stanje (ce je mute, zadnja vrednost)
|
||||||
|
izpisiStanje(rotacijaMidi[index].y, baterija, stPaketovNaSekundo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue