Hi Guys
I have been working on a custom midi controller using the notes and volts code as a base. This works perfectly . The bit I feel is a little clunky although working great is the section for LED control. I have 13 LEDs assigned to some buttons. I used multiple if statements to assign the button numbers to the led array but feel there must be amore elegant method and would love to learn. havent posted the controller h section but that is where the bToggle function is stored and the button variables.
Thanks in advance for any help in streamlining this
Iain
I have been working on a custom midi controller using the notes and volts code as a base. This works perfectly . The bit I feel is a little clunky although working great is the section for LED control. I have 13 LEDs assigned to some buttons. I used multiple if statements to assign the button numbers to the led array but feel there must be amore elegant method and would love to learn. havent posted the controller h section but that is where the bToggle function is stored and the button variables.
Thanks in advance for any help in streamlining this
Iain
Code:
#include "Controller.h"
/*************************************************************
TAL UNO LX Controller WITH CYCLING 3/4/5/ WAY BUTTONS
Iain Dunn 2021 version 1.0 (based on notes and Volts and Massijam code for Teensy)
www.notesandvolts.com
https://github.com/maasijam/model_d_controller
For Teensy LC
*************************************************************/
//************************************************************
//***SET THE NUMBER OF CONTROLS USED**************************
//************************************************************
//---How many push buttons are connected to a multiplexer?---------
byte NUMBER_MUX_BUTTONS = 23;
//---How many potentiometers are connected to a multiplexer?--
byte NUMBER_MUX_POTS = 32;
//***ANY MULTIPLEXERS? (74HC4067)************************************
//MUX address pins must be connected to Teensy pins 2,3,4,5
//Mux NAME (OUTPUT PIN, , How Many Mux Pins?(8 or 16) , Is It Analog?);
//*******************************************************************
Mux M1(0, 16, false); //Digital multiplexer on Teensy pin 0
Mux M2(1, 16 , false); //Digital multiplexer on Teensy pin 1
Mux M3(A0, 16, true); //Analog multiplexer on Arduino analog pin A0
Mux M4(A1, 16, true); //Analog multiplexer on Arduino analog pin A1
//***DEFINE BUTTONS CONNECTED TO MULTIPLEXER*************************
//Button::Button(Mux mux, byte muxpin, byte command, byte value, byte channel, byte debounce)
//** Command parameter 0=NOTE 1=CC 2=Toggle CC 3= 3way 4= 4way 5 = 5way switch 6 LED Toggle
Button MBU1 (M1, 0, 3, 3, 1, 10);
Button MBU2 (M1, 1, 2, 9, 1, 10);
Button MBU3 (M1, 2, 2, 14, 1, 10);
Button MBU4 (M1, 3, 2, 15, 1, 10);
Button MBU5 (M1, 4, 2, 16, 1, 10);
Button MBU6 (M1, 5, 2, 17, 1, 10);
Button MBU7 (M1, 6, 2, 18, 1, 10);
Button MBU8 (M1, 7, 2, 19, 1, 10);
Button MBU9 (M1, 8, 3, 20, 1, 10);
Button MBU10(M1, 9, 3, 21, 1, 10);
Button MBU11(M1, 10, 5, 22, 1, 10);
Button MBU12(M1, 11, 2, 23, 1, 10);
Button MBU13(M1, 12, 2, 102, 1, 10);
Button MBU14(M1, 13, 2, 103, 1, 10);
Button MBU15(M1, 14, 2, 104, 1, 10);
Button MBU16(M1, 15, 2, 105, 1, 10);
Button MBU17(M2, 0, 2, 106, 1, 10);
Button MBU18(M2, 1, 2, 107, 1, 10);
Button MBU19(M2, 2, 2, 108, 1, 10);
Button MBU20(M2, 3, 4, 109, 1, 10);
Button MBU21(M2, 4, 3, 110, 1, 10);
Button MBU22(M2, 5, 3, 111, 1, 10);
Button MBU23(M2, 6, 2, 112, 1, 10);
//*******************************************************************
//Add multiplexed buttons used to array below like this-> Button *MUXBUTTONS[] {&MBU1, &MBU2, &MBU3, &MBU4, &MBU5, &MBU6.....};
Button *MUXBUTTONS[] {&MBU1, &MBU2, &MBU3, &MBU4, &MBU5, &MBU6, &MBU7, &MBU8, &MBU9, &MBU10, &MBU11, &MBU12, &MBU13, &MBU14, &MBU15, &MBU16,
&MBU17, &MBU18, &MBU19, &MBU20, &MBU21, &MBU22, &MBU23
};
//***DEFINE POTENTIOMETERS CONNECTED TO MULTIPLEXER*******************
//Pot::Pot(Mux mux, byte muxpin, byte command, byte control, byte channel)
//**Command parameter is for future use**
Pot MPO1 (M3, 0, 0, 24, 1);
Pot MPO2 (M3, 1, 0, 25, 1);
Pot MPO3 (M3, 2, 0, 26, 1);
Pot MPO4 (M3, 3, 0, 27, 1);
Pot MPO5 (M3, 4, 0, 28, 1);
Pot MPO6 (M3, 5, 0, 29, 1);
Pot MPO7 (M3, 6, 0, 30, 1);
Pot MPO8 (M3, 7, 0, 31, 1);
Pot MPO9 (M3, 8, 0, 33, 1);
Pot MPO10(M3, 9, 0, 34, 1);
Pot MPO11(M3, 10, 0, 35, 1);
Pot MPO12(M3, 11, 0, 36, 1);
Pot MPO13(M3, 12, 0, 37, 1);
Pot MPO14(M3, 13, 0, 38, 1);
Pot MPO15(M3, 14, 0, 39, 1);
Pot MPO16(M3, 15, 0, 40, 1);
Pot MPO17(M4, 0, 0, 41, 1);
Pot MPO18(M4, 1, 0, 42, 1);
Pot MPO19(M4, 2, 0, 43, 1);
Pot MPO20(M4, 3, 0, 44 , 1);
Pot MPO21(M4, 4, 0, 45 , 1);
Pot MPO22(M4, 5, 0, 46 , 1);
Pot MPO23(M4, 6, 0, 47 , 1);
Pot MPO24(M4, 7, 0, 48, 1);
Pot MPO25(M4, 8, 0, 49, 1);
Pot MPO26(M4, 9, 0, 50, 1);
Pot MPO27(M4, 10, 0, 51 , 1);
Pot MPO28(M4, 11, 0, 52, 1);
Pot MPO29(M4, 12, 0, 53 , 1);
Pot MPO30(M4, 13, 0, 54 , 1);
Pot MPO31(M4, 14, 0, 55 , 1);
Pot MPO32(M4, 15, 0, 56 , 1);
//Add multiplexed pots used to array below like this-> Pot *MUXPOTS[] {&MPO1, &MPO2, &MPO3, &MPO4, &MPO5, &MPO6.....};
Pot *MUXPOTS[] {&MPO1, &MPO2, &MPO3, &MPO4, &MPO5, &MPO6, &MPO7, &MPO8, &MPO9, &MPO10, &MPO11, &MPO12, &MPO13, &MPO14, &MPO15, &MPO16, &MPO17, &MPO18, &MPO19, &MPO20, &MPO21, &MPO22, &MPO23, &MPO24
, &MPO25, &MPO26, &MPO27, &MPO28, &MPO29, &MPO30, &MPO31, &MPO32
};
//*******************************************************************
//***DEFINE POTENTIOMETERS CONNECTED DIRECTLY TO PINS*******************
//Pot::Pot(byte pin, byte command, byte control, byte channel)
//**Command parameter is for future use**
//*******************************************************************
//Add direct pots used to array below like this-> Pot *DIRECTPOTS[] {&DPO1, &DPO2, &DPO3, &DPO4 ...};
//*******************************************************************
const int channel = 1; // MIDI channel
const int ledPin[] = {6, 7, 8, 9, 10, 11, 12, 18, 19, 20, 21, 22, 23};
void setup() {
pinMode(ledPin[0], OUTPUT);
pinMode(ledPin[1], OUTPUT);
pinMode(ledPin[2], OUTPUT);
pinMode(ledPin[3], OUTPUT);
pinMode(ledPin[4], OUTPUT);
pinMode(ledPin[5], OUTPUT);
pinMode(ledPin[6], OUTPUT);
pinMode(ledPin[7], OUTPUT);
pinMode(ledPin[8], OUTPUT);
pinMode(ledPin[9], OUTPUT);
pinMode(ledPin[10], OUTPUT);
pinMode(ledPin[11], OUTPUT);
pinMode(ledPin[12], OUTPUT);
digitalWrite(ledPin[0], LOW);
digitalWrite(ledPin[1], LOW);
digitalWrite(ledPin[2], LOW);
digitalWrite(ledPin[3], LOW);
digitalWrite(ledPin[4], LOW);
digitalWrite(ledPin[5], LOW);
digitalWrite(ledPin[6], LOW);
digitalWrite(ledPin[7], LOW);
digitalWrite(ledPin[8], LOW);
digitalWrite(ledPin[9], LOW);
digitalWrite(ledPin[10], LOW);
digitalWrite(ledPin[11], LOW);
digitalWrite(ledPin[12], LOW);
}
void loop() {
if (NUMBER_MUX_POTS != 0) updateMuxPots();
if (NUMBER_MUX_BUTTONS != 0) updateMuxButtons();
while (usbMIDI.read()) {
// controllers must call .read() to keep the queue clear even if they are not responding to MIDI
}
}
//***********************************************************************
void updateMuxPots() {
for (int i = 0; i < NUMBER_MUX_POTS; i = i + 1) {
MUXPOTS[i]->muxUpdate();
byte potmessage = MUXPOTS[i]->getValue();
if (potmessage != 255) {
usbMIDI.sendControlChange(MUXPOTS[i]->Pcontrol, potmessage, channel);
}
}
}
//*******************************************************************
void updateMuxButtons() {
// Cycle through Mux Button array
for (int i = 0; i < NUMBER_MUX_BUTTONS; i = i + 1) {
MUXBUTTONS[i]->muxUpdate();
byte message = MUXBUTTONS[i]->getValue();
// Button is pressed
if (message == 0) {
switch (MUXBUTTONS[i]->Bcommand) {
case 2: //Toggle
if (MUXBUTTONS[i]->Btoggle == 0) {
MUXBUTTONS[i]->Btoggle = 1;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 127, channel);
}
else if (MUXBUTTONS[i]->Btoggle == 1) {
MUXBUTTONS[i]->Btoggle = 0;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 0, channel);
}
//*******************Toggle button LED Updates *******************************
if (MUXBUTTONS[1]->Btoggle == 1) {
digitalWrite(ledPin[0], HIGH);
}
if (MUXBUTTONS[1]->Btoggle == 0) {
digitalWrite(ledPin[0], LOW);
}
//********************************************************
if (MUXBUTTONS[2]->Btoggle == 1) {
digitalWrite(ledPin[1], HIGH);
}
if (MUXBUTTONS[2]->Btoggle == 0) {
digitalWrite(ledPin[1], LOW);
}
//**********************************************************
if (MUXBUTTONS[3]->Btoggle == 1) {
digitalWrite(ledPin[2], HIGH);
}
if (MUXBUTTONS[3]->Btoggle == 0) {
digitalWrite(ledPin[2], LOW);
}
//********************Chorus LEDS**************************
if (MUXBUTTONS[5]->Btoggle == 1) {
digitalWrite(ledPin[3], HIGH);
}
if (MUXBUTTONS[5]->Btoggle == 0) {
digitalWrite(ledPin[3], LOW);
}
if (MUXBUTTONS[6]->Btoggle == 1) {
digitalWrite(ledPin[4], HIGH);
}
if (MUXBUTTONS[6]->Btoggle == 0) {
digitalWrite(ledPin[4], LOW);
}
//********************************************************
if (MUXBUTTONS[11]->Btoggle == 1) {
digitalWrite(ledPin[5], HIGH);
}
if (MUXBUTTONS[11]->Btoggle == 0) {
digitalWrite(ledPin[5], LOW);
}
if (MUXBUTTONS[12]->Btoggle == 1) {
digitalWrite(ledPin[6], HIGH);
}
if (MUXBUTTONS[12]->Btoggle == 0) {
digitalWrite(ledPin[6], LOW);
}
//********************************************************
if (MUXBUTTONS[14]->Btoggle == 1) {
digitalWrite(ledPin[7], HIGH);
}
if (MUXBUTTONS[14]->Btoggle == 0) {
digitalWrite(ledPin[7], LOW);
}
if (MUXBUTTONS[15]->Btoggle == 1) {
digitalWrite(ledPin[12], HIGH);
}
if (MUXBUTTONS[15]->Btoggle == 0) {
digitalWrite(ledPin[12], LOW);
}
//*******************************************************
if (MUXBUTTONS[16]->Btoggle == 1) {
digitalWrite(ledPin[11], HIGH);
}
if (MUXBUTTONS[16]->Btoggle == 0) {
digitalWrite(ledPin[11], LOW);
}
if (MUXBUTTONS[17]->Btoggle == 1) {
digitalWrite(ledPin[10], HIGH);
}
if (MUXBUTTONS[17]->Btoggle == 0) {
digitalWrite(ledPin[10], LOW);
}
if (MUXBUTTONS[18]->Btoggle == 1) {
digitalWrite(ledPin[9], HIGH);
}
if (MUXBUTTONS[18]->Btoggle == 0) {
digitalWrite(ledPin[9], LOW);
}
//************************************************************************
if (MUXBUTTONS[22]->Btoggle == 1) {
digitalWrite(ledPin[8], HIGH);
}
if (MUXBUTTONS[22]->Btoggle == 0) {
digitalWrite(ledPin[8], LOW);
}
//************************Multifunction button updates********************************
break;
// 3 way button cycle
case 3:
if ((MUXBUTTONS[i]->B3way == 0) && (MUXBUTTONS[i]-> button_press == 0 )) {
MUXBUTTONS[i]->B3way = 1;
MUXBUTTONS[i]->button_press = 1;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 0, channel);
}
else if ((MUXBUTTONS[i]->B3way == 1) && (MUXBUTTONS[i]-> button_press == 1 )) {
MUXBUTTONS[i]->B3way = 2;
MUXBUTTONS[i]->button_press = 2;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 55, channel);
}
else if ((MUXBUTTONS[i]->B3way == 2) && (MUXBUTTONS[i]-> button_press == 2 )) {
MUXBUTTONS[i]->B3way = 3;
MUXBUTTONS[i]->button_press = 3;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 127, channel);
}
else if ((MUXBUTTONS[i]->B3way == 3) && (MUXBUTTONS[i]-> button_press == 3 )) {
MUXBUTTONS[i]->B3way = 0;
MUXBUTTONS[i]->button_press = 0;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 55, channel);
}
break;
// 4 way button cycle
case 4:
if ((MUXBUTTONS[i]->B4way == 0) && (MUXBUTTONS[i]-> button_press == 0)) {
MUXBUTTONS[i]->B4way = 1;
MUXBUTTONS[i]->button_press = 1;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 0, channel);
}
else if ((MUXBUTTONS[i]->B4way == 1 ) && (MUXBUTTONS[i]-> button_press == 1)) {
MUXBUTTONS[i]->B4way = 2;
MUXBUTTONS[i]->button_press = 2;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 40, channel);
}
else if ((MUXBUTTONS[i]->B4way == 2 ) && (MUXBUTTONS[i]-> button_press == 2)) {
MUXBUTTONS[i]->B4way = 3;
MUXBUTTONS[i]->button_press = 3;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 80, channel);
}
else if ((MUXBUTTONS[i]->B4way == 3 ) && (MUXBUTTONS[i]-> button_press == 3)) {
MUXBUTTONS[i]->B4way = 4;
MUXBUTTONS[i]->button_press = 4;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 120, channel);
}
else if ((MUXBUTTONS[i]->B4way == 4 ) && (MUXBUTTONS[i]-> button_press == 4)) {
MUXBUTTONS[i]->B4way = 3;
MUXBUTTONS[i]->button_press = 5;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 80, channel);
}
else if ((MUXBUTTONS[i]->B4way == 3 ) && (MUXBUTTONS[i]-> button_press == 5)) {
MUXBUTTONS[i]->B4way = 0;
MUXBUTTONS[i]->button_press = 0;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 40, channel);
}
//5 way button cycle
break;
case 5:
if ((MUXBUTTONS[i]->B5way == 0) && (MUXBUTTONS[i]-> button_press == 0)) {
MUXBUTTONS[i]->B5way = 1;
MUXBUTTONS[i]->button_press = 1;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 0, channel);
}
else if ((MUXBUTTONS[i]->B5way == 1 ) && (MUXBUTTONS[i]-> button_press == 1)) {
MUXBUTTONS[i]->B5way = 2;
MUXBUTTONS[i]->button_press = 2;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 30, channel);
}
else if ((MUXBUTTONS[i]->B5way == 2 ) && (MUXBUTTONS[i]-> button_press == 2)) {
MUXBUTTONS[i]->B5way = 3;
MUXBUTTONS[i]->button_press = 3;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 60, channel);
}
else if ((MUXBUTTONS[i]->B5way == 3 ) && (MUXBUTTONS[i]-> button_press == 3)) {
MUXBUTTONS[i]->B5way = 4;
MUXBUTTONS[i]->button_press = 4;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 90, channel);
}
else if ((MUXBUTTONS[i]->B5way == 4 ) && (MUXBUTTONS[i]-> button_press == 4)) {
MUXBUTTONS[i]->B5way = 5;
MUXBUTTONS[i]->button_press = 5;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 120, channel);
}
else if ((MUXBUTTONS[i]->B5way == 5 ) && (MUXBUTTONS[i]-> button_press == 5)) {
MUXBUTTONS[i]->B5way = 4;
MUXBUTTONS[i]->button_press = 6;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 90, channel);
}
else if ((MUXBUTTONS[i]->B5way == 4 ) && (MUXBUTTONS[i]-> button_press == 6)) {
MUXBUTTONS[i]->B5way = 3;
MUXBUTTONS[i]->button_press = 7;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 60, channel);
}
else if ((MUXBUTTONS[i]->B5way == 3 ) && (MUXBUTTONS[i]-> button_press == 7)) {
MUXBUTTONS[i]->B5way = 0;
MUXBUTTONS[i]->button_press = 0;
usbMIDI.sendControlChange(MUXBUTTONS[i]->Bvalue, 30, channel);
}
}
}
}
}
//**************************** End Code *****************************************