//Author: Spaghettibrot
//Created using Autodesk Tinkercad Circuits

#include <LiquidCrystal_I2C.h>

int Button2StateOld = 0;

int Button2StateCurrent = 0;

int Button3StateCurrent = 0;

int Button3StateOld = 0;

int Button4StateCurrent = 0;

int Button4StateOld = 0;

int Button5StateCurrent = 0;

int Button5StateOld = 0;

int Button6StateCurrent = 0;

int Button6StateOld = 0;

int Button7StateCurrent = 0;

int Button7StateOld = 0;

int Button8StateCurrent = 0;

int Button8StateOld = 0;

int Button9StateCurrent = 0;

int Button9StateOld = 0;

int NoteC5 = 0;

int NoteD5 = 0;

int NoteE5 = 0;

int NoteF5 = 0;

int NoteG5 = 0;

int NoteA5 = 0;

int NoteB5 = 0;

int NoteC6 = 0;

int ButtonOctUpCurrent = 0;

int ButtonOctUpOld = 0;

int ButtonOctDownCurrent = 0;

int ButtonOctDownOld = 0;

int ButtonShowSongCurrent = 0;

int ButtonShowSongOld = 0;

int CurrentSongIndice = 0;

int debounceDelayms = 0;

LiquidCrystal_I2C lcd_1(0x27, 16, 2);

void setup()
{
  lcd_1.init();
  lcd_1.backlight();
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(13, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  Serial.begin(9600);

  lcd_1.print("Doodlebox");
  Button2StateOld = digitalRead(2);
  Button3StateOld = digitalRead(3);
  Button4StateOld = digitalRead(4);
  Button5StateOld = digitalRead(5);
  Button6StateOld = digitalRead(6);
  Button7StateOld = digitalRead(7);
  Button8StateOld = digitalRead(8);
  Button9StateOld = digitalRead(9);
  NoteC5 = 60;
  NoteD5 = 62;
  NoteE5 = 64;
  NoteF5 = 65;
  NoteG5 = 67;
  NoteA5 = 69;
  NoteB5 = 71;
  NoteC6 = 72;
  debounceDelayms=0;
}

void loop()
{

  ButtonShowSongCurrent = digitalRead(10);
  if (ButtonShowSongOld == 1 && ButtonShowSongCurrent == 0) {   
    if (CurrentSongIndice == 0) {
      lcd_1.clear();
      lcd_1.setCursor(0, 0);
      lcd_1.print("Happy Birthday");
      lcd_1.setCursor(0, 1);
      lcd_1.print("CCD CFE");
    }
    if (CurrentSongIndice == 1) {
      lcd_1.clear();
      lcd_1.setCursor(0, 0);
      lcd_1.print("Jingle Bells");
      lcd_1.setCursor(0, 1);
      lcd_1.print("EEE EEE EGC DE");
    }
    if (CurrentSongIndice == 2) {
      lcd_1.clear();
      lcd_1.setCursor(0, 0);
      lcd_1.print("Frere Jacques");
      lcd_1.setCursor(0, 1);
      lcd_1.print("CDE CCD EC");
    }
    CurrentSongIndice += 1;
    if (CurrentSongIndice >= 3) {
      CurrentSongIndice = 0;
    }
    delay(debounceDelayms);
  }
  ButtonShowSongOld = ButtonShowSongCurrent;
  ButtonOctUpCurrent = digitalRead(12);
  if ((ButtonOctUpOld == 1 && ButtonOctUpCurrent == 0) && NoteC5 <= 60) {
    delay(debounceDelayms);
    NoteC5 += 12;
    NoteD5 += 12;
    NoteE5 += 12;
    NoteF5 += 12;
    NoteG5 += 12;
    NoteA5 += 12;
    NoteB5 += 12;
    NoteC6 += 12;
  }
  ButtonOctUpOld = ButtonOctUpCurrent;
  ButtonOctDownCurrent = digitalRead(13);
  if ((ButtonOctDownOld == 1 && ButtonOctDownCurrent == 0) && NoteC5 >= 48) {
    delay(debounceDelayms);
    NoteC5 += -12;
    NoteD5 += -12;
    NoteE5 += -12;
    NoteF5 += -12;
    NoteG5 += -12;
    NoteA5 += -12;
    NoteB5 += -12;
    NoteC6 += -12;
  }
  ButtonOctDownOld = ButtonOctDownCurrent;
  Button2StateCurrent = digitalRead(2);
  if (Button2StateOld == 1 && Button2StateCurrent == 0) {
    delay(debounceDelayms);
    tone(11, 440 * pow(2.0, (constrain(int(NoteC5), 35, 127) - 57) / 12.0), 500);
    Serial.println("C");
  }
  Button2StateOld = Button2StateCurrent;
  Button3StateCurrent = digitalRead(3);
  if (Button3StateOld == 1 && Button3StateCurrent == 0) {
    delay(debounceDelayms);
    tone(11, 440 * pow(2.0, (constrain(int(NoteD5), 35, 127) - 57) / 12.0), 500);
    Serial.println("D");
  }
  Button3StateOld = Button3StateCurrent;
  Button4StateCurrent = digitalRead(4);
  if (Button4StateOld == 1 && Button4StateCurrent == 0) {
    delay(debounceDelayms);
    tone(11, 440 * pow(2.0, (constrain(int(NoteE5), 35, 127) - 57) / 12.0), 500);
    Serial.println("E");
  }
  Button4StateOld = Button4StateCurrent;
  Button5StateCurrent = digitalRead(5);
  if (Button5StateOld == 1 && Button5StateCurrent == 0) {
    delay(debounceDelayms);
    tone(11, 440 * pow(2.0, (constrain(int(NoteF5), 35, 127) - 57) / 12.0), 500);
    Serial.println("F");
  }
  Button5StateOld = Button5StateCurrent;
  Button6StateCurrent = digitalRead(6);
  if (Button6StateOld == 1 && Button6StateCurrent == 0) {
    delay(debounceDelayms);
    tone(11, 440 * pow(2.0, (constrain(int(NoteG5), 35, 127) - 57) / 12.0), 500);
    Serial.println("G");
  }
  Button6StateOld = Button6StateCurrent;
  Button7StateCurrent = digitalRead(7);
  if (Button7StateOld == 1 && Button7StateCurrent == 0) {
    delay(debounceDelayms);
    tone(11, 440 * pow(2.0, (constrain(int(NoteA5), 35, 127) - 57) / 12.0), 500);
    Serial.println("A");
  }
  Button7StateOld = Button7StateCurrent;
  Button8StateCurrent = digitalRead(8);
  if (Button8StateOld == 1 && Button8StateCurrent == 0) {
    delay(debounceDelayms);
    tone(11, 440 * pow(2.0, (constrain(int(NoteB5), 35, 127) - 57) / 12.0), 500);
    Serial.println("B");
  }
  Button8StateOld = Button8StateCurrent;
  Button9StateCurrent = digitalRead(9);
  if (Button9StateOld == 1 && Button9StateCurrent == 0) {
    delay(debounceDelayms);
    tone(11, 440 * pow(2.0, (constrain(int(NoteC6), 35, 127) - 57) / 12.0), 500);
    Serial.println("C1");
  }
  Button9StateOld = Button9StateCurrent;
  delay(10); // Delay a little bit to improve simulation performance
}
