Beep(Frequency, Duration); // Frequency: Hz, Duration: ms (Windows API)
Linux 可用 ioctl 控制蜂鳴器或 system("beep -f ... -l ...")。
| 唱名 | 頻率(Hz) | 升八度(·) | 降八度(,) |
|---|---|---|---|
| 1 (do) | 440 | 880 | 220 |
| 2 (re) | 495 | 990 | 247.5 |
| 3 (mi) | 550 | 1100 | 275 |
| 4 (fa) | 587 | 1174 | 293.5 |
| 5 (sol) | 660 | 1320 | 330 |
| 6 (la) | 733 | 1466 | 366.5 |
| 7 (si) | 825 | 1650 | 412.5 |
節拍:簡譜 1 拍 = 基準時長。附點 - 延長,下劃線 _ 減半。
編寫一個「產生器」程式,讀取樂譜資料(唱名、升降、節拍),輸出可直接編譯的 music.c:
#includeint T; // 每分鐘拍數 (BPM) int Hz[8] = {0,440,495,550,587,660,733,825}; FILE *p; void music(int hz, int octave, int beats) { hz = Hz[hz]; if (octave == 0) hz /= 2; // 降八度 if (octave == 2) hz *= 2; // 升八度 // 1拍 = 60000/T ms,四分音符 = 1/4 拍 fprintf(p, " Beep(%d,%d);\n", hz, 60000/T/4*beats); } int main() { int n=1, hz, oct, beat; p = fopen("music.c", "w"); scanf("%d", &T); fprintf(p, "int main(void)\n{\n"); while (n) { scanf("%d %d %d %d", &hz, &oct, &beat, &n); music(hz, oct, beat); } fprintf(p, " return 0;\n}\n"); fclose(p); return 0; }
80 // BPM 3 1 2 1 // 唱名3 升八度 2拍 繼續 3 1 2 1 ... 1 1 16 0 // 結束標誌 n=0
int main(void) {
Beep(550,374);
Beep(550,374);
...
Beep(440,2992);
return 0;
}
Beep 介面。