Created
December 1, 2017 09:42
-
-
Save mischk/4a40515a9262d7c0e84a5e5352a754e7 to your computer and use it in GitHub Desktop.
Arduino and Piezo play Jingle Bells
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
/* Play JingleBells | |
* by Mischka 2017 (mischk.neocities.org) | |
* | |
* based on the code from: | |
* https://www.arduino.cc/en/Tutorial/PlayMelody | |
* by D. Cuartielles (clay.shirky@nyu.edu) | |
* | |
* connect piezo to pin 9 and GND on arduino board | |
*/ | |
// TONES ========================================== | |
// Start by defining the relationship between | |
// note, period, & frequency. | |
#define c 3830 // 261 Hz | |
#define d 3400 // 294 Hz | |
#define e 3038 // 329 Hz | |
#define f 2864 // 349 Hz | |
#define g 2550 // 392 Hz | |
#define a 2272 // 440 Hz | |
#define b 2028 // 493 Hz | |
#define C 1912 // 523 Hz | |
// Define a special note, 'R', to represent a rest | |
#define R 0 | |
// SETUP ============================================ | |
// Set up speaker on a PWM pin (digital 9, 10 or 11) | |
int speakerOut = 9; | |
void setup() { | |
pinMode(speakerOut, OUTPUT); | |
} | |
// MELODY and TIMING ======================================= | |
// melody[] is an array of notes, accompanied by beats[], | |
// which sets each note's relative length (higher #, longer note) | |
int melody[] = { a, a, a, a, a, a, a, C, f, g, a, | |
b, b , b, b, b, a, a, a, a, a, g, g, a, g, C, R}; | |
int beats[] = { 16, 16, 36, 16, 16, 32, 16, 16, 16, 16, 64, | |
16, 16, 16, 16, 16, 16, 16, 8, 8, 16, 16, 16, 16, 36, 16, 16}; | |
int MAX_COUNT = sizeof(melody) / 2; // Melody length, for looping. | |
// Set overall tempo | |
long tempo = 15000; | |
// Set length of pause between notes | |
int pause = 1000; | |
// Loop variable to increase Rest length | |
int rest_count = 100; //<-BLETCHEROUS HACK; See NOTES | |
// Initialize core variables | |
int tone_ = 0; | |
int beat = 0; | |
long duration = 0; | |
// PLAY TONE ============================================== | |
// Pulse the speaker to play a tone for a particular duration | |
void playTone() { | |
long elapsed_time = 0; | |
if (tone_ > 0) { // if this isn't a Rest beat, while the tone has | |
// played less long than 'duration', pulse speaker HIGH and LOW | |
while (elapsed_time < duration) { | |
digitalWrite(speakerOut,HIGH); | |
delayMicroseconds(tone_ / 2); | |
// DOWN | |
digitalWrite(speakerOut, LOW); | |
delayMicroseconds(tone_ / 2); | |
// Keep track of how long we pulsed | |
elapsed_time += (tone_); | |
} | |
} | |
else { // Rest beat; loop times delay | |
for (int j = 0; j < rest_count; j++) { // See NOTE on rest_count | |
delayMicroseconds(duration); | |
} | |
} | |
} | |
// LET THE WILD RUMPUS BEGIN ============================= | |
void loop() { | |
// Set up a counter to pull from melody[] and beats[] | |
for (int i=0; i<MAX_COUNT; i++) { | |
tone_ = melody[i]; | |
beat = beats[i]; | |
duration = beat * tempo; // Set up timing | |
playTone(); | |
// A pause between notes... | |
delayMicroseconds(pause); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment