لتشغيل ألحان كاملة نخزّن النغمات ومددها في مصفوفتين متوازيتين: مصفوفة الترددات ومصفوفة المدد. ثم نمر عليهما بحلقة for ونشغّل كل نغمة بالترتيب. يمكن بهذه الطريقة برمجة أي لحن تريده — من نشيد وطني إلى مقطع من أغنيتك المفضلة!
// ===== لحن 'تويكل تويكل' =====
#define BUZZER 8
// ترددات النغمات (0 = صمت)
int melody[] = {
262, 262, 392, 392, 440, 440, 392, 0,
349, 349, 330, 330, 294, 294, 262, 0,
392, 392, 349, 349, 330, 330, 294, 0,
392, 392, 349, 349, 330, 330, 294, 0,
262, 262, 392, 392, 440, 440, 392, 0,
349, 349, 330, 330, 294, 294, 262
};
// مدد النغمات بالميلي ثانية
int durations[] = {
400,400,400,400,400,400,800,400,
400,400,400,400,400,400,800,400,
400,400,400,400,400,400,800,400,
400,400,400,400,400,400,800,400,
400,400,400,400,400,400,800,400,
400,400,400,400,400,400,800
};
int noteCount = sizeof(melody) / sizeof(melody[0]);
void setup() {}
void loop() {
for (int i = 0; i < noteCount; i++) {
if (melody[i] == 0) {
noTone(BUZZER);
} else {
tone(BUZZER, melody[i], durations[i] * 0.9);
}
delay(durations[i]);
noTone(BUZZER);
}
delay(2000); // استراحة بين التكرارات
}
ضرب مدة النغمة بـ 0.9 قبل تشغيلها يُنشئ فراغاً صغيراً بين النغمات يجعل اللحن يبدو طبيعياً وغير متلاصق!
| مدة النغمة | الرمز الموسيقي | المدة بالـ ms (BPM=120) |
|---|
| كاملة | 𝅝 | 2000 ms |
| نصف | 𝅗𝅥 | 1000 ms |
| ربع | ♩ | 500 ms |
| ثمن | ♪ | 250 ms |
| سادس عشر | 𝅘𝅥𝅯 | 125 ms |