#include <MIDI.h>
#include <RotaryEncoder.h>
#include <EEPROM.h>
#include <avr/pgmspace.h>
#include <Wire.h>
#include <U8g2lib.h>
//U8X8_SSD1306_128X64_NONAME_HW_I2C display(U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C display(/*U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
uint8_t midi_channel = 0;
MIDI_CREATE_DEFAULT_INSTANCE();
RotaryEncoder encoder(A2, A3);
uint8_t j = 0;
uint8_t modo = 0;
uint8_t pressionado = 0;
uint8_t BT[] = {3, 2, 5, 4};
uint8_t configline = 0;
uint8_t configlineMod = 0;
uint8_t banco_atual = 1;
uint8_t midi_Info [16];
uint8_t fx = 0;
uint8_t index;
int newPos = 0;
char buffer[5];
const char msg0[] PROGMEM = "B +";
const char msg1[] PROGMEM = "B -";
const char msg2[] PROGMEM = "TAP";
const char msg3[] PROGMEM = "P +";
const char msg4[] PROGMEM = "P -";
const char msg5[] PROGMEM = "ABC";
const char msg6[] PROGMEM = "STP";
const char msg7[] PROGMEM = "A 1";
const char msg8[] PROGMEM = "A 2";
const char msg9[] PROGMEM = "A 3";
const char msg10[] PROGMEM = "A 4";
const char msg11[] PROGMEM = "A 5";
const char msg12[] PROGMEM = "A 6";
const char msg13[] PROGMEM = "B 1";
const char msg14[] PROGMEM = "B 2";
const char msg15[] PROGMEM = "B 3";
const char msg16[] PROGMEM = "B 4";
const char msg17[] PROGMEM = "B 5";
const char msg18[] PROGMEM = "B 6";
const char msg19[] PROGMEM = "TUN";
const char msg20[] PROGMEM = "CTR";
const char msg21[] PROGMEM = "SCR";
const char msg22[] PROGMEM = "";
const char msg23[] PROGMEM = "";
const char* const string_table[] PROGMEM = {msg0, msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9,
msg10, msg11, msg12, msg13, msg14, msg15, msg16, msg17, msg18, msg19,
msg20, msg21, msg22, msg23
};
const uint8_t midi_CC[] = {23, 22, 76, 27, 26, 28, 28,
48, 49, 50, 51, 52, 53, 54,
55, 56, 57, 58, 59, 60, 73, 77
};
//- Modo[0] = Operação
//- Modo[1] = Configuração
//- Modo[2] = Escolha
void inicio() //****************************************************
{
//for (i = 0; i < 16; i++)EEPROM.write(i, 0);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
for (uint8_t i = 0; i < 16; i++) midi_Info[i] = midi_CC[EEPROM.read(i)];
display.clearDisplay();
display.setFont(u8g2_font_fub20_tr);
display.setCursor(30, 40);
display.print(F("MVS"));
display.sendBuffer();
delay(1000);
}
void setup() //****************************************************
{
//Serial.begin(115200);
Serial.begin(31250);
while (!Serial);
display.begin();
Wire.begin();
display.setPowerSave(0);
for (uint8_t i = 0; i < 4; i++) pinMode(BT[i], INPUT_PULLUP);
pinMode(7, INPUT);
//MIDI.begin(MIDI_CHANNEL_OMNI);//***********************
inicio();
showdisplay();
}
// BT ENVIA SINAL PARA PEDALEIRA -------------------
void Envia_Sinal() //****************************************************
{
display.clearDisplay();
display.setFont(u8g2_font_fub20_tr);
display.setCursor(40, 50);
strcpy_P(buffer, (char *)pgm_read_word(&(string_table[midi_Info[index + j]])));
display.print(buffer);
display.sendBuffer();
uint8_t midi_Value [16] = {0};
if (midi_Value[index + j] == 0)
{
midi_Value[index + j] = 127;
}
else
{
midi_Value[index + j] = 0;
}
//MIDI.sendControlChange (midi_Info[index + j], midi_Value[index + j], 1); //(CC msg, Variável, Channel)
mute();
MIDI.sendControlChange(midi_Info[index + j], midi_Value[index + j], 0xB0 | midi_channel);
delay(1000);
showdisplay();
}
void showdisplay() //****************************************************
{
display.setFont(u8g2_font_fub20_tr);
display.clearDisplay();
display.setCursor(55, 50);
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"));
display.setFont(u8g2_font_t0_11_tr);
display.setCursor(0, 25);
strcpy_P(buffer, (char *)pgm_read_word(&(string_table[midi_Info[index + 2]])));
display.print(buffer);
display.setCursor(0, 60);
strcpy_P(buffer, (char *)pgm_read_word(&(string_table[midi_Info[index + 0]])));
display.print(buffer);
display.setCursor(110, 25);
strcpy_P(buffer, (char *)pgm_read_word(&(string_table[midi_Info[index + 3]])));
display.print(buffer);
display.setCursor(110, 60);
strcpy_P(buffer, (char *)pgm_read_word(&(string_table[midi_Info[index + 1]])));
display.print(buffer);
display.setCursor(36, 8);
display.print(F("MODO LIVE"));
display.sendBuffer();
}
void showmenu() //****************************************************
{
display.clearDisplay();
display.setFont(u8g2_font_t0_11_tr);
display.setCursor(0, 8);
display.print(F("SAIR"));
display.setCursor(90, 8);
display.print(F("VOLTAR"));
configlineMod = configline % 24;
uint8_t Floor_Mod = floor(configlineMod / 4) * 4;
for (uint8_t o = Floor_Mod; o < (Floor_Mod + 4); o++)
{
strcpy_P(buffer, (char *)pgm_read_word(&(string_table[o])));
display.setCursor(80, 25 + 11 * (o - Floor_Mod));
display.print(buffer);
}
display.setCursor(70, 25 + 11 * (configlineMod % 4));
display.print(F(">"));
//display.drawRect(86, 19 + (11 * (configlineMod % 4)), 22, 12, WHITE);
display.setFont(u8g2_font_fub20_tr);
display.setCursor(15, 50);
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"));
display.print(j + 1);
display.sendBuffer();
}
void showoptions() //****************************************************
{
display.setFont(u8g2_font_fub20_tr);
display.clearDisplay();
display.setCursor(55, 50);
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"));
display.setFont(u8g2_font_t0_11_tr);
//display.drawRoundRect(20, 20, 88, 40, 4, WHITE);
display.setCursor(0, 25);
display.print(F("3"));
display.setCursor(0, 60);
display.print(F("1"));
display.setCursor(120, 25);
display.print(F("4"));
display.setCursor(120, 60);
display.print(F("2"));
display.setCursor(42, 8);
display.print(F("CONFIG"));
display.sendBuffer();
}
void loop() //****************************************************
{
static uint8_t pos = 0;
encoder.tick();
uint8_t newPos = encoder.getPosition();
for (uint8_t i = 0; i < 4; i++)
{
if (digitalRead(BT[i]) == LOW && modo == 0 && pressionado == 0) // PINO 2
{
j = i;
Envia_Sinal();
pressionado = 1;
}
}
if (digitalRead(BT[0]) == HIGH && digitalRead(BT[1]) == HIGH && digitalRead(BT[2]) == HIGH && digitalRead(BT[3]) == HIGH)
{
pressionado = 0;
}
//TELA DE ESCOLHA DO BOTÃO A CONFIGURAR
if (digitalRead(BT[j]) == LOW && modo == 1 && pressionado == 0)
{
fx = index + j;
showmenu();
modo = 2;
pressionado = 1;
delay(50);
}
//BT scroll para cima
if (newPos > pos && modo == 2 && configline > 0)
{
configline = configline - 1;
display.clearDisplay();
showmenu();
}
//BT scroll para cima
if (newPos < pos && modo == 2 && configline < 21)
{
configline = configline + 1;
display.clearDisplay();
showmenu();
}
//BT Seleciona
if (digitalRead(7) == LOW && pressionado == 0 && modo == 2)
{
midi_Info[fx] = configlineMod;
EEPROM.write(fx, configlineMod);
configline = 0;
configlineMod = 0;
//Floor_Mod = 0;
showoptions();
modo = 1;
pressionado = 1;
}
//BT SAIR
if (digitalRead(5) == LOW && pressionado == 0 && modo == 2)
{
showdisplay();
configline = 0;
configlineMod = 0;
//Floor_Mod = 0;
modo = 0;
pressionado = 1;
}
// BT VOLTAR
if (digitalRead(4) == LOW && pressionado == 0 && modo == 2)
{
configline = 0;
configlineMod = 0;
//Floor_Mod = 0;
showoptions();
modo = 1;
pressionado = 1;
}
// BANCO DOWN - MODO DE CONFIGURAÇÃO
if (newPos > pos && modo == 1 && banco_atual > 1)
{
banco_atual--;
index = ((banco_atual - 1) * 4);
showoptions();
pressionado = 1;
}
// BANCO UP - MODO DE CONFIGURAÇÃO
if (newPos < pos && modo == 1 && banco_atual < 4)
{
banco_atual++;
index = ((banco_atual - 1) * 4);
showoptions();
pressionado = 1;
}
// BANCO DOWN - MODO DE OPERAÇÃO
if (newPos > pos && modo == 0 && banco_atual > 1)
{
banco_atual--;
index = ((banco_atual - 1) * 4);
showdisplay();
}
// BANCO UP - MODO DE OPERAÇÃO
if (newPos < pos && modo == 0 && banco_atual < 4)
{
banco_atual++;
index = ((banco_atual - 1) * 4);
showdisplay();
}
unsigned long buttonPressTime;
if (digitalRead(7) == LOW && pressionado == 0 && modo == 0)
{
buttonPressTime = millis();
}
while (digitalRead(7) == LOW)
{
if (digitalRead(7) == LOW && millis() - buttonPressTime >= 2000 && modo == 0)
{
showoptions();
modo = 1;
pressionado = 1;
delay(50);
}
}
pos = newPos;
}