From 29645f76b5292509280055925ad3b5c598375e4c Mon Sep 17 00:00:00 2001 From: Lucas Oskorep Date: Tue, 7 Jun 2022 19:28:04 -0400 Subject: [PATCH] Initial commit --- mini-untz-test/mini-untz-test.ino | 135 ++++++++++++++++++++++++++++++ mini-untz.ino | 132 +++++++++++++++++++++++++++++ 2 files changed, 267 insertions(+) create mode 100644 mini-untz-test/mini-untz-test.ino create mode 100644 mini-untz.ino diff --git a/mini-untz-test/mini-untz-test.ino b/mini-untz-test/mini-untz-test.ino new file mode 100644 index 0000000..2efffe3 --- /dev/null +++ b/mini-untz-test/mini-untz-test.ino @@ -0,0 +1,135 @@ +/*************************************************** + This is a test example for the Adafruit Trellis w/HT16K33 + + Designed specifically to work with the Adafruit Trellis + ----> https://www.adafruit.com/products/1616 + ----> https://www.adafruit.com/products/1611 + + These displays use I2C to communicate, 2 pins are required to + interface + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + MIT license, all text above must be included in any redistribution + ****************************************************/ + +#include +#include "Adafruit_Trellis.h" + +/*************************************************** + This example shows reading buttons and setting/clearing buttons in a loop + "momentary" mode has the LED light up only when a button is pressed + "latching" mode lets you turn the LED on/off when pressed + + Up to 8 matrices can be used but this example will show 4 or 1 + ****************************************************/ + +#define MOMENTARY 0 +#define LATCHING 1 +// set the mode here +#define MODE LATCHING + + +Adafruit_Trellis matrix0 = Adafruit_Trellis(); + +// uncomment the below to add 3 more matrices +/* +Adafruit_Trellis matrix1 = Adafruit_Trellis(); +Adafruit_Trellis matrix2 = Adafruit_Trellis(); +Adafruit_Trellis matrix3 = Adafruit_Trellis(); +// you can add another 4, up to 8 +*/ + +// Just one +Adafruit_TrellisSet trellis = Adafruit_TrellisSet(&matrix0); +// or use the below to select 4, up to 8 can be passed in +//Adafruit_TrellisSet trellis = Adafruit_TrellisSet(&matrix0, &matrix1, &matrix2, &matrix3); + +// set to however many you're working with here, up to 8 +#define NUMTRELLIS 1 + +#define numKeys (NUMTRELLIS * 16) + +// Connect Trellis Vin to 5V and Ground to ground. +// Connect the INT wire to pin #A2 (can change later!) +#define INTPIN A2 +// Connect I2C SDA pin to your Arduino SDA line +// Connect I2C SCL pin to your Arduino SCL line +// All Trellises share the SDA, SCL and INT pin! +// Even 8 tiles use only 3 wires max + + +void setup() { + Serial.begin(9600); + Serial.println("Trellis Demo"); + + // INT pin requires a pullup + pinMode(INTPIN, INPUT); + digitalWrite(INTPIN, HIGH); + + // begin() with the addresses of each panel in order + // I find it easiest if the addresses are in order + trellis.begin(0x70); // only one + // trellis.begin(0x70, 0x71, 0x72, 0x73); // or four! + + // light up all the LEDs in order + for (uint8_t i=0; i +#include +#include + +#define LED LED_BUILTIN // Pin for heartbeat LED (shows code is working) +#define CHANNEL 1 // MIDI channel number + +Adafruit_Trellis trellis; + +#define ANALOG_INPUT + +uint8_t heart = 0; // Heartbeat LED counter +unsigned long prevReadTime = 0L; // Keypad polling timer +uint8_t mod; +uint8_t vel; +uint8_t fxc; +uint8_t rate; + +uint8_t note[] = { + 60, 61, 62, 63, + 56, 57, 58, 59, + 52, 53, 54, 55, + 48, 49, 50, 51 +}; + +// First parameter is the event type (0x09 = note on, 0x08 = note off). +// Second parameter is note-on/note-off, combined with the channel. +// Channel can be anything between 0-15. Typically reported to the user as 1-16. +// Third parameter is the note number (48 = middle C). +// Fourth parameter is the velocity (64 = normal, 127 = fastest). + +void noteOn(byte channel, byte pitch, byte velocity) { + midiEventPacket_t noteOn = {0x09, (byte)(0x90 | channel), pitch, velocity}; + MidiUSB.sendMIDI(noteOn); +} + +void noteOff(byte channel, byte pitch, byte velocity) { + midiEventPacket_t noteOff = {0x08, (byte)(0x80 | channel), pitch, velocity}; + MidiUSB.sendMIDI(noteOff); +} + +// First parameter is the event type (0x0B = control change). +// Second parameter is the event type, combined with the channel. +// Third parameter is the control number number (0-119). +// Fourth parameter is the control value (0-127). + +void controlChange(byte channel, byte control, byte value) { + midiEventPacket_t event = {0x0B, (byte) (0xB0 | channel), control, value}; + MidiUSB.sendMIDI(event); +} + +void setup() { + + Serial.begin(9600); + Serial.println("Trellis Demo"); + + pinMode(LED, OUTPUT); + trellis.begin(0x70); // Pass I2C address +#ifdef __AVR__ + // Default Arduino I2C speed is 100 KHz, but the HT16K33 supports + // 400 KHz. We can force this for faster read & refresh, but may + // break compatibility with other I2C devices...so be prepared to + // comment this out, or save & restore value as needed. + TWBR = 12; +#endif + trellis.clear(); + trellis.writeDisplay(); + +#ifdef ANALOG_INPUT + mod = map(analogRead(0), 0, 1023, 0, 127); + vel = map(analogRead(1), 0, 1023, 0, 127); + fxc = map(analogRead(2), 0, 1023, 0, 127); + rate = map(analogRead(3),0, 1023, 0, 127); + controlChange(CHANNEL, 1, mod); + controlChange(CHANNEL, 11, vel); + controlChange(CHANNEL, 12, fxc); + controlChange(CHANNEL, 13, rate); +#endif +} + +void loop() { + + + unsigned long t = millis(); + if((t - prevReadTime) >= 20L) { // 20ms = min Trellis poll time + if(trellis.readSwitches()) { // Button state change? + + for(uint8_t i=0; i<16; i++) { // For each button... + if(trellis.justPressed(i)) { + noteOn(CHANNEL, note[i], 127); + + Serial.print("v"); Serial.println(i); + trellis.setLED(i); + } else if(trellis.justReleased(i)) { + noteOn(CHANNEL, note[i], 0); + trellis.clrLED(i); + } + } + trellis.writeDisplay(); + } +#ifdef ANALOG_INPUT + uint8_t newModulation = map(analogRead(0), 0, 1023, 0, 127); + if(mod != newModulation) { + mod = newModulation; + controlChange(CHANNEL, 1, mod); + Serial.println("Mod 1"); + } + uint8_t newVelocity = map(analogRead(1), 0, 1023, 0, 127); + if(vel != newVelocity) { + vel = newVelocity; + controlChange(CHANNEL, 11, vel); + Serial.println("Mod 2"); + } + uint8_t newEffect = map(analogRead(2), 0, 1023, 0, 127); + if(fxc != newEffect) { + fxc = newEffect; + controlChange(CHANNEL, 12, fxc); + Serial.println("Mod 3"); + } + uint8_t newRate = map(analogRead(3), 0, 1023, 0, 127); + if(rate !=newRate) { + rate = newRate; + controlChange(CHANNEL, 13, rate); + Serial.println("Mod 4"); + } +#endif + prevReadTime = t; + digitalWrite(LED, ++heart & 32); // Blink = alive + MidiUSB.flush(); + } + (void)MidiUSB.read(); // Discard incoming MIDI messages +}