#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <avr/pgmspace.h>
#define progMemBuffer 128
#define BUTTON_UP_1_PIN 2
#define BUTTON_DOWN_1_PIN 3
#define BUTTON_UP_2_PIN 4
#define BUTTON_DOWN_2_PIN 5
#define POT_1_PIN A0
#define POT_2_PIN A1
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
//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 ";
//array of pointers to the above command strings
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};
// Function that finds the string in prog mem arrays and gets it into usable space
char buffer[progMemBuffer];
char* getStringfromProgMem(const char* const fxtable[], int i)
{
strcpy_P(buffer, (char*)pgm_read_word(&(fxtable[i])));
return buffer;
};
char lcd_line1[16];
char lcd_line2[16];
void LCD_Msg(LiquidCrystal_I2C &lcd, int top, int bottom, unsigned long del);
void Msg(LiquidCrystal_I2C &lcd, const char *top, const char *bottom, unsigned long del);
void setup()
{
pinMode(BUTTON_UP_1_PIN,INPUT);
pinMode(BUTTON_DOWN_1_PIN,INPUT);
pinMode(BUTTON_UP_2_PIN,INPUT);
pinMode(BUTTON_DOWN_2_PIN,INPUT);
lcd.init();
lcd.backlight();
lcd.print(" SeratoFxduino ");
lcd.setCursor(0,1);
lcd.print(" Midi controler ");
delay(1500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Initialisation ");
delay(1000);
lcd.clear();
delay(300);
lcd.setCursor(0,1);
lcd.print(" Terminee ! ");
delay(1000);
lcd.clear();
}
void loop()
{
potentiometre();
static int menuIndex1 = 0;
static int menuIndex2 = 0;
if (digitalRead(BUTTON_UP_1_PIN) == HIGH) {
if (menuIndex1 > 0) menuIndex1--;
} else if (digitalRead(BUTTON_DOWN_1_PIN) == HIGH) {
if (menuIndex1 < 56) menuIndex1++;
}
if (digitalRead(BUTTON_UP_2_PIN) == HIGH) {
if (menuIndex2 > 0) menuIndex2--;
} else if (digitalRead(BUTTON_DOWN_2_PIN) == HIGH) {
if (menuIndex2 < 56) menuIndex2++;
}
lcd.setCursor(0, 0);
strcpy_P(lcd_line1, (char*)pgm_read_word(&(fxtable[menuIndex1])));
lcd.print(lcd_line1);
lcd.setCursor(15, 0);
lcd.print("%");
lcd.setCursor(0, 1);
strcpy_P(lcd_line2, (char*)pgm_read_word(&(fxtable[menuIndex2])));
lcd.print(lcd_line2);
lcd.setCursor(15, 1);
lcd.print("%");
delay(110);
}
void potentiometre(){
int potValue1 = map(analogRead(POT_1_PIN), 0, 1023, 0, 100);
int potValue2 = map(analogRead(POT_2_PIN), 0, 1023, 0, 100);
if (potValue1<100){
lcd.setCursor(12, 0);
lcd.print(" ");
lcd.setCursor(13, 0);
lcd.print(potValue1);
}
else {
lcd.setCursor(12, 0);
lcd.print(potValue1);
}
if (potValue2<100){
lcd.setCursor(12, 1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(potValue2);
}
else {
lcd.setCursor(12, 1);
lcd.print(potValue2);
}}