#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
const int buttonPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int presetLedPins[] = {A0, A1, A2, A3, 12, 13};
const int individualLedPins[] = {10, 11};
const int potPins[] = {A6, A7};
const int numButtons = 8;
int buttonState[numButtons] = {HIGH};
int lastButtonState[numButtons] = {HIGH};
bool presetLedState[6] = {LOW};
bool individualLedState[2] = {LOW};
int potValues[2] = {0};
void setup() {
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
for (int i = 0; i < 6; i++) {
pinMode(presetLedPins[i], OUTPUT);
}
for (int i = 0; i < 2; i++) {
pinMode(individualLedPins[i], OUTPUT);
}
for (int i = 0; i < 2; i++) {
potValues[i] = analogRead(potPins[i]) / 8; // Map pot values to 0-127
}
MIDI.begin(MIDI_CHANNEL_OFF);
Serial.begin(115200); // Adjust baud rate as needed
}
void loop() {
readButtons();
readPotentiometers();
}
void readButtons() {
for (int i = 0; i < numButtons; i++) {
int currentState = digitalRead(buttonPins[i]);
if (currentState != lastButtonState[i]) {
if (currentState == LOW) {
handleButtonPress(i);
}
delay(50); // Debounce
}
lastButtonState[i] = currentState;
}
}
void handleButtonPress(int buttonIndex) {
if (buttonIndex < 6) {
// Preset buttons
for (int i = 0; i < 6; i++) {
presetLedState[i] = (i == buttonIndex);
}
updateLeds();
// Send programmable MIDI message based on button index
int midiValue = buttonIndex + 1; // You can adjust this value based on your requirements
MIDI.sendProgramChange(midiValue, 1);
Serial.println(midiValue);
} else {
// Individual buttons
int index = buttonIndex - 6;
individualLedState[index] = !individualLedState[index];
updateLeds();
// Send programmable MIDI message based on button index
int midiValue = buttonIndex + 1; // You can adjust this value based on your requirements
MIDI.sendControlChange(midiValue, individualLedState[index] ? 127 : 0, 1);
}
}
void updateLeds() {
for (int i = 0; i < 6; i++) {
digitalWrite(presetLedPins[i], presetLedState[i]);
}
for (int i = 0; i < 2; i++) {
digitalWrite(individualLedPins[i], individualLedState[i]);
}
}
void readPotentiometers() {
for (int i = 0; i < 2; i++) {
int newValue = analogRead(potPins[i]) / 8; // Map pot values to 0-127
if (newValue != potValues[i]) {
potValues[i] = newValue;
MIDI.sendControlChange(i + 1, potValues[i], 1); // You can adjust the CC numbers based on your requirements
}
}
}