const int PIN_BUZZ = 10;
const int oct = 4;
const int del = 300;
const float OCTAVE_0[] = {
16.35, //C = 0
17.32, //C# or Db = 1
18.35, //D = 2
19.45, //D# or Eb = 3
20.6, //E = 4
21.83, //F = 5
23.12, //F# or Gb = 6
24.5, //G = 7
25.96, //G# or Ab = 8
27.5, //A = 9
29.14, //A# or Bb = 10
30.87 //B = 11
};
class Note
{
public:
String letter;
int pitch,
octave,
duration;
Note()
{
letter = "C";
pitch = translate(letter);
octave = oct;
duration = del;
}
Note(String p)
{
letter = p;
pitch = translate(p);
octave = oct;
duration = del;
}
Note(String p, int d){
letter = p;
pitch = translate(p);
octave = oct;
duration = d;
}
Note(String p, int o, int d)
{
letter = p;
pitch = translate(p);
octave = o;
duration = d;
}
int translate(String l){
if(l == "C"){
return 0;
}else if (l == "C#" || l == "Db"){
return 1;
}else if(l == "D"){
return 2;
}else if(l == "D#" || l == "Eb"){
return 3;
}else if(l == "E"){
return 4;
}else if(l == "F"){
return 5;
}else if(l == "F#" || l == "Gb"){
return 6;
}else if(l == "G"){
return 7;
}else if(l == "G#" || l == "Ab"){
return 8;
}else if(l == "A"){
return 9;
}else if(l == "A#" || l == "Bb"){
return 10;
}else if(l == "B"){
return 11;
}else{
return 0;
}
}
};
static Note NoteO(String p, int o) {
return Note(p, o, del);
}
/*
Note notes[] = { //Happy B-Day
Note("G", del / 2), Note("G", del / 2),
Note("A"), Note("G"), NoteO("C", oct + 1),
Note("B", del * 2), Note("G", del / 2), Note("G", del / 2),
Note("A"), Note("G"), NoteO("D", oct + 1),
Note("C", oct + 1, del * 2), Note("G", del / 2), Note("G", del / 2),
NoteO("G", oct + 1), NoteO("E", oct + 1), NoteO("C", oct + 1),
Note("B"), Note("A"), Note("F", oct + 1, del / 2), Note("F", oct + 1, del / 2),
NoteO("E", oct + 1), NoteO("C", oct + 1), NoteO("D", oct + 1),
Note("C", oct + 1, del * 2)
};
*/
Note notes[] = { //In Love w/ Stripper
Note("F", del), Note("G", del * 2),
NoteO("D", oct + 1), Note("C", oct + 1, del * 2), Note("A#"),
NoteO("D", oct + 1), Note("C", oct + 1, del * 2), Note("A#"),
NoteO("D", oct + 1), NoteO("C", oct + 1), Note("A#", del * 3),
Note("F", del), Note("G", del * 2),
NoteO("D", oct + 1), Note("C", oct + 1, del * 2), Note("A#"),
NoteO("D", oct + 1), Note("C", oct + 1, del * 2), Note("A#"),
NoteO("D", oct + 1), NoteO("C", oct + 1)
};
/*
Note notes[] = { //Rocket Jump Waltz
Note("G", del * 2),
Note("G", oct + 1, del / 2), Note("B", oct + 1, del * 2),
Note("G", oct + 1, del / 2), Note("E", oct + 1, del / 2), Note("B", del * 2),
Note("E", oct + 1, del / 2), Note("G", oct + 1, del / 2), Note("E", oct + 1, del * 2),
Note("F#", oct + 1, del / 2), Note("E", oct + 1, del / 2), Note("E", oct + 1, del * 2),
Note("G", oct + 1, del / 2), Note("B", oct + 1, del / 2), Note("C", oct + 2, del * 2),
NoteO("D", oct + 2), NoteO("E", oct + 2),
Note("D", oct + 2, del / 2), Note("C", oct + 2, del / 2), Note("B", oct + 1, del * 2),
Note("A", oct + 1, del / 2), Note("B", oct + 1, del / 2), Note("C", oct + 2, del * 2),
Note("E", oct + 2, del / 2), Note("G", oct + 2, del),
Note("A", oct + 2, del / 2), Note("A", oct + 2, del * 2),
Note("B", oct + 2, del / 2), Note("G", oct + 2, del * 2),
Note("F#", oct + 2, del / 2), Note("E", oct + 2, del / 2), Note("A", oct + 2, del * 2),
Note("G", oct + 2, del / 2), Note("F#", oct + 2, del * 2),
Note("E", oct + 2, del / 2), Note("E", oct + 2, del * 2),
Note("D#", oct + 2, del / 2), Note("B", oct + 1, del / 2), Note("D#", oct + 2, del), Note("B", oct + 1, del),
Note("A", oct + 1, del / 2), Note("G", oct + 1, del * 2),
Note("E", oct + 1, del / 2), Note("E", oct + 1, del * 2),
Note("G", oct + 1, del / 2), Note("B", oct + 1, del / 2), Note("E", oct + 2, del * 2),
Note("D", oct + 2, del / 2), Note("C", oct + 2, del / 2), Note("D", oct + 2, del),
Note("E", oct + 2, del / 2), Note("C", oct + 2, del),
Note("D", oct + 2, del / 2), Note("B", oct + 1, del * 2),
Note("G", oct + 1, del / 2), Note("C", oct + 2, del / 2), Note("E", oct + 2, del),
Note("G", oct + 2, del / 2), Note("G", oct + 2, del * 2),
Note("F#", oct + 2, del / 2), Note("G", oct + 2, del / 2), Note("A", oct + 2, del),
Note("F#", oct + 2, del), Note("A", oct + 2, del * 2),
Note("G", oct + 2, del / 2), Note("F#", oct + 2, del / 2), Note("E", oct + 2, del / 2), Note("F#", oct + 2, del / 2), Note("E", oct + 2, del * 2),
Note("D", oct + 2, del / 2), Note("C", oct + 2, del / 2), Note("B", oct + 1, del * 2),
Note("A", oct + 1, del / 2), Note("G", oct + 1, del / 2), Note("E", oct + 1, del * 2),
Note("D", oct + 1, del / 2), Note("E", oct + 1, del / 2), Note("E", oct + 1, del),
Note("F#", oct + 1, del / 2), Note("F#", oct + 1, del * 2),
Note("F#", oct + 1, del / 2), Note("B", oct + 1, del / 2), Note("D#", oct + 2, del * 2),
Note("D#", oct + 2, del / 2), Note("E", oct + 2, del / 2), Note("F#", oct + 2, del), Note("B", oct + 2, del),
Note("B", oct + 2, del), Note("A", oct + 2, del / 2), Note("G", oct + 2, del / 2), Note("E", oct + 2, del)
};*/
void playMusic(){
int arraySize = sizeof(notes) / sizeof(notes[0]);
for(int i = 0; i < arraySize; i++){
int pow = 1;
Note currNote = notes[i];
Serial.print(currNote.letter);
Serial.print(" ");
for (int j = 0; j < currNote.octave; j++){
pow *= 2;
}
int note = OCTAVE_0[currNote.pitch] * pow;
tone(PIN_BUZZ, note);
delay(currNote.duration);
tone(PIN_BUZZ, 0, 30);
}
tone(PIN_BUZZ, 0);
delay(1000);
Serial.println();
}
const int PIN_MIN = 2;
const int PIN_MAX = 8;
const int PIN_WIN = 5;
const int PIN_BUTTON = 13;
const int SPEED_DEFAULT = 100;
const int SPEED_WIN = 20;
const int SPEED_FLASH_WIN = 200;
const int SPEED_REDUCE = 10;
const int TIME_WAIT = 2000;
const int WIN_FLASH_COUNT = 3;
const int PRINT_LINES = 6;
const String prompt = "Press the button to stop the light!";
const String info = "Current Speed: ";
const String ms = " ms";
bool printPrompt = true;
bool backForth = true;
int currLED = 2;
int speed = SPEED_DEFAULT;
void setup() {
pinMode(PIN_BUZZ, OUTPUT);
Serial.begin(9600);
for(int i = PIN_MIN; i < PIN_MAX + 1; i++){
pinMode(i, OUTPUT);
}
pinMode(PIN_BUTTON, INPUT);
}
void loop() {
if(printPrompt == true){
printLines(PRINT_LINES);
Serial.println(prompt);
Serial.print(info);
Serial.print(speed);
Serial.println(ms);
printPrompt = false;
}
toggle(currLED);
getInput();
if(currLED == PIN_WIN){
delay(speed - 20);
}else{
delay(speed);
}
//straight();
bounce();
}
void straight(){
currLED++;
if(currLED > PIN_MAX){
currLED = PIN_MIN;
}
}
void bounce(){
if(backForth == true){
currLED++;
}else{
currLED--;
}
if(currLED == (PIN_MAX + 1)){
currLED = PIN_MAX - 1;
backForth = false;
}else if (currLED == (PIN_MIN - 1)){
currLED = PIN_MIN + 1;
backForth = true;
}
}
void getInput(){
int buttonState = digitalRead(PIN_BUTTON);
if(buttonState == HIGH){
if(currLED == PIN_WIN){
speed -= SPEED_REDUCE;
if(speed == SPEED_WIN){
speed = SPEED_DEFAULT;
Serial.println("HIT!");
Serial.println("YOU WIN!");
flashAll();
speed = SPEED_DEFAULT;
playMusic();
}else{
Serial.println("HIT!");
Serial.println("NEXT LEVEL!");
}
}else{
Serial.println("MISS!");
Serial.println("TRY AGAIN!");
}
printPrompt = true;
delay(TIME_WAIT);
}
}
void printLines(int x){
for(int i = 0; i < x; i++){
Serial.println();
}
}
void flashAll(){
for(int c = 0; c < WIN_FLASH_COUNT; c++){
for(int j = PIN_MIN; j < PIN_MAX + 1; j++){
digitalWrite(j, HIGH);
}
delay(SPEED_FLASH_WIN);
for(int i = PIN_MIN; i < PIN_MAX + 1; i++){
digitalWrite(i, LOW);
}
delay(SPEED_FLASH_WIN);
}
}
void toggle(int i){
for(int j = PIN_MIN; j < PIN_MAX + 1; j++){
if(j == i){
digitalWrite(j, HIGH);
}else{
digitalWrite(j, LOW);
}
}
}