diff --git a/monitor.sh b/monitor.sh index f19b9b5..b1ce119 100755 --- a/monitor.sh +++ b/monitor.sh @@ -3,5 +3,6 @@ source .venv/bin/activate port=${1:-/dev/ttyACM0} +rate=${2:-230400} -pio device monitor -b 115200 -p "$port" +pio device monitor -b "$rate" -p "$port" diff --git a/src/calibration.cpp b/src/calibration.cpp index e32b4f3..1d6bce0 100644 --- a/src/calibration.cpp +++ b/src/calibration.cpp @@ -39,12 +39,10 @@ // id, address Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28); -/**************************************************************************/ -/* - Displays some basic information on this sensor from the unified - sensor API sensor_t type (see Adafruit_Sensor for more information) - */ -/**************************************************************************/ +/************************************************************************ + * Displays some basic information on this sensor from the unified * + * sensor API sensor_t type (see Adafruit_Sensor for more information) * + ***********************************************************************/ void displaySensorDetails(void) { sensor_t sensor; @@ -61,13 +59,10 @@ void displaySensorDetails(void) delay(500); } -/**************************************************************************/ -/* - Display some basic info about the sensor status - */ -/**************************************************************************/ -void displaySensorStatus(void) -{ +/**************************************************** + * Display some basic info about the sensor status * + ***************************************************/ +void displaySensorStatus(void) { /* Get the system status values (mostly for debugging purposes) */ uint8_t system_status, self_test_results, system_error; system_status = self_test_results = system_error = 0; @@ -85,13 +80,10 @@ void displaySensorStatus(void) delay(500); } -/**************************************************************************/ -/* - Display sensor calibration status - */ -/**************************************************************************/ -void displayCalStatus(void) -{ +/************************************* + * Display sensor calibration status * + *************************************/ +void displayCalStatus(void) { /* Get the four calibration values (0..3) */ /* Any sensor data reporting 0 should be ignored, */ /* 3 means 'fully calibrated" */ @@ -101,9 +93,8 @@ void displayCalStatus(void) /* The data should be ignored until the system calibration is > 0 */ Serial.print("\t"); - if (!system) - { - Serial.print("! "); + if (!system) { + Serial.print("! "); } /* Display the individual values */ @@ -155,140 +146,53 @@ void displaySensorOffsets(const adafruit_bno055_offsets_t &calibData) int eeprom_size; -void setup(void) -{ - Serial.begin(115200); - delay(8000); - Serial.println("Orientation Sensor Test"); Serial.println(""); +void setup(void) { + Serial.begin(115200); + delay(8000); + Serial.println("Orientation Sensor Test"); Serial.println(""); - /* Initialise the sensor */ - if (!bno.begin()) - { - /* There was a problem detecting the BNO055 ... check your connections */ - Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!"); - while (1); - } + /* Initialise the sensor */ + if (!bno.begin()) { + /* There was a problem detecting the BNO055 ... check your connections */ + Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!"); + while (1); + } - // EEPROM init - eeprom_size = sizeof(long) + sizeof(adafruit_bno055_offsets_t); - EEPROM.begin(eeprom_size); + // EEPROM init + eeprom_size = sizeof(adafruit_bno055_offsets_t); + EEPROM.begin(eeprom_size); - Serial.print("EEPROM init (len "); - Serial.print(EEPROM.length()); - Serial.println(")\n"); + Serial.print("EEPROM init (len "); + Serial.print(EEPROM.length()); + Serial.println(")\n"); - int eeAddress = 0; - long bnoID; - bool foundCalib = false; + adafruit_bno055_offsets_t calibrationData; + sensor_t sensor; - EEPROM.get(eeAddress, bnoID); + bno.getSensor(&sensor); + EEPROM.get(0, calibrationData); - adafruit_bno055_offsets_t calibrationData; - sensor_t sensor; + Serial.println("\n\nCalibration data in EEPROM"); + displaySensorOffsets(calibrationData); - /* - * Look for the sensor's unique ID at the beginning oF EEPROM. - * This isn't foolproof, but it's better than nothing. - */ - bno.getSensor(&sensor); - if (bnoID != sensor.sensor_id) - { - Serial.println("\nNo Calibration Data for this sensor exists in EEPROM"); - delay(500); - } - else - { - Serial.println("\nFound Calibration for this sensor in EEPROM."); - eeAddress += sizeof(long); - EEPROM.get(eeAddress, calibrationData); + delay(1000); - displaySensorOffsets(calibrationData); + /* Display some basic information on this sensor */ + displaySensorDetails(); - Serial.println("\n\nRestoring Calibration data to the BNO055..."); - bno.setSensorOffsets(calibrationData); + /* Optional: Display current status */ + displaySensorStatus(); - Serial.println("\n\nCalibration data loaded into BNO055"); - foundCalib = true; - } + /* Crystal must be configured AFTER loading calibration data into BNO055. */ + bno.setExtCrystalUse(true); - delay(1000); + sensors_event_t event; + bno.getEvent(&event); - /* Display some basic information on this sensor */ - displaySensorDetails(); - - /* Optional: Display current status */ - displaySensorStatus(); - - /* Crystal must be configured AFTER loading calibration data into BNO055. */ - bno.setExtCrystalUse(true); - - sensors_event_t event; - bno.getEvent(&event); - /* always recal the mag as It goes out of calibration very often */ - if (foundCalib){ - Serial.println("Move sensor slightly to calibrate magnetometers"); - while (!bno.isFullyCalibrated()) - { - bno.getEvent(&event); - delay(BNO055_SAMPLERATE_DELAY_MS); - } - } - else - { - Serial.println("Please Calibrate Sensor: "); - while (!bno.isFullyCalibrated()) - { - bno.getEvent(&event); - - Serial.print("X: "); - Serial.print(event.orientation.x, 4); - Serial.print("\tY: "); - Serial.print(event.orientation.y, 4); - Serial.print("\tZ: "); - Serial.print(event.orientation.z, 4); - - /* Optional: Display calibration status */ - displayCalStatus(); - - /* New line for the next sample */ - Serial.println(""); - - /* Wait the specified delay before requesting new data */ - delay(BNO055_SAMPLERATE_DELAY_MS); - } - } - - Serial.println("\nFully calibrated!"); - Serial.println("--------------------------------"); - Serial.println("Calibration Results: "); - adafruit_bno055_offsets_t newCalib; - bno.getSensorOffsets(newCalib); - displaySensorOffsets(newCalib); - - Serial.println("\n\nStoring calibration data to EEPROM..."); - - eeAddress = 0; - bno.getSensor(&sensor); - bnoID = sensor.sensor_id; - - EEPROM.put(eeAddress, bnoID); - - eeAddress += sizeof(long); - EEPROM.put(eeAddress, newCalib); - EEPROM.commit(); - Serial.println("Data stored to EEPROM."); - - Serial.println("\n--------------------------------\n"); - delay(500); - while (1) {}; -} - -void loop() { - /* Get a new sensor event */ - sensors_event_t event; + Serial.println("Please Calibrate Sensor: "); + while (!bno.isFullyCalibrated()) { bno.getEvent(&event); - /* Display the floating point data */ Serial.print("X: "); Serial.print(event.orientation.x, 4); Serial.print("\tY: "); @@ -299,12 +203,53 @@ void loop() { /* Optional: Display calibration status */ displayCalStatus(); - /* Optional: Display sensor status (debug only) */ - //displaySensorStatus(); - /* New line for the next sample */ Serial.println(""); - /* Wait the specified delay before requesting new data */ - delay(BNO055_SAMPLERATE_DELAY_MS); + /* Wait the specified delay before requesting new data */ + delay(BNO055_SAMPLERATE_DELAY_MS); + } + + Serial.println("\nFully calibrated!"); + Serial.println("--------------------------------"); + Serial.println("Calibration Results: "); + adafruit_bno055_offsets_t newCalib; + bno.getSensorOffsets(newCalib); + displaySensorOffsets(newCalib); + + Serial.println("\n\nStoring calibration data to EEPROM..."); + + EEPROM.put(0, newCalib); + EEPROM.commit(); + Serial.println("Data stored to EEPROM."); + + Serial.println("\n--------------------------------\n"); + delay(500); + while (1) {}; +} + +void loop() { + /* Get a new sensor event */ + sensors_event_t event; + bno.getEvent(&event); + + /* Display the floating point data */ + Serial.print("X: "); + Serial.print(event.orientation.x, 4); + Serial.print("\tY: "); + Serial.print(event.orientation.y, 4); + Serial.print("\tZ: "); + Serial.print(event.orientation.z, 4); + + /* Optional: Display calibration status */ + displayCalStatus(); + + /* Optional: Display sensor status (debug only) */ + //displaySensorStatus(); + + /* New line for the next sample */ + Serial.println(""); + + /* Wait the specified delay before requesting new data */ + delay(BNO055_SAMPLERATE_DELAY_MS); } diff --git a/src/main.cpp b/src/main.cpp index 18b9500..275abe3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,7 +4,7 @@ #include // ID senzorja mora bit unikaten! (se poslje poleg parametrov) -#define SENSOR_ID 6 +#define SENSOR_ID 7 // Stanje baterije #define BATTERY_PIN 2 @@ -17,7 +17,7 @@ #define LED_PIN 17 // debagiranje! -//#define DEBUG +#define DEBUG // I²C pins #define SDA_PIN 8 @@ -34,8 +34,15 @@ #include #include +// MAC naslov laptopa (linux sprejemnik) +//uint8_t sprejemnikMac[] = { 0x9c, 0xb6, 0xd0, 0xc4, 0xe8, 0xb9 }; // MAC naslov sprejemnika uint8_t sprejemnikMac[] = { 0x08, 0x3A, 0xF2, 0x50, 0xEF, 0x6C }; +// MAC naslov sprejemnika2: 08:3A:F2:50:EF:6D +//uint8_t sprejemnikMac[] = {0x08, 0x3A, 0xF2, 0x50, 0xEF, 0x6D}; + +// wifi kanal +#define KANAL 1 // Comp sensor_msg odcitek; @@ -48,12 +55,11 @@ sensor_t ensor; imu::Quaternion quat; imu::Vector<3> linearAccel; -int cas = 0; +unsigned long cas_bat = 0; +unsigned long cas_uspeh = 0; // EEPROM za kalibracijo int eeprom_size; -/* Set the delay between fresh samples (calibration) */ -#define BNO055_SAMPLERATE_DELAY_MS (100) void error_blink() { while(1) { @@ -65,6 +71,9 @@ void error_blink() { } void setup() { + // Nizja CPU frekvenca - je dovolj (za stevilo wifi paketov - ~100 na sekundo)! + //setCpuFrequencyMhz(160); + // Basic(debug) serial init Serial.begin(115200); // set this as high as you can reliably run on your platform Serial.println("Starting up..."); @@ -76,26 +85,34 @@ void setup() { // Init - 3 one second blinks pinMode(LED_PIN, OUTPUT); for (int i = 0; i < 3; i++) { +#ifdef DEBUG Serial.println(i + 1); +#endif digitalWrite(LED_PIN, LOW); delay(500); digitalWrite(LED_PIN, HIGH); delay(500); } + digitalWrite(LED_PIN, LOW); + // WIFI init WiFi.mode(WIFI_STA); if (esp_now_init() != ESP_OK) { +#ifdef DEBUG Serial.println("Error initializing ESP-NOW"); +#endif error_blink(); } memcpy(peerInfo.peer_addr, sprejemnikMac, 6); - peerInfo.channel = 0; + peerInfo.channel = KANAL; peerInfo.encrypt = false; if (esp_now_add_peer(&peerInfo) != ESP_OK){ +#ifdef DEBUG Serial.println("WIFI registracija ni uspela"); +#endif error_blink(); } @@ -103,23 +120,20 @@ void setup() { if (!bno.begin(OPERATION_MODE_NDOF)) { /* There was a problem detecting the BNO055 ... check your connections */ +#ifdef DEBUG Serial.println("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!"); +#endif error_blink(); } // EEPROM init eeprom_size = sizeof(long) + sizeof(adafruit_bno055_offsets_t); EEPROM.begin(eeprom_size); +#ifdef DEBUG Serial.print("EEPROM init (len "); Serial.print(EEPROM.length()); Serial.println(")\n"); - - // Fetch calibration - int eeAddress = 0; - long bnoID; - bool foundCalib = false; - - EEPROM.get(eeAddress, bnoID); +#endif adafruit_bno055_offsets_t calibrationData; sensor_t sensor; @@ -129,25 +143,23 @@ void setup() { * This isn't foolproof, but it's better than nothing. */ bno.getSensor(&sensor); - if (bnoID != sensor.sensor_id) { - Serial.println("\nNo Calibration Data for this sensor exists in EEPROM"); - delay(500); - } else { - Serial.println("\nFound Calibration for this sensor in EEPROM."); - eeAddress += sizeof(long); - EEPROM.get(eeAddress, calibrationData); + EEPROM.get(0, calibrationData); - Serial.println("\n\nRestoring Calibration data to the BNO055..."); - bno.setSensorOffsets(calibrationData); +#ifdef DEBUG + Serial.println("\n\nRestoring Calibration data to the BNO055..."); +#endif + bno.setSensorOffsets(calibrationData); - Serial.println("\n\nCalibration data loaded into BNO055"); - } +#ifdef DEBUG + Serial.println("\n\nCalibration data loaded into BNO055"); +#endif delay(1000); /* Use external crystal for better accuracy? */ /* Crystal must be configured AFTER loading calibration data into BNO055. */ bno.setExtCrystalUse(true); + //bno.setExtCrystalUse(false); delay(1000); @@ -155,16 +167,22 @@ void setup() { bno.getEvent(&event); /* always recal the mag as It goes out of calibration very often */ - if (foundCalib){ - Serial.println("Move sensor slightly to calibrate magnetometers"); - while (!bno.isFullyCalibrated()) { - bno.getEvent(&event); - delay(BNO055_SAMPLERATE_DELAY_MS); - } + /* + while (!bno.isFullyCalibrated()) { + bno.getEvent(&event); + delay(100); +#ifdef DEBUG + Serial.println("Calibrating..."); +#endif } delay(1000); +#ifdef DEBUG + Serial.println("Calibrated!"); +#endif + */ + /* Change mode to sensor fusion */ bno.setMode(OPERATION_MODE_NDOF); @@ -177,22 +195,39 @@ void setup() { odcitek.id = SENSOR_ID; // Initial time - cas = millis(); + cas_bat = millis(); } // Read battery (from example T7 sketch) -uint32_t readADC_Cal(int ADC_Raw) -{ - esp_adc_cal_characteristics_t adc_chars; +uint32_t readADC_Cal(int ADC_Raw) { + esp_adc_cal_characteristics_t adc_chars; - esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars); - return (esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars)); + esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars); + return (esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars)); } void loop() { - /* Get a new sensor event */ - //sensors_event_t event; - //bno.getEvent(&event); + // Get linear acceleration (3 * 2bytes) + linearAccel = bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL); + if (abs(linearAccel.x()) > abs(odcitek.aX)) { + odcitek.aX = linearAccel.x(); + } + if (abs(linearAccel.y()) > abs(odcitek.aY)) { + odcitek.aY = linearAccel.y(); + } + if (abs(linearAccel.z()) > abs(odcitek.aZ)) { + odcitek.aZ = linearAccel.z(); + } + + // Najvec 1 na sekundo + if ((millis() - cas_uspeh) < 9) { + delay(1); +#ifdef DEBUG + Serial.println("preskocim.."); +#endif + + return; + } // Get quat (fusion mode); 4 * 2bytes quat = bno.getQuat(); @@ -201,7 +236,7 @@ void loop() { odcitek.qZ = quat.z(); odcitek.qW = quat.w(); - #ifdef DEBUG +#ifdef DEBUG Serial.print(F("Quat: ")); Serial.print((float)odcitek.qX); Serial.print(F(" ")); @@ -211,24 +246,9 @@ void loop() { Serial.print(F(" ")); Serial.print((float)odcitek.qW); Serial.println(""); - #endif +#endif - - - // Each second, read the battery - // @TODO use something more precise, like https://github.com/rlogiacco/BatterySense ? - if (millis() - cas > 1000) { - cas = millis(); - odcitek.bat = (float) (readADC_Cal(analogRead(BATTERY_PIN)) * 2) / 1000; - } - - // Get linear acceleration (3 * 2bytes) - linearAccel = bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL); - odcitek.aX = linearAccel.x(); - odcitek.aY = linearAccel.y(); - odcitek.aZ = linearAccel.z(); - - #ifdef DEBUG +#ifdef DEBUG Serial.print(F("Linear acceleration: ")); Serial.print((float)odcitek.aX); Serial.print(F(" ")); @@ -236,17 +256,31 @@ void loop() { Serial.print(F(" ")); Serial.print((float)odcitek.aZ); Serial.println(""); - #endif +#endif + // Each second, read the battery + // @TODO use something more precise, like https://github.com/rlogiacco/BatterySense ? + if (millis() - cas_bat > 1000) { + cas_bat = millis(); + odcitek.bat = (float) (readADC_Cal(analogRead(BATTERY_PIN)) * 2) / 1000; + } esp_err_t result = esp_now_send(sprejemnikMac, (uint8_t *) &odcitek, sizeof(odcitek)); - #ifdef DEBUG if (result == ESP_OK) { +#ifdef DEBUG Serial.println("Uspesno poslano"); +#endif + cas_uspeh = millis(); + odcitek.aX = 0; + odcitek.aY = 0; + odcitek.aZ = 0; } else { - Serial.println("Napaka pri posiljanju"); +#ifdef DEBUG + Serial.print("Napaka pri posiljanju ("); + Serial.print(esp_err_to_name(result)); + Serial.println(")"); +#endif } - #endif } diff --git a/src/sprejemnik.cpp b/src/sprejemnik.cpp index afa9063..fd24c26 100644 --- a/src/sprejemnik.cpp +++ b/src/sprejemnik.cpp @@ -21,6 +21,9 @@ SLIPEncodedUSBSerial SLIPSerial(Serial); // MAC naslov sprejemnika: 08:3A:F2:50:EF:6C uint8_t newMACAddress[] = {0x08, 0x3A, 0xF2, 0x50, 0xEF, 0x6C}; +// MAC naslov laptopa (linux sprejemnik) +//uint8_t newMACAddress[] = { 0x9c, 0xb6, 0xd0, 0xc4, 0xe8, 0xb9 }; + // Maksimalno stevilo #define ST_SPREJEMNIKOV 10 @@ -65,7 +68,7 @@ void prejemPodatkov(const uint8_t * mac_addr, const uint8_t * noviPodatki, int l void setup() { // Nizja CPU frekvenca - //setCpuFrequencyMhz(80); + setCpuFrequencyMhz(160); //SLIPSerial.begin(115200); SLIPSerial.begin(230400); diff --git a/utopia_mapiranje.scd b/utopia_mapiranje.scd new file mode 100644 index 0000000..cf769b8 --- /dev/null +++ b/utopia_mapiranje.scd @@ -0,0 +1,415 @@ +/************************ + * MIDI / OSC MAPIRANJE * + ***********************/ + +NetAddr.langPort; + +/*********************************** + * OSC MAPPING: Povezava na simona * + **********************************/ +( + +~simonIP = "10.42.1.2"; +~oscS = NetAddr.new(~simonIP, 57120); +OSCFunc.trace(true); // debug osc +OSCFunc.trace(false); // debug osc + +~senzorji.keys.do({ |id| + ~senzorji[id].postln; + + OSCdef.new((\accOSC ++ id).asSymbol, { |msg, time, addr, recvPort| + ~oscS.sendMsg("/senzor/" ++ id ++ "/accX", msg[1].linlin(-50, 50, 0, 1)); + ~oscS.sendMsg("/senzor/" ++ id ++ "/accY", msg[2].linlin(-50, 50, 0, 1)); + ~oscS.sendMsg("/senzor/" ++ id ++ "/accZ", msg[3].linlin(-50, 50, 0, 1)); + ~oscS.sendMsg("/senzor/" ++ id ++ "/accSum", msg[4].linlin(-50, 50, 0, 1)); + }, "/acc/" ++ id); + + OSCdef.new((\eulerOSC ++ id).asSymbol, { |msg, time, addr, recvPort| + var pitch, roll, yaw; + + // vrtenje sinusoidiziramo, da ni preskokov + pitch = msg[1].sin.linlin(-pi, pi, 0, 1); + roll = msg[2].sin.linlin(-pi, pi, 0, 1); + yaw = msg[3].sin.linlin(-pi, pi, 0, 1); + //[pitch, roll, yaw].postln; + + ~oscS.sendMsg("/senzor/" ++ id ++ "/pitch", pitch); + ~oscS.sendMsg("/senzor/" ++ id ++ "/roll", roll); + ~oscS.sendMsg("/senzor/" ++ id ++ "/yaw", yaw); + //["simon", pitch, roll, yaw].postln; + }, "/euler/" ++ id); +}); + +) + + + +/************************************ + * MIDI MAPPING: Povezava na boruta * + ***********************************/ + +// Midi mapping funkcija + +( +~midiVals = Dictionary.new; +~sendMidi = { | chan=0, cc=0, val=0 | + var key = chan.asString ++ "_" ++ cc, v = val; + v = val.floor.clip(0, 127); + if ((~midiVals[key] == nil) || (~midiVals[key] != val)) { + ~midiVals[key] = val; + ~midi.control(chan, cc, val); + ["midi " ++ ~map, chan, cc, v].postln; + }; +}; +) + +// MIDI MAP I +( + +"MIDI MAP I !!!".postln; +~map = "I"; +~senzorji.keys.do({ |id| + + OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + var pitch, roll, yaw, freq, gain; + + // vrtenje sinusoidiziramo, da ni preskokov + pitch = msg[1].sin.linlin(-pi, pi, 0, 1); + roll = msg[2].sin.linlin(-pi, pi, 0, 1); + yaw = msg[3].sin.linlin(-pi, pi, 0, 1); + + // quick 16 (1) = frekvenca, quick 17 (2) = gain + switch (id, + 4, { + freq = roll; + // Quick slots 1-3 + ~sendMidi.value(0, 16, freq * 127); + }, + 1, { + gain = yaw; + if (gain <= 0.5, { + gain = 0.5 - gain; + }, { + gain = gain - 0.5; + }); + ~sendMidi.value(0, 17, 64 + (gain * 127)); + } + ); + }, "/euler/" ++ id); + + OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + // Pospeski: gremo od 0 ali iz sredine? + var accX, accY, accZ, accSum; + accX = msg[1].linlin(-50, 50, 0, 1); + accY = msg[2].linlin(-50, 50, 0, 1); + accZ = msg[3].linlin(-50, 50, 0, 1); + accSum = msg[4].linlin(-50, 50, 0, 1); + + /* + switch (id, + 3, { + ~sendMidi.value(0, 19, (accX * 127).floor); + ~sendMidi.value(0, 20, (accY * 127).floor); + ~sendMidi.value(0, 21, (accZ * 127).floor); + } + ); + */ + + }, "/acc/" ++ id); +}); +) + +// MIDI MAP II +( + +~map = "II"; +"MIDI MAP II !!!".postln; +~senzorji.keys.do({ |id| + + OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + var pitch, roll, yaw; + + // vrtenje sinusoidiziramo, da ni preskokov + pitch = msg[1].sin.linlin(-pi, pi, 0, 1); + roll = msg[2].sin.linlin(-pi, pi, 0, 1); + yaw = msg[3].sin.linlin(-pi, pi, 0, 1); + + // MORPHING EFEKT + switch (id, + 4, { + // Quick slots 1-3 + ~sendMidi.value(0, 16, (-20 + (yaw * 150)).floor); + }, + 3, { + ~sendMidi.value(0, 17, (-20 + (roll * 150).floor)); + } + ); + }, "/euler/" ++ id); + + OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + // Pospeski: gremo od 0 ali iz sredine? + var accX, accY, accZ, accSum; + accX = msg[1].linlin(-50, 50, 0, 1); + accY = msg[2].linlin(-50, 50, 0, 1); + accZ = msg[3].linlin(-50, 50, 0, 1); + accSum = msg[4].linlin(-50, 50, 0, 1); + + /* + switch (id, + 3, { + ~sendMidi.value(0, 19, (accX * 127).floor); + ~sendMidi.value(0, 20, (accY * 127).floor); + ~sendMidi.value(0, 21, (accZ * 127).floor); + } + ); + */ + + }, "/acc/" ++ id); +}); +) + +// MIDI MAP III +( + +"MIDI MAP III !!!".postln; +~map = "III"; +~senzorji.keys.do({ |id| + + OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + var pitch, roll, yaw; + + // vrtenje sinusoidiziramo, da ni preskokov + pitch = msg[1].sin.linlin(-pi, pi, 0, 1); + roll = msg[2].sin.linlin(-pi, pi, 0, 1); + yaw = msg[3].sin.linlin(-pi, pi, 0, 1); + + switch (id, + 3, { + // Quick slots 1-3 + ~sendMidi.value(0, 16, (pitch * 127)); + }, + 4, { + ~sendMidi.value(0, 17, (pitch * 127)); + } + ); + }, "/euler/" ++ id); + + OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + // Pospeski: gremo od 0 ali iz sredine? + var accX, accY, accZ, accSum; + accX = msg[1].linlin(-50, 50, 0, 1); + accY = msg[2].linlin(-50, 50, 0, 1); + accZ = msg[3].linlin(-50, 50, 0, 1); + accSum = msg[4].linlin(-50, 50, 0, 1); + + accSum = accSum - 0.5; + switch (id, + 4, { + ~sendMidi.value(0, 18, (accSum * 256).floor); + } + ); + + }, "/acc/" ++ id); +}); +) + +// MIDI MAP IV (II) +( + +~map = "IV"; +"MIDI MAP IV (II) !!!".postln; +~senzorji.keys.do({ |id| + + OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + var pitch, roll, yaw; + + // vrtenje sinusoidiziramo, da ni preskokov + pitch = msg[1].sin.linlin(-pi, pi, 0, 1); + roll = msg[2].sin.linlin(-pi, pi, 0, 1); + yaw = msg[3].sin.linlin(-pi, pi, 0, 1); + + // MORPHING EFEKT + switch (id, + 4, { + // Quick slots 1-3 + ~sendMidi.value(0, 16, (-15 + (yaw * 150)).floor); + }, + 3, { + ~sendMidi.value(0, 17, (-15 + (roll * 150).floor)); + } + ); + }, "/euler/" ++ id); + + OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + // Pospeski: gremo od 0 ali iz sredine? + var accX, accY, accZ, accSum; + accX = msg[1].linlin(-50, 50, 0, 1); + accY = msg[2].linlin(-50, 50, 0, 1); + accZ = msg[3].linlin(-50, 50, 0, 1); + accSum = msg[4].linlin(-50, 50, 0, 1); + + /* + switch (id, + 3, { + ~sendMidi.value(0, 19, (accX * 127).floor); + } + ); + */ + + }, "/acc/" ++ id); +}); +) + +( + +"MIDI MAP V (III) !!!".postln; +~senzorji.keys.do({ |id| + + OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + var pitch, roll, yaw; + + // vrtenje sinusoidiziramo, da ni preskokov + pitch = msg[1].sin.linlin(-pi, pi, 0, 1); + roll = msg[2].sin.linlin(-pi, pi, 0, 1); + yaw = msg[3].sin.linlin(-pi, pi, 0, 1); + + // MORPHING EFEKT + switch (id, + 4, { + // Quick slots 1-3 + ~sendMidi.value(0, 16, (-15 + (yaw * 150)).floor); + }, + 3, { + ~sendMidi.value(0, 17, (-15 + (roll * 150).floor)); + } + ); + }, "/euler/" ++ id); + + OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + // Pospeski: gremo od 0 ali iz sredine? + var accX, accY, accZ, accSum; + accX = msg[1].linlin(-50, 50, 0, 1); + accY = msg[2].linlin(-50, 50, 0, 1); + accZ = msg[3].linlin(-50, 50, 0, 1); + accSum = msg[4].linlin(-50, 50, 0, 1); + + /* + switch (id, + 3, { + ~sendMidi.value(0, 19, (accX * 127).floor); + ~sendMidi.value(0, 20, (accY * 127).floor); + ~sendMidi.value(0, 21, (accZ * 127).floor); + } + ); + */ + + }, "/acc/" ++ id); +}); +) + + +( + +"MIDI MAP VI (III) !!!".postln; +~senzorji.keys.do({ |id| + + OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + var pitch, roll, yaw; + + // vrtenje sinusoidiziramo, da ni preskokov + pitch = msg[1].sin.linlin(-pi, pi, 0, 1); + roll = msg[2].sin.linlin(-pi, pi, 0, 1); + yaw = msg[3].sin.linlin(-pi, pi, 0, 1); + + switch (id, + 3, { + // Quick slots 1-3 + ~sendMidi.value(0, 16, (pitch * 127).floor); + ~sendMidi.value(0, 17, (yaw * 127).floor); + } + ); + }, "/euler/" ++ id); + + OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + // Pospeski: gremo od 0 ali iz sredine? + var accX, accY, accZ, accSum; + accX = msg[1].linlin(-50, 50, 0, 1); + accY = msg[2].linlin(-50, 50, 0, 1); + accZ = msg[3].linlin(-50, 50, 0, 1); + accSum = msg[4].linlin(-50, 50, 0, 1); + + accSum = accSum - 0.5; + switch (id, + 4, { + //~sendMidi.value(0, 18, (accSum * 200).floor); + } + ); + + }, "/acc/" ++ id); +}); +) + +( +"MIDI MAP VII (2)".postln; +~senzorji.keys.do({ |id| + + OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + var pitch, roll, yaw; + + // vrtenje sinusoidiziramo, da ni preskokov + pitch = msg[1].sin.linlin(-pi, pi, 0, 1); + roll = msg[2].sin.linlin(-pi, pi, 0, 1); + yaw = msg[3].sin.linlin(-pi, pi, 0, 1); + + // BITCRUSH EFEKT + /* + switch (id, + 4, { + // Quick slots 1-3 + ~sendMidi.value(0, 16, (-15 + (yaw * 150)).floor); + }, + 3, { + ~sendMidi.value(0, 17, (-15 + (roll * 150).floor)); + } + ); + */ + }, "/euler/" ++ id); + + OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort| + // Pospeski: gremo od 0 ali iz sredine? + var accX, accY, accZ, accSum; + accX = msg[1].abs.linlin(-50, 50, 0, 1); + accY = msg[2].abs.linlin(0, 50, 0, 1); + accZ = msg[3].abs.linlin(0, 50, 0, 1); + accSum = msg[4].linlin(0, 50, 0, 1); + + switch (id, + 3, { + ~sendMidi.value(0, 16, (accX * 127)); + ~sendMidi.value(0, 17, (accY * 127)); + } + ); + }, "/acc/" ++ id); +}); +) + + + + + + +// VDMX mapping setup za simona - dedicated controls + +( + +~senzorji.keys.do({|id| + ~oscS.sendMsg("/senzor/" ++ id ++ "/pitch", 0.5); + ~oscS.sendMsg("/senzor/" ++ id ++ "/roll", 0.5); + ~oscS.sendMsg("/senzor/" ++ id ++ "/yaw", 0.5); + ~oscS.sendMsg("/senzor/" ++ id ++ "/accX", 0.5); + ~oscS.sendMsg("/senzor/" ++ id ++ "/accY", 0.5); + ~oscS.sendMsg("/senzor/" ++ id ++ "/accZ", 0.5); + ~oscS.sendMsg("/senzor/" ++ id ++ "/accSum", 0.5); +}); + +) \ No newline at end of file