// a piezoelektromos kristály "hangszóró" a 9-ik
// digitális tűre van csatlakoztatva
int hangszoroTu = 9;

// a hangjegyek száma a dallamban
int ahangjegyekszama = 28;

// a dallam egy sorozatban vannak megadva
// a betűk a hangjegyeket, a végén a szóköz szünetet jelent
char hangjegysor[] = "cecegg cecegg Chagfa gfedcc ";

// az egymást követő hangok hossza egy sorozatban van megadva
int hanghossza[] = { 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,1,1,1,2,1,1,1,1,1,1,2,1,4 };
int sebesseg = 300;

// létrehozza a szolaHang függvényt, amely megszólaltatja a hangot
// a függvény két egész számú változót kér, melyek: hang és idotartam
// a hang változó a szolaHangjegyHangja függvényben kap értéket
// Itt rezegtetjük meg a membránt!
void szolaHang(int hang, int idotartam) {

// alább egy ismétlődő rész következik:
// tedd, míg i kisebb (időtartam x 1000L) értékénél
// Mi az L? Válasz itt, az U & L formatters cím alatt:
// http://arduino.cc/en/Reference/IntegerConstants
// i értékét növeld minden lépésben a hang változó kétszeresével
// i += hang 2 jelentése: i = i + hang x 2
for (long i = 0; i < idotartam 1000L; i += hang * 2) {
// 5 Voltot adunk a piezoelektromos kristálynak
digitalWrite(hangszoroTu, HIGH);
// legyen 5V a 'hang' értékének megfelelő időhosszig
delayMicroseconds(hang);
// 0 Voltot adunk a piezoelektromos kristálynak
digitalWrite(hangszoroTu, LOW);
// legyen 0V a 'hang' értékének megfelelő időhosszig
delayMicroseconds(hang);
}
}

// létrehozza a szolaHangjegyHangja függvényt, amely
// kér egy betűjel (hangjegy), és egy egész számú (idotartam) változót,
// megadja a hangjegyek neveit és a nekik megfelelő hosszúságú időtartamot,
// ameddig majd kapják a szögletes hullám MAGAS értékét.
void szolaHangjegyHangja(char hangjegy, int idotartam) {
char hangjegynevek[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'h', 'C' };
int hangok[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

// lejátssza a hangjegy nevének megfelelő hangot
for (int i = 0; i < 8; i++) {
// ha a hangjegyeknevek sorozatból az egyik elem
// megfelel a hangjegy változó pillanatnyi értékének
if (hangjegynevek[i] == hangjegy) {
// akkor hívja a szolaHang függvényt a következő változókkal
// hangok és időtartam; itt a hangok[i] értéke
// lesz a hang változó értéke a szolaHang függvény számára
szolaHang(hangok[i], idotartam);
}
}
}

// a digitális 9-ik tű kimenetre van beállítva
void setup() {
pinMode(hangszoroTu, OUTPUT);
}

// ezt ismételgeti, míg le nem játszotta
// a dallam összes hangját
void loop() {
// amíg az i változó értéke nem lesz 28, addig ismétli
// a lenti parancsokat, vagyis lejátssza egyenként
// a dallam hangjait
for (int i = 0; i < ahangjegyekszama; i++) {
// ha a hangjegysor eleme szóköz,
if (hangjegysor[i] == ' ') {
// akkor szünet lesz egy darabig
delay(hanghossza[i] sebesseg); // ez a szünet
} else {
// máskülönben megszólal egy hang a hangjegysorból
// hívjuk a szolaHangjegyHangja függvényt, megadva neki a
// a hangjegysor egyik elemét, a hang hosszát szorozva a sebességgel
szolaHangjegyHangja(hangjegysor[i], hanghossza[i] sebesseg);
}

// szünet a dallam hangjai között
delay(sebesseg / 2);
}
}