#include "Pitches.h"
#define BUZZER_GPIO_PIN 14
//1000 ms = 1 second = 1 full note
//500 ms = 0.5 seconds = 1 half note
//etc..
#define DOUBLE_WHOLE_NOTE 2000
#define WHOLE_NOTE 1000
#define HALF_NOTE 500
#define QUARTER_NOTE 250
#define EIGHTH_NOTE 125
void setup()
{
Serial1.begin(115200);
pinMode(BUZZER_GPIO_PIN, OUTPUT);
Serial1.println("Happy Birthday Song");
}
void playNote(int pitch, int duration)
{
tone(BUZZER_GPIO_PIN, pitch);
delay(duration * 0.75); //Play the note for 75% of the duration
noTone(BUZZER_GPIO_PIN); //Stop playing note
delay(duration * 0.25); //Don't play the note for 25% of the duration
//Note I had to put that 75% and 25% in there because when you played
//a note a bunch of times in a row they ran together. I wanted it
//to sound like you pressed the piano key for 75% of the time
//then let your finger up off of the piano key for 25% of the time.
//Those probably should be constants you define at top.
//Play around with those until they match your liking.
}
// Define the struct for a note
struct Note {
int pitch;
int duration;
};
Note song[] = {
{ NOTE_C4, HALF_NOTE }, { NOTE_C4, HALF_NOTE }, { NOTE_D4, WHOLE_NOTE },
{ NOTE_C4, WHOLE_NOTE }, { NOTE_F4, WHOLE_NOTE }, { NOTE_E4, DOUBLE_WHOLE_NOTE },
{ NOTE_C4, HALF_NOTE }, { NOTE_C4, HALF_NOTE }, { NOTE_D4, WHOLE_NOTE },
{ NOTE_C4, WHOLE_NOTE }, { NOTE_G4, WHOLE_NOTE }, { NOTE_F4, DOUBLE_WHOLE_NOTE },
{ NOTE_C4, HALF_NOTE }, { NOTE_C4, HALF_NOTE }, { NOTE_C5, WHOLE_NOTE },
{ NOTE_A4, WHOLE_NOTE }, { NOTE_F4, WHOLE_NOTE }, { NOTE_E4, WHOLE_NOTE }, { NOTE_D4, WHOLE_NOTE },
{ NOTE_AS4, HALF_NOTE }, { NOTE_AS4, HALF_NOTE }, { NOTE_A4, WHOLE_NOTE },
{ NOTE_F4, WHOLE_NOTE }, { NOTE_G4, WHOLE_NOTE }, { NOTE_F4, DOUBLE_WHOLE_NOTE }
};
void loop()
{
int numNotes = sizeof(song) / sizeof(song[0]);
for (int i = 0; i < numNotes; i++)
{
playNote(song[i].pitch, song[i].duration);
}
// sleep for 10 seconds before starting the song over
delay(10000);
}