// // Wokwi code
// #define TONE_PITCH 440
// #define TONE_USE_INT 1
// #include <TonePitch.h>
// #include <ESP32Servo.h>
// #define LED_BUILTIN 2
// #define LED_G 4
// #define LED_R 5
// #define LED_Y 13
// #define LED_B 14
// #define LED_O 16
// #define SPEAKER 17
// #define SERVO_G 18
// #define SERVO_R 19
// #define SERVO_Y 23
// #define SERVO_B 25
// #define SERVO_O 26
// // Servo //servoG;
// // Servo //servoR;
// // Servo //servoY;
// // Servo //servoB;
// // Servo //servoO;
// const int HO = 105; // hammer-on
// const int PO = 90; // pull-off
// const float tempoMultiplier = 1.02; // tempo adjustment (<1=faster, >1=slower)
// /*
// 120 BPM 4/4
// each beat is 500 ms
// ms note
// 2000 whole
// 1000 half
// 500 1/4
// 250 1/8
// 125 1/16
// 62.5 1/32
// solo: 32.19 sec
// YouTube https://www.youtube.com/watch?v=igOblQjX2jE
// solo: 32.65 sec
// */
// void flash(int pin, int duration, int frequency = 0) {
// static int fullDuration = -125; // change to 0 if flash(18, 125, 0) is commented out
// // Serial.println(fullDuration);
// if (fullDuration % 500 < 250) {
// // Serial.println("HIGH");
// digitalWrite(LED_BUILTIN, HIGH);
// } else if (fullDuration % 500 >= 250) {
// // Serial.println("LOW");
// digitalWrite(LED_BUILTIN, LOW);
// }
// fullDuration += duration;
// // Serial.print(String(pin) + " " + String(frequency) + " " + String(duration) + " ");
// digitalWrite(pin, HIGH);
// switch(pin) {
// case LED_G:
// //servoG.write(HO);
// break;
// case LED_R:
// //servoR.write(HO);
// break;
// case LED_Y:
// //servoY.write(HO);
// break;
// case LED_B:
// //servoB.write(HO);
// break;
// case LED_O:
// //servoO.write(HO);
// break;
// default:
// break;
// }
// int adjustedDuration = round(duration * tempoMultiplier);
// // Serial.print(String(duration) + " * " + String(tempoMultiplier) + " = " + String(adjustedDuration) + " ");
// if (frequency != 0) {
// tone(SPEAKER, frequency * 2, adjustedDuration); // 8va
// }
// delay(adjustedDuration - 31); // 31.25 = 1/64th note
// digitalWrite(pin, LOW);
// switch(pin) {
// case LED_G:
// //servoG.write(PO);
// break;
// case LED_R:
// //servoR.write(PO);
// break;
// case LED_Y:
// //servoY.write(PO);
// break;
// case LED_B:
// //servoB.write(PO);
// break;
// case LED_O:
// //servoO.write(PO);
// break;
// default:
// break;
// }
// delay(31); // prevent slur
// }
// void setup() {
// // put your setup code here, to run once:
// Serial.begin(115200);
// pinMode(LED_BUILTIN, OUTPUT);
// pinMode(LED_G, OUTPUT);
// pinMode(LED_R, OUTPUT);
// pinMode(LED_Y, OUTPUT);
// pinMode(LED_B, OUTPUT);
// pinMode(LED_O, OUTPUT);
// //servoG.attach(SERVO_G);
// //servoR.attach(SERVO_R);
// //servoY.attach(SERVO_Y);
// //servoB.attach(SERVO_B);
// //servoO.attach(SERVO_O);
// // //servoG.write(0); // Wokwi default position
// // //servoG.write(90); // Center position
// flash(18, 125, 0); // init tone() to prevent Wokwi bug of first note hanging for > 1000 ms, change static int fullDuration to 0 if commenting out
// //servoG.write(HO);
// //servoR.write(HO);
// //servoY.write(HO);
// //servoB.write(HO);
// //servoO.write(HO);
// delay(1000);
// //servoG.write(PO);
// //servoR.write(PO);
// //servoY.write(PO);
// //servoB.write(PO);
// //servoO.write(PO);
// delay(1000);
// int i;
// int DCalCoda;
// for (DCalCoda = 0; DCalCoda <= 1; DCalCoda += 1) {
// for (i = 1; i <= 5; i += 1) {
// flash(LED_G, 125, NOTE_B4);
// flash(LED_Y, 125, NOTE_D5);
// flash(LED_B, 62, NOTE_FS5);
// flash(LED_Y, 63, NOTE_D5);
// }
// flash(LED_G, 125, NOTE_B4);
// for (i = 1; i <= 5; i += 1) {
// flash(LED_R, 125, NOTE_CS5);
// flash(LED_B, 125, NOTE_E5);
// flash(LED_O, 62, NOTE_G5);
// flash(LED_B, 63, NOTE_E5);
// }
// flash(LED_R, 125, NOTE_CS5);
// for (i = 1; i <= 4; i += 1) {
// flash(LED_Y, 125, NOTE_D5);
// flash(LED_B, 125, NOTE_FS5);
// flash(LED_O, 62, NOTE_A5);
// flash(LED_B, 63, NOTE_FS5);
// }
// flash(LED_Y, 125, NOTE_D5);
// flash(LED_B, 125, NOTE_FS5);
// if (DCalCoda == 0) {
// flash(LED_O, 230, NOTE_A5); // should be 250, but Wokwi plays it longer
// } else {
// flash(LED_O, 120, NOTE_A5); // should be 125, but Wokwi plays it longer
// flash(LED_B, 120, NOTE_FS5); // should be 125, but Wokwi plays it longer
// }
// for (i = 1; i <= 2; i += 1) {
// flash(LED_G, 125, NOTE_G4);
// flash(LED_R, 125, NOTE_B4);
// flash(LED_B, 62, NOTE_D5);
// flash(LED_R, 63, NOTE_B4);
// }
// flash(LED_G, 125, NOTE_G4);
// flash(LED_Y, 125, NOTE_A4);
// flash(LED_O, 125, NOTE_B4);
// flash(LED_B, 125, NOTE_A4);
// flash(LED_Y, 125, NOTE_G4);
// flash(LED_R, 125, NOTE_FS4);
// if (DCalCoda == 0) {
// flash(LED_B, 125, NOTE_A4);
// flash(LED_Y, 125, NOTE_GS4);
// flash(LED_R, 125, NOTE_FS4);
// flash(LED_G, 125, NOTE_D4);
// flash(LED_R, 750, NOTE_E4);
// } else {
// flash(LED_B, 250, NOTE_A4);
// flash(LED_B, 125, NOTE_GS4);
// flash(LED_Y, 125, NOTE_FS4);
// // flash(LED_R, 125, NOTE_DS4);
// flash(LED_G, 750, NOTE_E4);
// }
// flash(LED_B, 125, NOTE_G4);
// flash(LED_B, 125, NOTE_G4);
// flash(LED_B, 250, NOTE_G4);
// flash(LED_Y, 62, NOTE_FS4);
// flash(LED_B, 63, NOTE_G4);
// flash(LED_Y, 125, NOTE_FS4);
// flash(LED_R, 250, NOTE_E4);
// flash(LED_G, 250, NOTE_D4);
// if (DCalCoda == 0) {
// flash(LED_G, 500, NOTE_D4);
// flash(LED_Y, 500, NOTE_CS4);
// flash(LED_R, 500, NOTE_B3);
// flash(LED_G, 500, NOTE_A3);
// flash(LED_B, 125, NOTE_F4);
// flash(LED_O, 375, NOTE_G4);
// flash(LED_O, 125, NOTE_B4);
// flash(LED_R, 125, NOTE_FS4);
// flash(LED_B, 125, NOTE_A4);
// flash(LED_R, 125, NOTE_F4);
// flash(LED_O, 62, NOTE_E4);
// flash(LED_O, 125, NOTE_FS4);
// flash(LED_B, 63, NOTE_B4);
// flash(LED_Y, 125, NOTE_A4);
// flash(LED_B, 125, NOTE_FS4);
// flash(LED_R, 125, NOTE_GS4);
// flash(LED_R, 125, NOTE_F4);
// flash(LED_Y, 125, NOTE_FS4);
// flash(LED_Y, 125, NOTE_D4);
// flash(LED_B, 125, NOTE_FS4);
// flash(LED_Y, 125, NOTE_E4);
// flash(LED_R, 125, NOTE_D4);
// flash(LED_G, 125, NOTE_B3);
// flash(LED_Y, 125, NOTE_E4);
// flash(LED_G, 125, NOTE_B3);
// flash(LED_R, 125, NOTE_D4);
// flash(LED_Y, 1062, NOTE_E4);
// flash(LED_B, 63);
// } else { // Coda
// flash(LED_O, 500, NOTE_B4);
// flash(LED_B, 500, NOTE_A4);
// flash(LED_G, 500, NOTE_D4);
// flash(LED_R, 375-63, NOTE_E4);
// flash(LED_G, 125+63);
// flash(LED_Y, 1750, NOTE_FS4);
// flash(LED_G, 125-63);
// flash(LED_G, 125+63);
// flash(LED_Y, 125, NOTE_FS4);
// flash(LED_B, 750-125, NOTE_GS4);
// flash(LED_O, 250, NOTE_B4);
// flash(LED_Y, 125, NOTE_FS4);
// flash(LED_B, 1000-125, NOTE_GS4);
// digitalWrite(LED_G, HIGH); digitalWrite(LED_Y, HIGH);
// //servoG.write(HO); //servoY.write(HO);
// delay(500);
// digitalWrite(LED_G, LOW); digitalWrite(LED_Y, LOW);
// //servoG.write(PO); //servoY.write(PO);
// }
// }
// }
// void loop() {
// // put your main code here, to run repeatedly:
// delay(125); // this speeds up the simulation
// }