Created
January 15, 2013 20:23
-
-
Save gillesruppert/4541704 to your computer and use it in GitHub Desktop.
Arduino Music script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Melody | |
* (cleft) 2005 D. Cuartielles for K3 | |
* | |
* This example uses a piezo speaker to play melodies. It sends | |
* a square wave of the appropriate frequency to the piezo, generating | |
* the corresponding tone. | |
* | |
* The calculation of the tones is made following the mathematical | |
* operation: | |
* | |
* timeHigh = period / 2 = 1 / (2 * toneFrequency) | |
* | |
* where the different tones are described as in the table: | |
* | |
* note frequency period timeHigh | |
* c 261 Hz 3830 1915 | |
* d 294 Hz 3400 1700 | |
* e 329 Hz 3038 1519 | |
* f 349 Hz 2864 1432 | |
* g 392 Hz 2550 1275 | |
* a 440 Hz 2272 1136 | |
* b 493 Hz 2028 1014 | |
* C 523 Hz 1912 956 | |
* D 588 Hz 1700 850 | |
* E 658 Hz 1519 759 | |
* F 698 Hz 1432 716 | |
* G 784 Hz 1275 637 | |
* A 880 Hz 1136 568 | |
* | |
* http://www.arduino.cc/en/Tutorial/Melody | |
*/ | |
int speakerPin = 9; | |
// Jingle bells - DOESN'T WORK AS MY PIEZO ONLY HAS 1 OCTAVE IT SEEMS | |
//char notes[] = "gEDCggEDCaaFEDbGAGFDE "; | |
//int length = 22; | |
//int beats[] = {1, 1, 1, 1, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 4, 4}; | |
// little melody | |
// int length = 15; // the number of notes | |
// char notes[] = "ccggaagffeeddc "; // a space represents a rest | |
// int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 }; | |
//alle meine entchen | |
int length = 28; | |
char notes[] = "cdefggaaaagaaaagffffeeddddc "; | |
int beats[] = { 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 4, 4 }; | |
int tempo = 300; | |
void playTone(int tone, int duration) { | |
for (long i = 0; i < duration * 1000L; i += tone * 2) { | |
digitalWrite(speakerPin, HIGH); | |
delayMicroseconds(tone); | |
digitalWrite(speakerPin, LOW); | |
delayMicroseconds(tone); | |
} | |
} | |
void playNote(char note, int duration) { | |
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A' }; | |
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956, 850, 759, 716, 637, 568 }; | |
// play the tone corresponding to the note name | |
for (int i = 0; i < 8; i++) { | |
if (names[i] == note) { | |
playTone(tones[i], duration); | |
} | |
} | |
} | |
void setup() { | |
pinMode(speakerPin, OUTPUT); | |
} | |
void loop() { | |
for (int i = 0; i < length; i++) { | |
if (notes[i] == ' ') { | |
delay(beats[i] * tempo); // rest | |
} else { | |
playNote(notes[i], beats[i] * tempo); | |
} | |
// pause between notes | |
delay(tempo / 2); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment