Hello Everyone,
I'm currently hardware testing a custom DAW Midi controller using a teensy 4.1 and the Control Surface Library. I've managed to get the monitor and buttons for the increment/decrement on the bank selector working.
However when I tried to test the multiplexed (CD74HC4067) Potentiometers, the DAW (Reaper) seems like its receiving Midi CC messages from every input. Right now I'm only testing with one potentiometer connected, and even if I were to disconnect that completely, the Multiplexer is still sending multiple Midi CC messages for what seems like every midi address mapped to the mux.
I tried simplifying the code to comment all but one of the mux inputs and in that instance it works perfectly, but as soon as I add another mux input, it cycles between every mux mapped address that is turned on.
Does anyone know what might be causing this? Currently only the monitor, a single button, the mux and a b10k potentiometer are connected. I'm not sure this matters but its also Midi over USB.
Here is the code and diagram.
Thank you for taking the time to read.
#include <Control_Surface.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Display/DisplayInterfaces/DisplayInterfaceSSD1306.hpp>
/******************************************************
Juicebox MIDI Controller
by Zak Tom
Version 0.24 alpha (Stable)
*****************************************************/
// ----------------------------- Display setup ------------------------------ //
Adafruit_SSD1306 ssd1306Display(128, 64, &Wire, -1); // Instatiate SSD1306 Display
// 'Untitled-1', 128x64px
const unsigned char myBitmapUntitled_1 [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0f, 0xf8, 0x00, 0x7c, 0x03, 0x80, 0xe1, 0xc0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0x03, 0xff, 0x87, 0xc0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0x87, 0xff, 0xc7, 0xe0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0x87, 0xff, 0xc7, 0xf0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x07, 0xcf, 0x83, 0xe7, 0xf8, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x07, 0xcf, 0x83, 0xe7, 0xfc, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x03, 0xcf, 0x81, 0xe7, 0xfe, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x03, 0xcf, 0x81, 0xe7, 0xff, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x03, 0xcf, 0x81, 0xe7, 0xff, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x03, 0xcf, 0x81, 0xe7, 0xdf, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x07, 0xcf, 0x81, 0xe7, 0xcf, 0xf3, 0xe0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x07, 0xcf, 0x81, 0xe7, 0xc7, 0xf3, 0xe0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0x8f, 0x81, 0xe7, 0xc3, 0xf3, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0x8f, 0xff, 0xe7, 0xc1, 0xf3, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0x8f, 0xff, 0xe7, 0xc0, 0xf3, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0x8f, 0xff, 0xe7, 0xc0, 0xf3, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x07, 0xcf, 0xff, 0xe7, 0xc0, 0xf3, 0xe0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x07, 0xcf, 0x81, 0xe7, 0xc0, 0xf3, 0xe0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x03, 0xcf, 0x81, 0xe7, 0xc0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x03, 0xcf, 0x81, 0xe7, 0xc0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x03, 0xcf, 0x81, 0xe7, 0xc0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x07, 0xcf, 0x81, 0xe7, 0xc0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0x07, 0xcf, 0x81, 0xe7, 0xc0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0xcf, 0x81, 0xe7, 0xc0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0x8f, 0x81, 0xe7, 0xc0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1f, 0xff, 0x0f, 0x81, 0xe7, 0xc0, 0xf3, 0xe0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0f, 0xf8, 0x07, 0x00, 0xc3, 0x80, 0xe1, 0xc0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0b, 0x29, 0xcf, 0xf8, 0xe4, 0xc7, 0x87, 0x1c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x2f, 0x6c, 0x6d, 0xb6, 0x84, 0x8d, 0xb6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x2f, 0x2c, 0x65, 0x97, 0x84, 0xcc, 0xa2, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x2f, 0x0c, 0x65, 0x93, 0x04, 0xc1, 0x86, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x2f, 0x0f, 0x7d, 0x93, 0x04, 0xc3, 0x1e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x2f, 0x0c, 0x6d, 0x93, 0x04, 0xc6, 0x06, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x4f, 0x2f, 0x2c, 0x65, 0x93, 0x84, 0xcc, 0x22, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x4b, 0x6f, 0x6c, 0x6d, 0xb6, 0x84, 0x8c, 0x36, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0xc9, 0xcf, 0xf8, 0xe4, 0xc7, 0xaf, 0x9c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'Juiceboxlogo', 128x64px
const unsigned char myBitmapJuiceboxlogo [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x83, 0x83, 0x81, 0xfc, 0x07, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x87, 0xfe, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x87, 0xff, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0xff, 0x8f, 0xfc, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x83, 0xc7, 0x8f, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x83, 0xc7, 0x83, 0xc7, 0x8f, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x83, 0xc7, 0x83, 0xc7, 0x8f, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x83, 0xc7, 0x83, 0xc7, 0x8f, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0xff, 0xc7, 0xff, 0xc7, 0x8f, 0xff, 0x8f, 0xfc, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0xff, 0x83, 0xff, 0x87, 0x87, 0xff, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0xff, 0x03, 0xff, 0x07, 0x87, 0xfe, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xfe, 0x03, 0x81, 0xfc, 0x07, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x1f, 0xc0, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x7f, 0xe0, 0xf0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x7f, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0xff, 0xf8, 0xf9, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x79, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x7d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf8, 0xf0, 0x78, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0xf0, 0x78, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0xf0, 0x78, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0xf0, 0x78, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0xf0, 0x78, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x7d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xf0, 0x78, 0x79, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0xff, 0xf8, 0xf9, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0, 0x7f, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x7f, 0xe0, 0xf0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x1f, 0xc0, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 2080)
const int myBitmapallArray_LEN = 2;
const unsigned char* myBitmapallArray[2] = {
myBitmapJuiceboxlogo,
myBitmapUntitled_1
};
void initializeDisplay() {
// Initialize with the display with I²C address 0x3C
ssd1306Display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Wire.setClock(3400000); // Set the I²C clock to 1.8 MHz for faster refresh / 1800000 was the default, changed to 3400000 not sure if this even works this fast.
ssd1306Display.setRotation(0); // Normal screen orientation.
}
// --------------------------- Display interface ---------------------------- //
class MySSD1306_DisplayInterface : public SSD1306_DisplayInterface {
public:
MySSD1306_DisplayInterface(Adafruit_SSD1306 &display)
: SSD1306_DisplayInterface(display) {}
void drawBackground() override {
} //remove this later
} display = ssd1306Display;
USBMIDI_Interface midi; // Instantiate a MIDI Interface to use
// Instantiate 16 Banks, with 1 track per bank.
Bank<5> bank(1);
// Instantiate a Bank selector to control which one of the four Banks is active.
IncrementDecrementSelector<5> selector {
bank, // Bank to manage
{23, 22}, // push button pins (increment, decrement)
Wrap::Wrap, // Wrap around
};
//***MULTIPLEXERS (CD74HC4067)*************************
//MUX adress pins connected to Teensy pins 2,3,4,5
//*****************************************************
CD74HC4067 mux1 {
A11, //Analog input pin
{2, 3, 4, 5} // Adress pins S0, S1, S2, S3
};
// Create an array of potentiometers that send out
// MIDI Control Change messages when you turn the
// potentiometers connected to the eight input pins of
// the multiplexer
Bankable::CCPotentiometer muxPotentiometers[] {
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(0), {102, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(1), {103, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(2), {104, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(3), {105, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(4), {106, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(5), {107, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(6), {108, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(7), {109, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(8), {110, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(9), {111, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(10), {112, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(11), {113, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(12), {114, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(13), {115, Channel_1}},
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(14), {116, Channel_1}},
//{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(15), {117, Channel_1}},
};
// Button Matrix 4x4
// The note numbers corresponding to the buttons in the matrix
const AddressMatrix<4, 4> addresses {{
{60, 61, 62, 63},
{64, 65, 66, 67},
{68, 69, 70, 71},
{72, 73, 74, 75},
}};
NoteButtonMatrix<4, 4> buttonmatrix {
{33, 34, 35, 36}, // row pins
{37, 38, 39, 40}, // column pins
addresses, // address matrix
Channel_1, // channel and cable number
};
//Instantiate Rotary Encoder
CCRotaryEncoder enc1 {
{29,30}, //pins
MCU::V_POT_1, // MIDI address (CC number + optional channel)
1, // optional multiplier if the control isn't fast enough
};
CCRotaryEncoder enc2 {
{31,32}, //pins
MCU::V_POT_2, // MIDI address (CC number + optional channel)
1, // optional multiplier if the control isn't fast enough
};
CCRotaryEncoder enc3 {
{20,21}, //pins
MCU::V_POT_3, // MIDI address (CC number + optional channel)
1, // optional multiplier if the control isn't fast enough
};
CCRotaryEncoder enc4 {
{22,23}, //pins
MCU::V_POT_4, // MIDI address (CC number + optional channel)
1, // optional multiplier if the control isn't fast enough
};
// Bank setting
BankDisplay bankDisp[] {
// first track of the bank (1), position (0, 50), font size (2)
{display, bank, 1, {85, 17}, 4, WHITE},
};
void setup() {
initializeDisplay();
// Select the correct relative MIDI CC mode.
// Options:
// - TWOS_COMPLEMENT (default)
// - BINARY_OFFSET
// - SIGN_MAGNITUDE
// - NEXT_ADDRESS
// Aliases:
// - REAPER_RELATIVE_1
// - REAPER_RELATIVE_2
// - REAPER_RELATIVE_3
// - TRACKTION_RELATIVE
// - MACKIE_CONTROL_RELATIVE
// - KORG_KONTROL_INC_DEC_1
RelativeCCSender::setMode(relativeCCmode::REAPER_RELATIVE_1);
Control_Surface.begin(); // Initialize the Control Surface
ssd1306Display.drawBitmap(0, 0, myBitmapJuiceboxlogo, 128, 64, WHITE);
ssd1306Display.display();
delay(5000);
ssd1306Display.clearDisplay();
}
void loop() {
Control_Surface.loop(); // Update the Control Surface
//Bank Graphic next to Bank Channel
ssd1306Display.drawBitmap(0, 0, myBitmapUntitled_1, 128, 64, WHITE);
ssd1306Display.display();
}
Here is the wiring diagram
