#include <LiquidCrystal_I2C.h>
#include <avr/pgmspace.h>
#define SwitchMenu 10
#define LedPin 11
#define DISPLAYS 2
const int PINS[][3] = {{2,3,A0}, {4,5,A1}, {6,7,A2}, {8,9,A3}};
int VALUES[][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}};
LiquidCrystal_I2C LCD[] = {LiquidCrystal_I2C(0x27,16,2), LiquidCrystal_I2C(0x26,16,2)};
//Command Strings 12 charactere max
const char fx1[] PROGMEM = "Delay ";
const char fx2[] PROGMEM = "Echo ";
const char fx3[] PROGMEM = "Reverb ";
const char fx4[] PROGMEM = "Phaser ";
const char fx5[] PROGMEM = "Flanger ";
const char fx6[] PROGMEM = "LPF ";
const char fx7[] PROGMEM = "LFO Filter ";
const char fx8[] PROGMEM = "HPF ";
const char fx9[] PROGMEM = "Combo Filter";
const char fx10[] PROGMEM = "Pan Delay ";
const char fx11[] PROGMEM = "Distortion ";
const char fx12[] PROGMEM = "Version Echo";
const char fx13[] PROGMEM = "Epic Reverb ";
const char fx14[] PROGMEM = "EpicVerbDrop";
const char fx15[] PROGMEM = "Bit Crush ";
const char fx16[] PROGMEM = "Tremolo ";
const char fx17[] PROGMEM = "Transform ";
const char fx18[] PROGMEM = "Repeater ";
const char fx19[] PROGMEM = "Shredder ";
const char fx20[] PROGMEM = "Braker ";
const char fx21[] PROGMEM = "Brake Echo ";
const char fx22[] PROGMEM = "CleanEchoOut";
const char fx23[] PROGMEM = "Echo Out ";
const char fx24[] PROGMEM = "Fader/Echo ";
const char fx25[] PROGMEM = "Tape Echo ";
const char fx26[] PROGMEM = "CombTapeEcho";
const char fx27[] PROGMEM = "Twist Echo ";
const char fx28[] PROGMEM = "Looper ";
const char fx29[] PROGMEM = "Pitch Looper";
const char fx30[] PROGMEM = "Shuffler ";
const char fx31[] PROGMEM = "Time Stretch";
const char fx32[] PROGMEM = "Time Freeze ";
const char fx33[] PROGMEM = "SpiralEchoUp";
const char fx34[] PROGMEM = "Sp.Echo Down";
const char fx35[] PROGMEM = "Res LPF Auto";
const char fx36[] PROGMEM = "Res HPF Auto";
const char fx37[] PROGMEM = "AutoFilter ";
const char fx38[] PROGMEM = "Spiral Flang";
const char fx39[] PROGMEM = "Pitch Delay ";
const char fx40[] PROGMEM = "Chiptunes ";
const char fx41[] PROGMEM = "ShortCircuit";
const char fx42[] PROGMEM = "Shifter Lofi";
const char fx43[] PROGMEM = "Side Delay ";
const char fx44[] PROGMEM = "Crush Echo ";
const char fx45[] PROGMEM = "ParticleDela";
const char fx46[] PROGMEM = "Noise Sweep ";
const char fx47[] PROGMEM = "Noise Synth ";
const char fx48[] PROGMEM = "Sheppard Fil";
const char fx49[] PROGMEM = "UFO ";
const char fx50[] PROGMEM = "Space Verb ";
const char fx51[] PROGMEM = "Sp Verb Lift";
const char fx52[] PROGMEM = "Sp Verb Drop";
const char fx53[] PROGMEM = "Filter Echo ";
const char fx54[] PROGMEM = "Dub Echo ";
const char fx55[] PROGMEM = "Filter Gate ";
const char fx56[] PROGMEM = "Bass Ducker ";
const char fx57[] PROGMEM = "Noise Pulse ";
PGM_P const fxtable[] PROGMEM =
{fx1, fx2, fx3, fx4, fx5, fx6, fx7, fx8, fx9, fx10, fx11, fx12, fx13, fx14, fx15, fx16, fx17, fx18, fx19, fx20,
fx21, fx22, fx23, fx24, fx25, fx26, fx27, fx28, fx29, fx30, fx31, fx32, fx33, fx34, fx35, fx36, fx37, fx38, fx39,
fx40, fx41, fx42, fx43, fx44, fx45, fx46, fx47, fx48, fx49,fx50, fx51, fx52, fx53, fx54, fx55, fx56, fx57};
//Command Strings 12 charactere max
const char efx1[] PROGMEM = "Delay ";
const char efx2[] PROGMEM = "Echo ";
const char efx3[] PROGMEM = "Reverb ";
const char efx4[] PROGMEM = "Phaser ";
const char efx5[] PROGMEM = "Flanger ";
const char efx6[] PROGMEM = "LPF ";
const char efx7[] PROGMEM = "HPF ";
const char efx8[] PROGMEM = "Combo Filter";
const char efx9[] PROGMEM = "Distortion ";
const char efx10[] PROGMEM = "Pan Delay ";
const char efx11[] PROGMEM = "Epic Reverb ";
const char efx12[] PROGMEM = "Bit Crush ";
const char efx13[] PROGMEM = "Tremolo ";
const char efx14[] PROGMEM = "Repeater ";
const char efx15[] PROGMEM = "Braker ";
const char efx16[] PROGMEM = "Brake Echo ";
const char efx17[] PROGMEM = "Tape Echo ";
const char efx18[] PROGMEM = "Looper ";
const char efx19[] PROGMEM = "Time Stretch";
const char efx20[] PROGMEM = "SpiralEcho ";
const char efx21[] PROGMEM = "AutoFilter ";
const char efx22[] PROGMEM = "Spiral Flang";
const char efx23[] PROGMEM = "Pitch Delay ";
const char efx24[] PROGMEM = "Crush Echo ";
const char efx25[] PROGMEM = "ParticlDelay";
const char efx26[] PROGMEM = "Noise Sweep ";
const char efx27[] PROGMEM = "Sheppard Fil";
const char efx28[] PROGMEM = "Space Verb ";
const char efx29[] PROGMEM = "Filter Echo ";
const char efx30[] PROGMEM = "Filter Gate ";
const char efx31[] PROGMEM = "Noise Pulse ";
PGM_P const efxtable[] PROGMEM = {efx1, efx2, efx3, efx4, efx5, efx6, efx7, efx8, efx9, efx10, efx11, efx12, efx13, efx14, efx15, efx16, efx17, efx18, efx19, efx20,
efx21, efx22, efx23, efx24, efx25, efx26, efx27, efx28, efx29, efx30, efx31};
void setup() {
for(int i=0; i<DISPLAYS; i++) {
LCD[i].init();
LCD[i].backlight();
pinMode(PINS[i*2][0] , INPUT);
pinMode(PINS[i*2][1] , INPUT);
pinMode(PINS[i*2+1][0], INPUT);
pinMode(PINS[i*2+1][1], INPUT);
pinMode(SwitchMenu, INPUT);
pinMode(LedPin, OUTPUT);
}
LCD[0].print(" SeratoFxduino ");
LCD[0].setCursor(0,1);
LCD[0].print(" Midi controler ");
delay(1500);
LCD[0].clear();
LCD[0].setCursor(0,0);
LCD[0].print(" Initialisation ");
delay(1000);
LCD[0].clear();
delay(300);
LCD[0].setCursor(0,1);
LCD[0].print(" Terminee ! ");
delay(1000);
LCD[0].clear();
}
void loop() {
for(int i=0; i<DISPLAYS*2; i++) {
updatemenu(i);
update_potentiometre(i);
}
delay(110);
}
bool buttonState = false;
void updatemenu(int i){
buttonState = digitalRead(SwitchMenu); // Reads the value from the SwitchMenu
if (buttonState == LOW){
digitalWrite(LedPin, LOW); // Turn the LED off
update_button(i); // Calls the function update_button
}
else if (digitalRead(SwitchMenu) == HIGH) {
digitalWrite(LedPin, HIGH); // Turn the LED on
update_button1(i); // Calls the function update_button1
}
}
void update_button(int i) {
int value = VALUES[i][0];
if (value == -1 || digitalRead(PINS[i][1]) == HIGH) {
if (value < 56) value++;
} else if (digitalRead(PINS[i][0]) == HIGH) {
if (value > 0) value--;
}
if (VALUES[i][0] == value) return;
char buffer[13];
strcpy_P(buffer, (char*)pgm_read_word(&(fxtable[VALUES[i][0] = value])));
LCD[i/2].setCursor(0, i%2);
LCD[i/2].print(buffer);
}
void update_button1(int i) {
int value = VALUES[i][0];
if (value == -1 || digitalRead(3) == HIGH) {
if (value < 30) value++;
} else if (digitalRead(2) == HIGH) {
if (value > 0) value--;
}
if (VALUES[i][0] == value) return;
char buffer[13];
strcpy_P(buffer, (char*)pgm_read_word(&(fxtable[VALUES[i][0] = value])));
LCD[0].setCursor(0, i%1);
LCD[0].print(buffer);
}
void update_potentiometre(int i) {
int value = map(analogRead(PINS[i][2]), 0, 1023, 0, 100);
if (VALUES[i][1] == value) return;
char buf[4];
sprintf(buf, "%3d%%", VALUES[i][1] = value);
LCD[i/2].setCursor(12, i%2);
LCD[i/2].print(buf);
}