From 12e415f1594852437f30feb23060d8b551534537 Mon Sep 17 00:00:00 2001 From: Quentin Bolsee <quentinbolsee@hotmail.com> Date: Fri, 31 May 2024 04:13:55 -0700 Subject: [PATCH] code --- code/rp2040_midi_glass/rp2040_midi_glass.ino | 132 +++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 code/rp2040_midi_glass/rp2040_midi_glass.ino diff --git a/code/rp2040_midi_glass/rp2040_midi_glass.ino b/code/rp2040_midi_glass/rp2040_midi_glass.ino new file mode 100644 index 0000000..016204b --- /dev/null +++ b/code/rp2040_midi_glass/rp2040_midi_glass.ino @@ -0,0 +1,132 @@ +#include <Adafruit_NeoPixel.h> + +#define digitalWriteFast(pin,val) (val ? sio_hw->gpio_set = (1 << pin) : sio_hw->gpio_clr = (1 << pin)) +#define digitalReadFast(pin) ((1 << pin) & sio_hw->gpio_in) + +#define RX1 26 // receive 1 pin +#define TX1 28 // transmit 1 pin +#define TX2 29 // transmit 2 pin +#define TX3 6 // transmit 3 pin + +#define N_TX 3 + +#define settle 20 // settle time +#define samples 100 // number of samples to accumulate + +#define USE_MIDI + +#ifdef USE_MIDI +#include <Arduino.h> +#include <Adafruit_TinyUSB.h> +#include <MIDI.h> +#endif + +Adafruit_NeoPixel pixels(1, 12, NEO_GRB + NEO_KHZ800); +int colors[N_TX][3] = {{255, 26, 0}, {0, 255, 0}, {0, 16, 255}}; + +// MIDI +#ifdef USE_MIDI +Adafruit_USBD_MIDI usb_midi; +MIDI_CREATE_INSTANCE(Adafruit_USBD_MIDI, usb_midi, MIDI); +int rx_notes[N_TX] = {90, 93, 102}; +#endif + +// CAPACITIVE SENSING +int tx_pins[N_TX] = {TX1, TX2, TX3}; +int32_t rx_values[N_TX]; +int32_t rx_thresholds[N_TX] = {150, 190, 190}; +bool rx_triggered[N_TX]; + +void setup() { + pixels.begin(); + Serial.begin(0); + + pinMode(11, OUTPUT); + digitalWrite(11, HIGH); + + for (int i = 0; i < N_TX; i++) { + rx_triggered[N_TX] = false; + } + + #ifdef USE_MIDI + TinyUSB_Device_Init(0); + MIDI.begin(MIDI_CHANNEL_OMNI); + while( !TinyUSBDevice.mounted() ) delay(1); + #endif +} + +void loop() { + +} + +void setup1() { + +} + +int32_t measure(int pin) { + int32_t up, down; + up = down = 0; + pinMode(pin, OUTPUT); + for (int i = 0; i < samples; ++i) { + digitalWriteFast(pin, HIGH); // charge up + up += analogRead(RX1); // read + delayMicroseconds(settle); //settle + digitalWriteFast(pin,LOW); // charge down + down += analogRead(RX1); // read + delayMicroseconds(settle); // settle + } + pinMode(pin, INPUT); + return (up-down) / samples; +} + +bool any = false; + +void loop1() { + for (int i = 0; i < N_TX; i++) { + rx_values[i] = measure(tx_pins[i]); + if (rx_triggered[i]) { + if (rx_values[i] < rx_thresholds[i]) { + rx_triggered[i] = false; + #ifdef USE_MIDI + MIDI.sendNoteOff(64, 0, 1+i); + #endif + } + } else { + if (rx_values[i] > rx_thresholds[i]) { + rx_triggered[i] = true; + #ifdef USE_MIDI + MIDI.sendNoteOn(64, 127, 1+i); + #endif + } + } + } + + bool any_now = false; + + for (int i = 0; i < N_TX; i++) { + Serial.print(rx_values[i]); + Serial.print(" "); + any_now |= rx_triggered[i]; + } + Serial.println(""); + + // neopixel + if (any_now && !any) { + for (int i = 0; i < N_TX; i++) { + if (rx_triggered[i]) { + pixels.clear(); + pixels.setPixelColor(0, pixels.Color(colors[i][0], colors[i][1], colors[i][2])); + pixels.show(); + break; + } + } + } + if (!any_now && any) { + pixels.clear(); + pixels.setPixelColor(0, pixels.Color(0, 0, 0)); + pixels.show(); + } + + // update + any = any_now; +} -- GitLab