/* Play Melody - Every single arduino has got a story to sing. * ----------------------------------------------------------- * * Door de output van een pin heel snel af en aan te schakelen kunnen we frequenties genereren. * Dit doen we aan de hand van PWM (Pulse With Modulation) * * Elke toon heeft een frequentie, dit is het aantal oscillaties van het metalen plaatje per seconde. * Dit plaatje zet de lucht aan het bewegen, die vervolgens ons oor raakt waardoor we geluid horen. * * De formule voor het berekenen welke periode nodig is bij het gebruik van PWM: * * periode = 100000*1/frequentie * * Versie: http://www.arduino.cc/en/Tutorial/PlayMelody (tuned by Batist) */
// TONEN ========================================== // noot, periode, & frequency. #define G_ 2083 // 48 Hz #define A 1818 // 55 Hz #define B 1639 // 61 Hz #define C 1538 // 65 Hz #define D 1369 // 73 Hz #define E 1219 // 82 Hz #define F 1149 // 87 Hz #define G 1020 // 98 Hz #define R 0 // Rust
// SETUP ============================================ // We kiezen een pin, waarbij het zeker mogelijk is PWM toe te passen. int speakerOut = 9;
void setup() {
pinMode(speakerOut, OUTPUT); }
// MELODY and TIMING ======================================= // melody[] houdt de noten bij. (Begin te tellen vanaf 0!) melody[0]= E, melody[2] = G, enz... int melody[] = { E, E, G, E, D, C, B, E, E, G, E, D, C, D, C, B, G_, G_, G_, G_, G_, G_, G_, G_, A, A, A, A, A, A, A, A};
// beats[] houdt bij hoe lang de noten moeten aangehouden worden. int beats[] = { 96, 32, 40, 32, 32, 128, 128, 96, 32, 40, 32, 32, 32, 32, 32, 128, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32};
// Hier berekenen we de lengte van het hele muziek stukje. int MAX_COUNT = sizeof(melody)/2;
// Algemeen tempo: long tempo = 10000;
// Algemene pauze tussen de noten: int pause = 1000;
// PLAY TONE ============================================== // Deze functie zal een bepaalde toon afspelen. void playTone(int tone, int beat) {
//Controlleer of het een gewone noot is of een pauze. if (tone > 0) { //Naar gelang de frequentie van de noot, en de duur pulse up & pulse down, met een bepaald interval. for(long elapsed_time = 0; elapsed_time < beat*tempo; elapsed_time+=tone) {
digitalWrite(speakerOut,HIGH);
delayMicroseconds(tone / 2);
digitalWrite(speakerOut, LOW);
delayMicroseconds(tone / 2); } } else { // In geval van een pauze, wacht. delayMicroseconds(beat*tempo); } }
// MAIN LOOP ============================= // Deze lus wordt steeds opnieuw herhaald. void loop() { // Doorloop de melodie noot per noot. for (int i=0; i<MAX_COUNT; i++) {
playTone(melody[i], beats[i]); // We voegen de pauze in tussen de verschillende noten. delayMicroseconds(pause);
} }
|