#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]);
// Extended Melody: Not For Sale
const int melody[] = {
// First section
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_G4,
NOTE_A4, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_D4,
// Repeat with variation
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_G4,
NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_E4,
// Additional section for variation
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_D4,
// Ending theme
NOTE_E4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4,
NOTE_A4, NOTE_G4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_E4, NOTE_D4, NOTE_C4
};
const int noteDurations[] = {
// Match durations to melody notes
4, 8, 8, 4, 8, 8, 4, 8,
8, 4, 8, 8, 8, 8, 4, 4,
4, 8, 8, 4, 8, 8, 4, 8,
8, 4, 8, 8, 4, 4, 8, 8,
4, 8, 8, 4, 8, 8, 4, 8,
8, 4, 8, 8, 4, 4, 8, 8,
4, 8, 8, 4, 8, 8, 4, 8,
8, 4, 8, 8, 4, 4, 8, 8
};
void setup() {
for (uint8_t i = 0; i < numTones; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
pinMode(SPEAKER_PIN, OUTPUT);
}
void loop() {
playExtendedMelody(); // Play the extended melody
waitForButtonPress(); // Wait for user input to replay
}
void playExtendedMelody() {
// Loop through the melody multiple times to extend duration
for (int repeat = 0; repeat < 3; repeat++) {
for (int thisNote = 0; thisNote < sizeof(melody) / sizeof(melody[0]); thisNote++) {
int noteDuration = 1500 / noteDurations[thisNote]; // Slower tempo
tone(SPEAKER_PIN, melody[thisNote], noteDuration);
delay(noteDuration * 1.5); // 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
}
}
}
}