#include <SPI.h>
#include <Wire.h>
#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>
#include <RotaryEncoder.h>
#include <EEPROM.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSansBold9pt7b.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1);
RotaryEncoder encoder(26, 27);
uint8_t j = 0;
uint8_t midi_on_off[24] = {0};
uint8_t modo = 0;
uint8_t pressionado = 0;
const uint8_t BT[] = {4, 0, 2, 15, 16, 23};
const uint8_t LED[] = {32, 33, 25, 12, 5, 18};
int8_t configline[4][3] = {0};
int8_t CC_lim [2] = {-1, 77};
uint8_t position[2] = {0};
uint8_t modPosition = 0;
uint8_t page = 0;
uint8_t banco_atual = 1;
uint8_t fx = 0;
uint8_t index_ = 0;
uint8_t selecionado[2] = {0};
uint8_t Name[3] = {32, 32, 32};
uint8_t disp = 0;
uint8_t limiteFx[2] = {11, 3};
long inicioTempo;
MIDI_CREATE_DEFAULT_INSTANCE();
void setup() //*************************************************************************************************************
{
//Serial.begin(31250);
Serial.begin(115200);
//MIDI.setHandleError(handleError);
MIDI.begin(MIDI_CHANNEL_OMNI);
Wire.begin();
EEPROM.begin(1024);
/*
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
*/
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
for (uint8_t i = 0; i < 6; i++)
{
pinMode(BT[i], INPUT_PULLUP);
pinMode(LED[i], OUTPUT);
}
pinMode(14, INPUT_PULLUP);
firstAcess();
//delay(100);
display.clearDisplay();
display.setFont(&FreeSansBold9pt7b);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(23, 47);
display.print(F("MVS"));
display.display();
delay(3000);
showdisplay();
}
// BT ENVIA SINAL PARA PEDALEIRA
void Envia_Sinal() //*************************************************************************************************************
{
if (midi_on_off[index_ + j] == 0)
{
for (uint8_t i = 0; i < (EEPROM.read(700 + index_ + j)); i++)
{
MIDI.sendControlChange(EEPROM.read((i * 20) + index_ + j),
EEPROM.read((i * 20) + 200 + index_ + j), 1);
delay(30);
}
digitalWrite(LED[j], HIGH);
midi_on_off[index_ + j] = 1;
}
else
{
for (uint8_t i = 0; i < (EEPROM.read(700 + index_ + j)); i++)
{
MIDI.sendControlChange(EEPROM.read((i * 20) + index_ + j),
EEPROM.read((i * 20) + 100 + index_ + j), 1);
delay(30);
}
digitalWrite(LED[j], LOW);
midi_on_off[index_ + j] = 0;
}
display.clearDisplay();
display.setFont(&FreeSansBold9pt7b);
display.setTextSize(2);
uint8_t i = 0;
uint8_t cursorX = 0;
display.setCursor(i, 47);
display.write(EEPROM.read(400 + index_ + j));
display.write(EEPROM.read(500 + index_ + j));
display.write(EEPROM.read(600 + index_ + j));
cursorX = (128 - display.getCursorX()) / 2;
display.clearDisplay();
display.setCursor(cursorX, 47);
display.write(EEPROM.read(400 + index_ + j));
display.write(EEPROM.read(500 + index_ + j));
display.write(EEPROM.read(600 + index_ + j));
display.display();
ledControl();
pressionado = 1;
inicioTempo = millis();
//delay(1000);
//showdisplay();
}
void ledControl()
{
//led control
for (uint8_t k = (banco_atual - 1) * 6; k < (banco_atual) * 6; k++)
{
digitalWrite(LED[(k) % 6], LOW);
if (midi_on_off[k] == 1)
{
digitalWrite(LED[(k) % 6], HIGH);
}
}
}
void showdisplay() //*************************************************************************************************************
{
display.setFont(&FreeSans9pt7b);
display.setTextSize(1);
uint8_t cursorX[4] = {0};
display.setCursor(0, 62);
display.write(EEPROM.read(400 + index_ + 1));
display.write(EEPROM.read(500 + index_ + 1));
display.write(EEPROM.read(600 + index_ + 1));
cursorX[0] = (128 - display.getCursorX())/2;
display.setCursor(0, 37);
display.write(EEPROM.read(400 + index_ + 2));
display.write(EEPROM.read(500 + index_ + 2));
display.write(EEPROM.read(600 + index_ + 2));
cursorX[1] = 128 - display.getCursorX();
display.setCursor(0, 37);
display.write(EEPROM.read(400 + index_ + 4));
display.write(EEPROM.read(500 + index_ + 4));
display.write(EEPROM.read(600 + index_ + 4));
cursorX[2] = (128 - display.getCursorX())/2;
display.setCursor(0, 37);
display.write(EEPROM.read(400 + index_ + 5));
display.write(EEPROM.read(500 + index_ + 5));
display.write(EEPROM.read(600 + index_ + 5));
cursorX[3] = 128 - display.getCursorX();
display.clearDisplay();
display.setFont(&FreeSans9pt7b);
display.setTextSize(1);
display.setCursor(0, 37);
display.write(EEPROM.read(400 + index_ + 3));
display.write(EEPROM.read(500 + index_ + 3));
display.write(EEPROM.read(600 + index_ + 3));
display.setCursor(0, 62);
display.write(EEPROM.read(400 + index_ + 0));
display.write(EEPROM.read(500 + index_ + 0));
display.write(EEPROM.read(600 + index_ + 0));
display.setCursor(cursorX[0], 62);
display.write(EEPROM.read(400 + index_ + 1));
display.write(EEPROM.read(500 + index_ + 1));
display.write(EEPROM.read(600 + index_ + 1));
display.setCursor(cursorX[1], 62);
display.write(EEPROM.read(400 + index_ + 2));
display.write(EEPROM.read(500 + index_ + 2));
display.write(EEPROM.read(600 + index_ + 2));
display.setCursor(cursorX[2], 37);
display.write(EEPROM.read(400 + index_ + 4));
display.write(EEPROM.read(500 + index_ + 4));
display.write(EEPROM.read(600 + index_ + 4));
display.setCursor(cursorX[3], 37);
display.write(EEPROM.read(400 + index_ + 5));
display.write(EEPROM.read(500 + index_ + 5));
display.write(EEPROM.read(600 + index_ + 5));
display.setFont(&FreeSansBold9pt7b);
display.setCursor(30, 14);
display.print(F("LIVE - "));
if (banco_atual == 1) display.print(F("A"));
if (banco_atual == 2) display.print(F("B"));
if (banco_atual == 3) display.print(F("C"));
if (banco_atual == 4) display.print(F("D"));
if (banco_atual == 5) display.print(F("E"));
if (banco_atual == 6) display.print(F("F"));
display.display();
disp = 1;
}
void showmenu() //*************************************************************************************************************
{
uint8_t cursor[4] = {0};
//display.setFont(&FreeSans9pt7b);
display.setFont(&FreeSans9pt7b);
display.setTextSize(2);
display.setCursor(0, 33);
display.print(page + 1);
cursor[0] = (25 - display.getCursorX()) / 2;
display.setTextSize(1);
for (uint8_t i = 1; i < 4; i++)
{
display.setCursor(0, 33);
display.print(configline[page][i - 1]);
cursor[i] = 120 - display.getCursorX();
}
display.setTextColor(WHITE);
display.setFont(&FreeSansBold9pt7b);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 14);
display.print(F("BACK"));
display.setCursor(76, 14);
display.print(F("NEXT"));
display.display();
display.drawRect(124, 20, 4, 44, WHITE);
display.fillRect(124, 20 + ceil(2.8333 * position[0]), 4, 8, WHITE);
display.setFont(&FreeSans9pt7b);
display.setTextSize(2);
display.setCursor(cursor[0], 52);
display.print(page + 1);
display.drawRoundRect(0, 22, 25, 38, 0, WHITE);
display.setTextSize(1);
if (selecionado[0] == 0)
{
display.drawRoundRect(28, 16 + modPosition * 15, 95, 17, 3, WHITE);
display.setTextColor(WHITE);
display.setCursor(30, 30);
display.print(F("CC#"));
display.setCursor(70, 30);
display.print(F(":"));
display.setCursor(cursor[1], 30);
display.print(configline[page][0]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 45);
display.print(F("Start"));
display.setCursor(70, 45);
display.print(F(":"));
display.setCursor(cursor[2], 45);
display.print(configline[page][1]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 60);
display.print(F("End"));
display.setCursor(70, 60);
display.print(F(":"));
display.setCursor(cursor[3], 60);
display.print(configline[page][2]);
display.display();
}
if (selecionado[0] == 1)
{
if (modPosition == 0)
{
display.fillRoundRect(28, 16, 98, 17, 3, WHITE);
display.setTextColor(BLACK);
display.setCursor(30, 30);
display.print(F("CC#"));
display.setCursor(70, 30);
display.print(F(":"));
display.setCursor(cursor[1], 30);
display.print(configline[page][0]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 45);
display.print(F("Start"));
display.setCursor(70, 45);
display.print(F(":"));
display.setCursor(cursor[2], 45);
display.print(configline[page][1]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 60);
display.print(F("End"));
display.setCursor(70, 60);
display.print(F(":"));
display.setCursor(cursor[3], 60);
display.print(configline[page][2]);
display.display();
}
if (modPosition == 1)
{
display.setTextColor(WHITE);
display.setCursor(30, 30);
display.print(F("CC#"));
display.setCursor(70, 30);
display.print(F(":"));
display.setCursor(cursor[1], 30);
display.print(configline[page][0]);
display.display();
display.fillRoundRect(28, 31, 98, 17, 3, WHITE);
display.setTextColor(BLACK);
display.setCursor(30, 45);
display.print(F("Start"));
display.setCursor(70, 45);
display.print(F(":"));
display.setCursor(cursor[2], 45);
display.print(configline[page][1]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 60);
display.print(F("End"));
display.setCursor(70, 60);
display.print(F(":"));
display.setCursor(cursor[3], 60);
display.print(configline[page][2]);
display.display();
}
if (modPosition == 2)
{
display.setTextColor(WHITE);
display.setCursor(30, 30);
display.print(F("CC#"));
display.setCursor(70, 30);
display.print(F(":"));
display.setCursor(cursor[1], 30);
display.print(configline[page][0]);
display.display();
display.setTextColor(WHITE);
display.setCursor(30, 45);
display.print(F("Start"));
display.setCursor(70, 45);
display.print(F(":"));
display.setCursor(cursor[2], 45);
display.print(configline[page][1]);
display.display();
display.fillRoundRect(28, 46, 98, 17, 3, WHITE);
display.setTextColor(BLACK);
display.setCursor(30, 60);
display.print(F("End"));
display.setCursor(70, 60);
display.print(F(":"));
display.setCursor(cursor[3], 60);
display.print(configline[page][2]);
display.display();
}
}
}
void showSave()//*************************************************************************************************************
{
display.setTextColor(WHITE);
display.setFont(&FreeSansBold9pt7b);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 14);
display.print(F("BACK"));
display.setCursor(76, 14);
display.print(F("SAVE"));
display.display();
display.setFont(&FreeSans9pt7b);
display.setCursor(5, 45);
display.print(F("Name:"));
uint8_t posChar[4];
display.setCursor(65, 45);
posChar[0] = 67;
display.write(Name[0]);
posChar[1] = display.getCursorX();
display.write(Name[1]);
posChar[2] = display.getCursorX();
display.write(Name[2]);
posChar[3] = display.getCursorX();
if (selecionado[1] == 0)
{
display.setCursor(posChar[position[1]], 48);
display.print(F("_"));
display.display();
}
display.setCursor(65, 45);
display.write(Name[0]);
display.write(Name[1]);
display.write(Name[2]);
if (selecionado[1] == 1)
{
display.setTextColor(BLACK);
display.setCursor(posChar[position[1]], 48);
display.print(F("_"));
display.display();
display.fillRect(posChar[position[1]] - 1, 31, posChar[position[1] + 1] - posChar[position[1]] + 4, 21, WHITE);
display.setCursor(posChar[position[1]], 48);
display.write(Name[position[1]]);
//display.setTextColor(WHITE);
}
display.display();
}
void showoptions() //*************************************************************************************************************
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setFont(&FreeSans9pt7b);
display.setTextSize(1);
display.setCursor(0, 62);
display.print(F("1"));
display.setCursor(60, 62);
display.print(F("2"));
display.setCursor(115, 62);
display.print(F("3"));
display.setCursor(0, 37);
display.print(F("4"));
display.setCursor(60, 37);
display.print(F("5"));
display.setCursor(115, 37);
display.print(F("6"));
//display.setFont(&FreeSans9pt7b);
display.setFont(&FreeSansBold9pt7b);
display.setCursor(14, 14);
display.print(F("CONFIG - "));
if (banco_atual == 1) display.print(F("A"));
if (banco_atual == 2) display.print(F("B"));
if (banco_atual == 3) display.print(F("C"));
if (banco_atual == 4) display.print(F("D"));
if (banco_atual == 5) display.print(F("E"));
if (banco_atual == 6) display.print(F("F"));
//display.setCursor(62, 62);
//display.print(F("."));
display.display();
}
void loop() //*************************************************************************************************************
{
static uint8_t pos = 0;
encoder.tick();
uint8_t newPos = encoder.getPosition();
unsigned long buttonPressTime;
if (digitalRead(BT[0]) == HIGH && digitalRead(BT[1]) == HIGH && digitalRead(BT[2]) == HIGH && digitalRead(BT[3]) == HIGH && digitalRead(BT[4]) == HIGH && digitalRead(BT[5]) == HIGH && digitalRead(14) == HIGH)
{
pressionado = 0;
buttonPressTime = millis();
}
for (uint8_t l = 0; l < 6; l++)
{
if (digitalRead(BT[l]) == LOW && pressionado == 0) // PINO 2
{
j = l;
}
}
//********************************* MODO 0 *********************************
if (pressionado == 0)
{
if (modo == 0)
{
for (uint8_t l = 0; l < 6; l++)
{
if (digitalRead(BT[l]) == LOW) // PINO 2
{
Envia_Sinal();
pressionado = 1;
disp = 0;
delay(200);
}
}
if (digitalRead(14) == LOW)
{
buttonPressTime = millis();
}
while (digitalRead(14) == LOW)
{
if (digitalRead(14) == LOW && millis() - buttonPressTime >= 3000)
{
modo = 1;
pressionado = 1;
showoptions();
}
}
if (millis() - inicioTempo >= 1000 && disp == 0)
{
showdisplay();
}
// BANCO DOWN - MODO DE OPERAÇÃO
if (newPos > pos && banco_atual > 1)
{
banco_atual--;
index_ = ((banco_atual - 1) * 6);
showdisplay();
ledControl();
}
// BANCO UP - MODO DE OPERAÇÃO
if (newPos < pos && banco_atual < 4)
{
banco_atual++;
index_ = ((banco_atual - 1) * 6);
showdisplay();
ledControl();
}
}
//********************************* MODO 1 *********************************
if (modo == 1)
{
//TELA DE ESCOLHA DO BOTÃO A CONFIGURAR
if (digitalRead(BT[j]) == LOW)
{
fx = index_ + j;
uint8_t u = 0;
for (uint8_t i = 0; i < 4; i++)
{
configline[i][0] = EEPROM.read(u + 0 + fx);
configline[i][1] = EEPROM.read(u + 100 + fx);
configline[i][2] = EEPROM.read(u + 200 + fx);
u = u + 20;
}
selecionado[0] = 0;
position[0] = 0;
modPosition = position[0] % 3;
page = floor(position[0] / 3);
limiteFx[1] = EEPROM.read(700 + fx);
modo = 2;
pressionado = 1;
showmenu();
delay(200);
}
// BANCO DOWN - MODO DE CONFIGURAÇÃO
if (newPos > pos && banco_atual > 1)
{
banco_atual--;
index_ = ((banco_atual - 1) * 6);
pressionado = 1;
showoptions();
}
// BANCO UP - MODO DE CONFIGURAÇÃO
if (newPos < pos && banco_atual < 4)
{
banco_atual++;
index_ = ((banco_atual - 1) * 6);
pressionado = 1;
showoptions();
}
//BT VOLTAR
if (digitalRead(14) == LOW)
{
modo = 0;
pressionado = 1;
showdisplay();
delay(200);
}
}
//********************************* MODO 2 *********************************
//BT scroll para baixo
if (modo == 2)
{
if (selecionado[0] == 0)
{
if (newPos > pos && position[0] > 0)
{
position[0] = position[0] - 1;
modPosition = position[0] % 3;
page = floor(position[0] / 3);
if (configline[page][0] == -1 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 11;
}
display.clearDisplay();
showmenu();
}
//BT scroll para cima
else if (newPos < pos && position[0] < limiteFx[0])
{
position[0] = position[0] + 1;
modPosition = position[0] % 3;
page = floor(position[0] / 3);
if (configline[page][0] == -1 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 11;
}
display.clearDisplay();
showmenu();
}
else if (digitalRead(14) == LOW)
{
selecionado[0] = 1;
pressionado = 1;
showmenu();
delay(200);
}
}
else
{
if (newPos > pos && configline[page][modPosition] > CC_lim[0])
{
configline[page][modPosition] = configline[page][modPosition] - 1;
if (configline[page][0] == -1 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 11;
}
display.clearDisplay();
showmenu();
}
else if (newPos < pos && configline[page][modPosition] < CC_lim[1])
{
configline[page][modPosition] = configline[page][modPosition] + 1;
if (configline[page][0] == -1 && page > 0)
{
limiteFx[1] = page;
limiteFx[0] = position[0];
}
else {
limiteFx[1] = 4;
limiteFx[0] = 11;
}
display.clearDisplay();
showmenu();
}
else if (digitalRead(14) == LOW)
{
selecionado[0] = 0;
pressionado = 1;
showmenu();
delay(200);
}
}
if (modPosition == 0)
{
CC_lim[1] = 77;
CC_lim[0] = -1;
}
else
{
CC_lim[1] = 127;
CC_lim[0] = 0;
}
//BT NEXT
if (digitalRead(BT[5]) == LOW)
{
uint8_t u = 0;
for (uint8_t i = 0; i < 4; i++)
{
EEPROM.write(u + 0 + fx, configline[i][0]);
EEPROM.write(u + 100 + fx, configline[i][1]);
EEPROM.write(u + 200 + fx, configline[i][2]);
u = u + 20;
}
EEPROM.commit();
Name[0] = EEPROM.read(400 + fx);
Name[1] = EEPROM.read(500 + fx);
Name[2] = EEPROM.read(600 + fx);
selecionado[1] = 0;
position[1] = 0;
modPosition = position[0] % 3;
modo = 3;
pressionado = 1;
showSave();
delay(200);
}
// BT VOLTAR
if (digitalRead(BT[3]) == LOW)
{
modo = 1;
pressionado = 1;
showoptions();
delay(200);
}
}
//********************************* MODO 3 *********************************
if (modo == 3) //32 a 122
{
if (newPos > pos && position[1] > 0 && selecionado[1] == 0)
{
position[1] = position[1] - 1;
display.clearDisplay();
showSave();
}
//BT scroll para baixo
if (newPos < pos && position[1] < 2 && selecionado[1] == 0)
{
position[1] = position[1] + 1;
display.clearDisplay();
showSave();
}
if (newPos > pos && selecionado[1] == 1)
{
Name[position[1]] = Name[position[1]] - 1;
if (Name[position[1]] < 32) {
Name[position[1]] = 122;
}
display.clearDisplay();
showSave();
}
if (newPos < pos && selecionado[1] == 1)
{
Name[position[1]] = Name[position[1]] + 1 ;
if (Name[position[1]] > 122) {
Name[position[1]] = 32;
}
display.clearDisplay();
showSave();
}
//BT Seleciona
if (digitalRead(14) == LOW)
{
if (selecionado[1] == 0)
{
selecionado[1] = 1;
}
else
{
selecionado[1] = 0;
}
pressionado = 1;
showSave();
delay(200);
}
//BT SAVE
if (digitalRead(BT[5]) == LOW)
{
for (uint8_t i = 0; i < 3; i++)
{
EEPROM.write(400 + i * 100 + fx, Name[i]);
}
selecionado[1] = 0;
showSave();
limiteFx[0] = 11;
EEPROM.write(700 + fx, limiteFx[1]);
//EEPROM.commit();
modo = 0;
pressionado = 1;
delay(200);
showdisplay();
}
// BT VOLTAR
if (digitalRead(BT[3]) == LOW)
{
selecionado[1] = 0;
showSave();
modo = 2;
pressionado = 1;
showmenu();
delay(200);
}
}
}
pos = newPos;
delay(10);
}
void firstAcess()
{
for (uint8_t i = 0; i < 80; i++) EEPROM.write(i, 10);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 80; i++) EEPROM.write(100 + i, 0);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 80; i++) EEPROM.write(200 + i, 127);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 24; i++) EEPROM.write(400 + i, i + 49);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 24; i++) EEPROM.write(500 + i, 105);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 24; i++) EEPROM.write(600 + i, 110);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 24; i++) EEPROM.write(700 + i, 1);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
//FOOT 1: SN1
EEPROM.write(0, 25);
EEPROM.write(100, 1);
EEPROM.write(200, 1);
EEPROM.write(400, 83);
EEPROM.write(500, 78);
EEPROM.write(600, 49);
//FOOT 2: SN2
EEPROM.write(1, 25);
EEPROM.write(101, 2);
EEPROM.write(201, 2);
EEPROM.write(401, 83);
EEPROM.write(501, 78);
EEPROM.write(601, 50);
//FOOT 3: SN3
EEPROM.write(2, 25);
EEPROM.write(102, 3);
EEPROM.write(202, 3);
EEPROM.write(402, 83);
EEPROM.write(502, 78);
EEPROM.write(602, 51);
//FOOT 4: P -
EEPROM.write(3, 26);
EEPROM.write(103, 1);
EEPROM.write(203, 1);
EEPROM.write(403, 80);
EEPROM.write(503, 32);
EEPROM.write(603, 45);
//FOOT 5: P +
EEPROM.write(4, 27);
EEPROM.write(104, 1);
EEPROM.write(204, 1);
EEPROM.write(404, 80);
EEPROM.write(504, 32);
EEPROM.write(604, 43);
//FOOT 6: MOD
EEPROM.write(5, 29);
EEPROM.write(105, 0);
EEPROM.write(205, 127);
EEPROM.write(405, 77);
EEPROM.write(505, 79);
EEPROM.write(605, 68);
EEPROM.commit();
}