/* 
 *  generic program to provide examples for MIDI-Handling in the VMC-1
 *  
 */

String firmwareversion = "VMC-1_basic_1.0";
 
#include <EEPROM.h>
#include <MIDI.h>
#include <LiquidCrystal.h>#
//#include <EEPROM.h>
MIDI_CREATE_DEFAULT_INSTANCE();
LiquidCrystal lcd(2,3,4,5,6,7);

// Define inputs and outputs
const int button1Pin=8;   //PLAY
const int button2Pin=9;   //STOP
const int button3Pin=12;  //WRITE
const int button4Pin=11;  //F1
const int button5Pin=10;  //F2
const int clockInPin=13;  //CLOCK-IN

const int TempoCVPin = A0; // =Tempo potentiometer
const int CV1Pin = A1; // (5V or CV1-In) via CV1 potentiometer
const int CV2Pin = A2; // (5V or CV2-In) via CV2 potentiometer
const int clockOutPin = A5; //->sent via the clock-socket-switch to triggerPin


//Offset variables for the CV ins, for adopting to potentiometer variations
int maxOffTempoCV;
int maxOffCV1;
int maxOffCV2;



// Variables to handle the buttons and digital inputs
int button1StatePrev=0;
int button2StatePrev=0;
int button3StatePrev=0;
int button4StatePrev=0;
int button5StatePrev=0;
int clockInStatePrev=0;



// Variables to handle the generic status of the software
int menu=0;
int edit=0;
int runmode=0;
int writemode=0;
int maxmenu;
int adjuststep=0; //used for the poti adjustment procedure

//define parameter variables
int outchannel=1;
int inchannel=1;
int some_value=64;
int some_mode=3;


void setup()
{
   lcd.begin(16, 2);
   MIDI.begin();

   //write default values for parameters if EEPROM is blank
   if (EEPROM.read(1) == 255) EEPROM.write(4,1); //outchannel
   if (EEPROM.read(5) == 255) EEPROM.write(5,1); //inchannel
   if (EEPROM.read(8) == 255) EEPROM.write(8,3); //some_mode
   if (EEPROM.read(9) == 255) EEPROM.write(9,64); //some_value

   /* Read stored parameter values from EEPROM
    * Please don't use the first eight addresses
    * for your custom data.
    */
   // -not-inuse-but-reserved-==EEPROM.read(0);
   maxOffTempoCV=EEPROM.read(1);
   maxOffCV1=EEPROM.read(2);
   maxOffCV2=EEPROM.read(3);
   outchannel=EEPROM.read(4);
   inchannel=EEPROM.read(5);
   // -not-inuse-but-reserved-==EEPROM.read(6);
   // -not-inuse-but-reserved-==EEPROM.read(7);
   some_mode=EEPROM.read(8);
   some_value=EEPROM.read(9);


   //setup the inputs and outputs
   pinMode(button1Pin, INPUT);
   pinMode(button2Pin, INPUT);
   pinMode(button3Pin, INPUT);
   pinMode(button4Pin, INPUT);
   pinMode(button5Pin, INPUT);
   pinMode(clockInPin, INPUT);
   pinMode(TempoCVPin, INPUT);
   pinMode(CV1Pin, INPUT);
   pinMode(CV2Pin, INPUT);
   pinMode(clockOutPin, OUTPUT);

   //some default settings for MIDI (recommended, but not necessary)
   MIDI.setThruFilterMode(1);
   MIDI.turnThruOff();

   midireset();
      
   lcd.setCursor(0, 0); 
   lcd.print(firmwareversion);
   delay(1000);
   lcd.setCursor(0, 0);
   lcd.print(F("            "));  
   loadsequence();
      
   clearscreen();
        
}

// send all notes off commands in three variations
void midireset() {
   int i=0;
   for (i=0; i <= 126 ; i++) {
      // some synths expect NoteOn with velocity zero as NoteOff:
      MIDI.sendNoteOn(i,0,outchannel);
      // some synths expect a dedicated NoteOff command:
      MIDI.sendNoteOff(i,64,outchannel);
      delay(1);
   }
   //finally we send a AllNotesOff CC
   MIDI.sendControlChange(123,0,outchannel);
}

// a simple clearscreen:
void clearscreen(){
   lcd.setCursor(0,0);
   lcd.print(F("                "));
   lcd.setCursor(0,1);
   lcd.print(F("                "));
}

// a routine which adjusts the potentiometers
void adjustpotis() {
  unsigned long CV1raw=analogRead(CV1Pin) ;
  unsigned long CV2raw=analogRead(CV2Pin) ;
  unsigned long TempoCVraw=analogRead(TempoCVPin) ;

  if (adjuststep == 0) {
    while ((TempoCVraw + maxOffTempoCV) != 1023) {
      TempoCVraw=analogRead(TempoCVPin)+0.5 ;
      if ((TempoCVraw + maxOffTempoCV) < 1023) maxOffTempoCV++;
      if ((TempoCVraw + maxOffTempoCV) > 1023) maxOffTempoCV--;
      lcd.setCursor(0, 0);
      lcd.print("Tempo: ");
      lcd.print(TempoCVraw);
      lcd.print(" ");
      lcd.setCursor(0, 1);
      lcd.print("1023=");
      lcd.print(TempoCVraw + maxOffTempoCV);
      lcd.print(" ");
      lcd.print(maxOffTempoCV);
    }
    if ((TempoCVraw + maxOffTempoCV) == 1023 ) {
      clearscreen();
      lcd.setCursor(0, 0);
      lcd.print(F("Tempo is good!"));
      EEPROM.write(1,maxOffTempoCV);
      delay(1000);
      clearscreen();
      adjuststep=1;
    }
  }
         
  if (adjuststep == 1) {
    while ((CV1raw + maxOffCV1) != 1023) {
      CV1raw=analogRead(CV1Pin)+0.5 ;
      if ((CV1raw + maxOffCV1) < 1023) maxOffCV1++;
      if ((CV1raw + maxOffCV1) > 1023) maxOffCV1--;
      lcd.setCursor(0, 0);
      lcd.print("CV1: ");
      lcd.print(CV1raw);
      lcd.print(" ");
      lcd.setCursor(0, 1);
      lcd.print("1023=");
      lcd.print(CV1raw + maxOffCV1);
      lcd.print(" ");
      lcd.print(maxOffCV1);
    }
    if ((CV1raw + maxOffCV1) == 1023 ) {
      clearscreen();
      lcd.setCursor(0, 0);
      lcd.print(F("CV1 is good!"));
      EEPROM.write(2,maxOffCV1);
      delay(1000);
      clearscreen();
      adjuststep=2;
      }
    } 

  if (adjuststep == 2) {
    while ((CV2raw + maxOffCV2) != 1023) {
      CV2raw=analogRead(CV2Pin)+0.5 ;
      if ((CV2raw + maxOffCV2) < 1023) maxOffCV2++;
      if ((CV2raw + maxOffCV2) > 1023) maxOffCV2--;
      lcd.setCursor(0, 0);
      lcd.print("Tempo: ");
      lcd.print(CV2raw);
      lcd.print(" ");
      lcd.setCursor(0, 1);
      lcd.print("1023=");
      lcd.print(CV2raw + maxOffCV2);
      lcd.print(" ");
      lcd.print(maxOffCV2);
    }
    if ((CV2raw + maxOffCV2) == 1023 ) {
      clearscreen();
      lcd.setCursor(0, 0);
      lcd.print(F("CV2 is good!"));
      EEPROM.write(3,maxOffCV2);
      delay(1000);
      clearscreen();
      adjuststep=0;
      edit=0;
    }
  } 
}

// two routines for saving and loading data to/from EEPROM
void savesequence() {
   clearscreen();
   lcd.setCursor(1,1);
   lcd.print(F("SAVE"));
   /*
   // DO DATA SAVING HERE. EXAMPLE FROM SQ-3P:
   for (stepNumber=0; stepNumber < maxSteps; stepNumber++) {
      for (noteInChord=0; noteInChord < maxNotes; noteInChord++) {
          int address=((stepNumber * maxNotes ) + noteInChord) + 32;
          EEPROM.write(address,note[stepNumber][noteInChord]);
          lcd.setCursor(1,1);
          lcd.print(address);
      }
   }
   */
   //delay(1000); //PAUSE ONLY FOR DEMO REASONS
   lcd.setCursor(1,1);
   lcd.print(F("SAVE DONE     "));  
   clearscreen();
}

void loadsequence() {
   clearscreen();
   lcd.setCursor(0,0);
   lcd.print(F("LOAD"));
   /*
   // DO DATA LOADING HERE. EXAMPLE FROM SQ-3P:
   for (stepNumber=0; stepNumber < maxSteps; stepNumber++) {
      for (noteInChord=0; noteInChord < maxNotes; noteInChord++) {
          int address=((stepNumber * maxNotes ) + noteInChord) + 32;
          note[stepNumber][noteInChord]=EEPROM.read(address);
          if ( note[stepNumber][0] == 254 ) lastStep=stepNumber - 1; 
          lcd.setCursor(1,1);
          lcd.print(address);
      }
   }
   */
   lcd.setCursor(1, 1); 
   //delay(1000); //PAUSE ONLY FOR DEMO REASONS
   lcd.print(F("LOAD DONE      "));
   //delay(1000);
   clearscreen();
}


void loop()
{
   /* READ BUTTONS */ 
   int button1State=!digitalRead(button1Pin);
   int button2State=!digitalRead(button2Pin);
   int button3State=!digitalRead(button3Pin);
   int button4State=!digitalRead(button4Pin);
   int button5State=!digitalRead(button5Pin);
   unsigned long CV1raw=analogRead(CV1Pin) ;
   unsigned long CV2raw=analogRead(CV2Pin) ;
   unsigned long TempoCVraw=analogRead(TempoCVPin) ;
   unsigned long CV1=CV1raw + ((CV1raw + 1.0) / (1023.0 - maxOffCV1) * maxOffCV1 );
   unsigned long CV2=CV2raw + ((CV2raw + 1.0) / (1023.0 - maxOffCV2) * maxOffCV2 );
   unsigned long TempoCV=TempoCVraw + ((TempoCVraw + 1.0) / (1023.0 - maxOffTempoCV) * maxOffTempoCV );


   /* TIE plus REST will switch to setup - see below */
   if (button4State == 1 && button4StatePrev == 0 && button5State == 1 && button5StatePrev == 0) {
      button4StatePrev=1;
      button5StatePrev=1;
      clearscreen();
      menu=1;
   }
   if (button4State == 0 && button4StatePrev == 1 && button5State == 0 && button5StatePrev == 1) {
      button4StatePrev=0;
      button5StatePrev=0;
   }
   
   /* "menu == 0" is the status for normal operation.
    *  
    *  In this example simply the value provided by the potentiometers/CVs is displayed
    * 
    */
   if (menu == 0) { // NORMAL ACTION MODE

      /* TIE BUTTON SENDS ALLNOTESOFF */
      if (button4State == 1 && button4StatePrev == 0 && writemode == 0) {
         button4StatePrev=1;
         midireset();
      }
      if (button4State == 0 && button4StatePrev == 1 && writemode == 0) button4StatePrev=0;

      /* 
       * The PLAY and STOP buttons toggle the 'runmode' flag. 
       * The WRITE button toggles a 'writemode' flag. Which again
       * is reset bei PLAY or STOP.
       * But this is only an example coming from the original sequencer idea.
       * Of course there are scenario where this might make no sense.
       */
      
      /* PLAY BUTTON */
      if (button1State == 1 && button1StatePrev == 0 && runmode==0 && writemode == 0) { //PLAY
         button1StatePrev=1;
         runmode=1;
         writemode=0; 
         clearscreen();          
      }
      if (button1State == 0 && button1StatePrev == 1) button1StatePrev=0;


      /* STOP BUTTON */
      if (button2State == 1 && button2StatePrev == 0 && writemode == 0) { //STOP
         button2StatePrev=1;
         midireset();
         clearscreen();
         runmode=0;  
      }
      if (button2State == 0 && button2StatePrev == 1) button2StatePrev=0;


      /* WRITE BUTTON */
      if (button3State == 1 && button3StatePrev == 0 && runmode == 0 && writemode == 0) { //WRITE
         button3StatePrev=1;
         runmode=0;
         writemode=1; 
         clearscreen(); 
      }
      if (button3State == 0 && button3StatePrev == 1)  button3StatePrev=0;
   }


  /*
   * THIS IS NOW THE PLACE WHERE THE ACTION HAPPENS
   */

   /* STOP MODE */
   if (runmode == 0 && writemode == 0) {
      clearscreen();
      lcd.setCursor(0, 0);
      lcd.print(F("STOP"));
   } // END OF STOP MODE

   /* PLAY MODE */
   if (runmode == 1 && writemode == 0) {
      clearscreen();
      lcd.setCursor(0, 0);
      lcd.print(F("PLAY"));
      
      /* WE DISPLAY THE POTENTIOMETER VALUES TO HAVE SOMETHING HAPPEN IN PLAY MODE */
      lcd.setCursor(0, 0);
      lcd.print(F("Tempo CV1   CV2    "));
      lcd.setCursor(0, 1);
      lcd.print(TempoCV);
      lcd.print(F(" "));
      lcd.setCursor(5, 1);
      lcd.print(CV1);
      lcd.print(F(" "));
      lcd.setCursor(11, 1);
      lcd.print(CV2);
      lcd.print(F(" "));
   } // END OF PLAY MODE

   /* WRITE MODE - WE DON'T WRITE ANYTHING IN THIS EXAMPLE*/ 
   if (runmode == 0 && writemode == 1) {
      clearscreen();
      lcd.setCursor(0, 0);
      lcd.print(F("WRITE"));
     /* 
      * I USE A SEPARATE STOP FUNCTION IN WRITE MODE, 
      * AS WE USUALLY HAVE FINISH SOMETHING WHEN WRITE ENDS
      * WHICH WOULD NOT BE DONE WHEN PRESSING STOP IN PLAY MODE
      */
      if (button2State == 1 && button2StatePrev == 0 && writemode == 0) { //STOP
         button2StatePrev=1;
         writemode=0;  
      }
      if (button2State == 0 && button2StatePrev == 1) button2StatePrev=0;
   } // END OF WRITE MODE
   



   /*
    * The SETUP MODE 
    */
   if (menu > 0 ) { //SETUP
      lcd.setCursor(0,1);
      if (edit == 0) lcd.print(F(" "));
      if (edit == 1) lcd.print(F("!"));

      /* STOP+PLAY exits the setup */
      if ( button1State == 1 && button1StatePrev == 0 && button2State == 1 && button2StatePrev == 0 && menu > 0 && edit == 0) { 
         button1StatePrev = 1;
         button2StatePrev = 1;
         //clearscreen();
         lcd.setCursor(0, 0); 
         //if (runmode == 0) lcd.print(F("STOP"));
         //if (runmode == 1) lcd.print(F("PLAY"));
         menu=0;
      }

      /* MAXMENU DETERMINES HOW MANY MENU PAGES ARE AVAILABLE */
      maxmenu=8;
      
      
      /*
       * NAVIGATION THRU THE SETUPMENU
       */
      if (edit == 0) {
         if (button4State == 1 && button4StatePrev == 0) { // SCROLL THRU MENU DOWN BY PRESSING F1
          button4StatePrev=1;
          clearscreen();
          menu--;
          if (menu < 1) menu = maxmenu;
         }
         if (button4State == 0 && button4StatePrev == 1) {
            button4StatePrev=0;
         }
         
         if (button5State == 1 && button5StatePrev == 0) { // SCROLL THRU MENU UP BY PRESSING F2
            button5StatePrev=1;
            clearscreen();
            menu++;
            if (menu > maxmenu) menu = 1;
         }
         if (button5State == 0 && button5StatePrev == 1) {
            button5StatePrev=0;
         }
         
         if (button3State == 1 && button3StatePrev == 0) { // ENTER EDIT MODE BY PRESSING WRITE
            button3StatePrev=1;
            edit=1;           
         }
         if (button3State == 0 && button3StatePrev == 1) {
            button3StatePrev=0;
         }   
      } // END OF MENU NAVIGATION
      
      switch (menu) {
        /* THE VARIOUS MENU PAGES ARE DEFINED BY THE VARIABLE "menu"
         *  
         * PLAYMODE,Some_Mode,Some_Value 1,Some_Value 2,OutChannel,InChannel,LoadData,SaveData,Adjust Potis};
         * 0        1         2            3            4          5         6        7        8
         */
        case 1: //SOME MODE SWITCHING

           lcd.setCursor(0, 0); 
           lcd.print(F("SOME MODE       "));
           lcd.setCursor(1, 1); 
           if (some_mode==0) lcd.print(F("Mode 1       "));
           if (some_mode==1) lcd.print(F("Mode 2       "));
           if (some_mode==2) lcd.print(F("Mode 3       "));
           if (some_mode==3) lcd.print(F("Mode 4       "));
           if (edit == 1) {
              if (button4State == 1 && button4StatePrev == 0) { //DECREASE MODE
                 button4StatePrev=1;
                 if (some_mode > 0) some_mode--;
              }
              if (button4State == 0 && button4StatePrev == 1) {
                 button4StatePrev=0;
              }
      
              if (button5State == 1 && button5StatePrev == 0) { //INCREASE MODE
                 button5StatePrev=1;
                 if (some_mode < 3) some_mode++;
              }
              if (button5State == 0 && button5StatePrev == 1) {
                 button5StatePrev=0;
              }
              
              if (button3State == 1 && button3StatePrev == 0) { 
                 button3StatePrev=1;
                 if (some_mode == 0) some_mode=0;
                 EEPROM.write(1,some_mode);
                 delay(10);
                 edit=0;
              }
              if (button3State == 0 && button3StatePrev == 1) {
                 button3StatePrev=0;
              }
           }                      
        break;


        case 2: //'SOME VALUE' COUNTED FINE WITH ONE BUTTON, COARSE WITH TWO BUTTONS
           lcd.setCursor(0, 0); 
           lcd.print(F("SOME_VALUE V.1"));
           lcd.setCursor(1, 1); 
           lcd.print(some_value);
           lcd.print(F(" "));
           if (edit == 1 ){
              if (button4State == 1 && button4StatePrev == 0 && button5State == 0)  {
                some_value--;
                button4StatePrev=1;
              }

              if (button5State == 1 && button5StatePrev == 0 && button4State == 0) {
                some_value++;
                button5StatePrev=1;
              }

              if (button4State == 1 && button4StatePrev == 0 && button5State == 1)  {
                some_value=some_value + 10; 
                button4StatePrev=1;
              }

              if (button5State == 1 && button5StatePrev == 0 && button4State == 1) {
                some_value=some_value - 10; 
                button5StatePrev=1;
              }
              if (button4State == 0 && button4StatePrev == 1) button4StatePrev=0;
              if (button5State == 0 && button5StatePrev == 1) button5StatePrev=0;

              
              /* LIMIT THE RANGE OF VALUES TO 0-127 */
              if (some_value < 0) some_value=0;
              if (some_value > 127) some_value=127;

              
              if (button3State == 1 && button3StatePrev == 0) { 
                 button3StatePrev=1;
                 EEPROM.write(3,some_value);
                 delay(10);
                 edit=0;
              }
              if (button3State == 0 && button3StatePrev == 1) button3StatePrev=0;
           }
        break;

        case 3: // 'SOME-VALUE' COUNTED 1-19 by 1, 20-250 by 10
           lcd.setCursor(0, 0); 
           lcd.print(F("SOME_VALUE V.2"));
           lcd.setCursor(1, 1); 
           lcd.print(some_value);
           if (edit == 1) {
              if (button4State == 1 && button4StatePrev == 0) { //DECREASE VALUE
                 button4StatePrev=1;
                 if (some_value < 21 && some_value > 1) {
                    some_value = some_value - 1;
                 }
                 if (some_value >= 30) some_value = some_value - 10;
                 //lcd.setCursor(1, 1); 
                 //lcd.print(F("      "));
                 lcd.setCursor(1, 1); 
                 lcd.print(some_value);                 
                 lcd.print(F(" "));                 
              }
              if (button4State == 0 && button4StatePrev == 1)  button4StatePrev=0;
              
      
              if (button5State == 1 && button5StatePrev == 0) { //INCREASE CHANNEL
                 button5StatePrev=1;
                 if (some_value > 19 && some_value < 240) some_value = some_value + 10;
                 if (some_value < 20) some_value = some_value + 1;
                 lcd.setCursor(1, 1); 
                 lcd.print(F("      "));
                 lcd.setCursor(1, 1); 
                 lcd.print(some_value);                 
                 lcd.print(F(" "));                 
              }
              if (button5State == 0 && button5StatePrev == 1) button5StatePrev=0;

              
              if (button3State == 1 && button3StatePrev == 0) { 
                 button3StatePrev=1;
                 EEPROM.write(3,some_value);
                 delay(10);
                 edit=0;
              }
              if (button3State == 0 && button3StatePrev == 1) button3StatePrev=0;
           }                      
        break;
            
        case 4://OUTCHANNEL
           lcd.setCursor(0, 0); 
           lcd.print(F("OUTPUT CHANNEL "));
           lcd.setCursor(1, 1);
           //String stringChannel=String(outchannel);
           //stringChannel=stringChannel + "           ";
           lcd.print(outchannel);
           if (edit == 1) {
              if (button4State == 1 && button4StatePrev == 0) { //DECREASE CHANNEL
                 button4StatePrev=1;
                 if (outchannel > 1) outchannel--;
                 lcd.setCursor(1, 1); 
                 lcd.print(F("      "));
                 lcd.setCursor(1, 1); 
                 lcd.print(outchannel);                 

              }
              if (button4State == 0 && button4StatePrev == 1) button4StatePrev=0;

      
              if (button5State == 1 && button5StatePrev == 0) { //INCREASE CHANNEL
                 button5StatePrev=1;
                 if (outchannel < 16) outchannel++;
                 lcd.setCursor(1, 1); 
                 lcd.print(F("      "));
                 lcd.setCursor(1, 1); 
                 lcd.print(outchannel);              }
              if (button5State == 0 && button5StatePrev == 1) button5StatePrev=0;

              if (button3State == 1 && button3StatePrev == 0) { 
                 button3StatePrev=1;
                 EEPROM.write(4,outchannel);
                 delay(10);
                 edit=0;
              }
              if (button3State == 0 && button3StatePrev == 1) button3StatePrev=0;
           }                      
        break;

        case 5://INCHANNEL
           lcd.setCursor(0, 0); 
           lcd.print(F("INPUT CHANNEL  "));
           lcd.setCursor(1, 1);
           lcd.print(inchannel);
           if (edit == 1) {
              if (button4State == 1 && button4StatePrev == 0) { //DECREASE CHANNEL
                 button4StatePrev=1;
                 if (inchannel > 0) inchannel--;
                 lcd.setCursor(1, 1); 
                 lcd.print(F("      "));
                 lcd.setCursor(1, 1); 
                 lcd.print(inchannel);              }
              if (button4State == 0 && button4StatePrev == 1) button4StatePrev=0;
      
              if (button5State == 1 && button5StatePrev == 0) { //INCREASE CHANNEL
                 button5StatePrev=1;
                 if (inchannel < 16) inchannel++;
                 lcd.setCursor(1, 1); 
                 lcd.print(F("      "));
                 lcd.setCursor(1, 1); 
                 lcd.print(inchannel);              }
              if (button5State == 0 && button5StatePrev == 1) button5StatePrev=0;

              if (button3State == 1 && button3StatePrev == 0) { 
                 button3StatePrev=1;
                 EEPROM.write(5,inchannel);
                 delay(10);
                 edit=0;
              }
              if (button3State == 0 && button3StatePrev == 1) button3StatePrev=0;
           }                      
        break;

        case 6: //LOAD DATA
           if (edit == 0) {
              lcd.setCursor(0, 0); 
              lcd.print(F("LOAD DATA"));
              lcd.setCursor(1, 1); 
              lcd.print(F("PRESS 2xWRITE"));
           }
           if (edit == 1) {
              lcd.setCursor(0, 0); 
              lcd.print(F("LOAD PRESS WRITE"));
              lcd.setCursor(1, 1); 
              lcd.print(F("STOP FOR CANCEL"));          
              if (button3State == 1 && button3StatePrev == 0) {
                 runmode = 0;
                 button3StatePrev=1;
                 loadsequence();
                 delay(10);
                 edit=0;
                 clearscreen();
                 menu=0;          
              }
              if (button3State == 0 && button3StatePrev == 1) button3StatePrev=0;

              if (button2State == 1 && button2StatePrev == 0) { 
                 edit=0;
                 button2StatePrev=1;
              }
              if (button2State == 0 && button2StatePrev == 1) button2StatePrev=0;
           }                      
        break;

        case 7: //SAVE DATA
           if (edit == 0) {        
              lcd.setCursor(0, 0); 
              lcd.print(F("SAVE DATA"));
              lcd.setCursor(1, 1); 
              lcd.print(F("PRESS 2xWRITE"));
           }          
           if (edit == 1) {
              lcd.setCursor(0, 0); 
              lcd.print(F("SAVE PRESS WRITE"));
              lcd.setCursor(1, 1); 
              lcd.print(F("STOP FOR CANCEL"));          
              if (button3State == 1 && button3StatePrev == 0) { 
                 button3StatePrev=1;
                 savesequence();
                 edit=0;
                 lcd.setCursor(1, 1); 
                 lcd.print(F("SAVE DONE    "));
                 if (runmode == 0) delay(500);
                 clearscreen();
                 menu=0;          
              }
              if (button3State == 0 && button3StatePrev == 1) button3StatePrev=0;

              if (button2State == 1 && button2StatePrev == 0) { 
                 edit=0;
                 button2StatePrev=1;
              }
              if (button2State == 0 && button2StatePrev == 1) button2StatePrev=0;
           }                      
        break;
        
        case 8: //POTENTIOMETER ADJUSTMENT
           if (edit == 0) {
              lcd.setCursor(0, 0); 
              lcd.print(F("ADJUST POTI-CVs"));
              lcd.setCursor(1, 1); 
              lcd.print(F("PRESS WRITE")); 
           }          
         
              if (button3State == 1 && button3StatePrev == 0) {
                 button3StatePrev=1;
                 adjuststep=0;
                 edit=1;
              }
              if (button3State == 0 && button3StatePrev == 1) button3StatePrev=0;

              if (edit == 1) {
                 adjustpotis();
              }
        break;


        } // END OF SWITCH:CASE
   }  // END OF SETUP              
} // EndOfLoop
