// Sketch for testing the ArduboyTones library

#include <Arduboy2.h>
#include <ArduboyTones.h>

Arduboy2 arduboy;
ArduboyTones sound(arduboy.audio.enabled);

#define BUTTON_DELAY 200

byte circlePos = 7;

#define NDUR 100
const uint16_t allNotes[] PROGMEM = {
  NOTE_C0H,NDUR, NOTE_CS0,NDUR, NOTE_D0,NDUR, NOTE_DS0,NDUR, NOTE_E0,NDUR, NOTE_F0,NDUR,
  NOTE_FS0,NDUR, NOTE_G0,NDUR, NOTE_GS0,NDUR, NOTE_A0,NDUR, NOTE_AS0,NDUR, NOTE_B0,NDUR,
  NOTE_C1H,NDUR, NOTE_CS1,NDUR, NOTE_D1,NDUR, NOTE_DS1,NDUR, NOTE_E1,NDUR, NOTE_F1,NDUR,
  NOTE_FS1,NDUR, NOTE_G1,NDUR, NOTE_GS1,NDUR, NOTE_A1,NDUR, NOTE_AS1,NDUR, NOTE_B1,NDUR,
  NOTE_C2H,NDUR, NOTE_CS2,NDUR, NOTE_D2,NDUR, NOTE_DS2,NDUR, NOTE_E2,NDUR, NOTE_F2,NDUR,
  NOTE_FS2,NDUR, NOTE_G2,NDUR, NOTE_GS2,NDUR, NOTE_A2,NDUR, NOTE_AS2,NDUR, NOTE_B2,NDUR,
  NOTE_C3H,NDUR, NOTE_CS3,NDUR, NOTE_D3,NDUR, NOTE_DS3,NDUR, NOTE_E3,NDUR, NOTE_F3,NDUR,
  NOTE_FS3,NDUR, NOTE_G3,NDUR, NOTE_GS3,NDUR, NOTE_A3,NDUR, NOTE_AS3,NDUR, NOTE_B3,NDUR,
  NOTE_C4H,NDUR, NOTE_CS4,NDUR, NOTE_D4,NDUR, NOTE_DS4,NDUR, NOTE_E4,NDUR, NOTE_F4,NDUR,
  NOTE_FS4,NDUR, NOTE_G4,NDUR, NOTE_GS4,NDUR, NOTE_A4,NDUR, NOTE_AS4,NDUR, NOTE_B4,NDUR,
  NOTE_C5H,NDUR, NOTE_CS5,NDUR, NOTE_D5,NDUR, NOTE_DS5,NDUR, NOTE_E5,NDUR, NOTE_F5,NDUR,
  NOTE_FS5,NDUR, NOTE_G5,NDUR, NOTE_GS5,NDUR, NOTE_A5,NDUR, NOTE_AS5,NDUR, NOTE_B5,NDUR,
  NOTE_C6H,NDUR, NOTE_CS6,NDUR, NOTE_D6,NDUR, NOTE_DS6,NDUR, NOTE_E6,NDUR, NOTE_F6,NDUR,
  NOTE_FS6,NDUR, NOTE_G6,NDUR, NOTE_GS6,NDUR, NOTE_A6,NDUR, NOTE_AS6,NDUR, NOTE_B6,NDUR,
  NOTE_C7H,NDUR, NOTE_CS7,NDUR, NOTE_D7,NDUR, NOTE_DS7,NDUR, NOTE_E7,NDUR, NOTE_F7,NDUR,
  NOTE_FS7,NDUR, NOTE_G7,NDUR, NOTE_GS7,NDUR, NOTE_A7,NDUR, NOTE_AS7,NDUR, NOTE_B7,NDUR,
  NOTE_C8H,NDUR, NOTE_CS8,NDUR, NOTE_D8,NDUR, NOTE_DS8,NDUR, NOTE_E8,NDUR, NOTE_F8,NDUR,
  NOTE_FS8,NDUR, NOTE_G8,NDUR, NOTE_GS8,NDUR, NOTE_A8,NDUR, NOTE_AS8,NDUR, NOTE_B8,NDUR,
  NOTE_C9H,NDUR, NOTE_CS9,NDUR, NOTE_D9,NDUR, NOTE_DS9,NDUR, NOTE_E9,NDUR, NOTE_F9,NDUR,
  NOTE_FS9,NDUR, NOTE_G9,NDUR, NOTE_GS9,NDUR, NOTE_A9,NDUR, NOTE_AS9,NDUR, NOTE_B9,NDUR,
  TONES_REPEAT
};

const uint16_t sound1[] PROGMEM = {
  NOTE_C1,500, NOTE_C1H,500, NOTE_G1,500, NOTE_G1H,500,
  NOTE_C2,500, NOTE_C2H,500, NOTE_G2,500, NOTE_G2H,500,
  NOTE_C3,500, NOTE_C3H,500, NOTE_G3,500, NOTE_G3H,500,
  NOTE_C4,500, NOTE_C4H,500, NOTE_G4,500, NOTE_G4H,500,
  NOTE_C5,500, NOTE_C5H,500, NOTE_G5,500, NOTE_G5H,500,
  NOTE_C6,500, NOTE_C6H,500, NOTE_G6,500, NOTE_G6H,500,
  NOTE_C7,500, NOTE_C7H,500, NOTE_G7,500, NOTE_G7H,500,
  NOTE_C8,500, NOTE_C8H,500, NOTE_G8,500, NOTE_G8H,500,
  NOTE_C9,500, NOTE_C9H,500, NOTE_G9,500, NOTE_G9H,500,
  TONES_END
};

uint16_t inRAM[] = {
  NOTE_E4,400, NOTE_D4,200, NOTE_C4,400, NOTE_REST,200, NOTE_D4,200,
  NOTE_C4,300, NOTE_REST,100, NOTE_C4,300, NOTE_REST,100, NOTE_E4,300,
  NOTE_REST,100, NOTE_G4,300, NOTE_REST,100, NOTE_F4,300, NOTE_REST,100,
  NOTE_A4,300, NOTE_REST,100, NOTE_D5H,200, NOTE_REST,200, NOTE_D5H,200,
  NOTE_REST,1500,
  TONES_REPEAT
};

void setup() {
  arduboy.begin();
}

void loop() {
  boolean newNotes;

  displayAudio();
  while(true) {
    moveCircle();
    if (arduboy.pressed(UP_BUTTON)) {
      arduboy.audio.on();
      displayAudio();
    }
    if (arduboy.pressed(DOWN_BUTTON)) {
      arduboy.audio.off();
      displayAudio();
    }
    if (arduboy.pressed(B_BUTTON)) {
      delay(BUTTON_DELAY);
      break;
    }
  }

  sound.tone(1000);
  arduboy.clear();
  arduboy.print("tone(1000)\n\nB: noTone()\n   delay(1000)\n   break");
  while (sound.playing()) {
    moveCircle();
    if (arduboy.pressed(B_BUTTON)) {
      sound.noTone();
      delay(1000);
      break;
    }
  }

  sound.tone(500, 4000);
  arduboy.clear();
  arduboy.print("tone(500, 4000)\n\nB: break");
  while (sound.playing()) {
    moveCircle();
    if (arduboy.pressed(B_BUTTON)) {
      delay(BUTTON_DELAY);
      break;
    }
  }

  sound.tone(NOTE_C4,500, NOTE_C5H,5000);
  arduboy.clear();
  arduboy.print("tone(C4,500,C5H,5000)\n\nB: noTone(), break");
  while (sound.playing()) {
    moveCircle();
    if (arduboy.pressed(B_BUTTON)) {
      sound.noTone();
      delay(BUTTON_DELAY);
      break;
    }
  }

  sound.tone(NOTE_C7H,500, NOTE_REST,1000, NOTE_C6,5000);
  arduboy.clear();
  arduboy.print("tone(C7H,500,\n     REST,1000,\n     C6,6000)\n\nB: noTone(), break");
  while (sound.playing()) {
    moveCircle();
    if (arduboy.pressed(B_BUTTON)) {
      sound.noTone();
      delay(BUTTON_DELAY);
      break;
    }
  }

  sound.tones(allNotes);
  arduboy.clear();
  arduboy.print("tones(allNotes)\n\nA: noTone(), again\nUP: again\nB: break");
  while (sound.playing()) {
    moveCircle();
    if (arduboy.pressed(A_BUTTON)) {
      sound.noTone();
      sound.tones(allNotes);
    }
    if (arduboy.pressed(UP_BUTTON)) {
      sound.tones(allNotes);
    }
    if (arduboy.pressed(B_BUTTON)) {
      delay(BUTTON_DELAY);
      break;
    }
  }

  newNotes = false;
  inRAM[34] = inRAM[38] = NOTE_D5H;
  sound.tonesInRAM(inRAM);
  arduboy.clear();
  arduboy.print("tonesInRAM(inRAM)\n\nA: change notes\nB: break");
  while (sound.playing()) {
    moveCircle();
    if (arduboy.pressed(A_BUTTON)) {
      newNotes = !newNotes;
      if (newNotes) {
        inRAM[34] = inRAM[38] = NOTE_C5H;
      }
      else {
        inRAM[34] = inRAM[38] = NOTE_D5H;
      }
      delay(BUTTON_DELAY);
    }
    if (arduboy.pressed(B_BUTTON)) {
      delay(BUTTON_DELAY);
      break;
    }
  }

  sound.tones(sound1);
  arduboy.clear();
  arduboy.print("volumeMode(IN_TONES)\ntones(sound1)\n\nB: break");
  while(sound.playing()) {
    moveCircle();
    if (arduboy.pressed(B_BUTTON)) {
      delay(BUTTON_DELAY);
      break;
    }
  }

  sound.volumeMode(VOLUME_ALWAYS_NORMAL);
  sound.tones(sound1);
  arduboy.clear();
  arduboy.print("volumeMode(NORMAL)\ntones(sound1)\n\nB: noTone(), break");
  while(sound.playing()) {
    moveCircle();
    if (arduboy.pressed(B_BUTTON)) {
      sound.noTone();
      delay(BUTTON_DELAY);
      break;
    }
  }

  sound.volumeMode(VOLUME_ALWAYS_HIGH);
  sound.tones(sound1);
  arduboy.clear();
  arduboy.print("volumeMode(HIGH)\ntones(sound1)\n\nB: break");
  while(sound.playing()) {
    moveCircle();
    if (arduboy.pressed(B_BUTTON)) {
      delay(BUTTON_DELAY);
      break;
    }
  }
  sound.volumeMode(VOLUME_IN_TONE);
}

void moveCircle() {
  arduboy.fillCircle(circlePos, 54, 7, BLACK);
  circlePos += 8;
  if (circlePos > 119) {
    circlePos = 7;
  }
  arduboy.fillCircle(circlePos, 54, 7, WHITE);
  arduboy.display();
  delay(100);
}

void displayAudio() {
  arduboy.clear();
  arduboy.print("Audio enabled: ");
  arduboy.print(arduboy.audio.enabled() ? "YES" : "NO");
  arduboy.print("\n\nUP:   enable\nDOWN: disable\nB: break");
  arduboy.invert(!arduboy.audio.enabled());
}