#include "pitches.h"
#define SPEAKER_PIN 8
const uint8_t buttonPins[] = { 12, 11, 10, 9, 7, 6, 5, 4 };
const int buttonTones[] = {
NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5
};
const int numTones = sizeof(buttonPins) / sizeof(buttonPins[0]);
// Melody: Running in the 90s
const int melody[] = {
NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4,
NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4,
NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4,
NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4
};
const int noteDurations[] = {
4, 8, 8, 4, 4, 8, 8, 4,
8, 8, 4, 4, 8, 8, 8, 8,
4, 8, 8, 4, 4, 8, 8, 4,
8, 8, 4, 4, 8, 8, 8, 8
};
void setup() {
for (uint8_t i = 0; i < numTones; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
pinMode(SPEAKER_PIN, OUTPUT);
}
void loop() {
playMelody(); // Plays the melody
waitForButtonPress(); // Waits for user input to replay
}
void playMelody() {
for (int thisNote = 0; thisNote < sizeof(melody) / sizeof(melody[0]); thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(SPEAKER_PIN, melody[thisNote], noteDuration);
delay(noteDuration * 1.3); // Add a slight pause between notes
noTone(SPEAKER_PIN);
}
}
void waitForButtonPress() {
while (true) {
for (uint8_t i = 0; i < numTones; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
return; // Exit when any button is pressed
}
}
}
}