首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言 Beep 函式演奏音樂:從樂理到自動生成播放程式

     編輯:關於C語言

Beep 函式原型

Beep(Frequency, Duration);  // Frequency: Hz, Duration: ms (Windows API)

Linux 可用 ioctl 控制蜂鳴器或 system("beep -f ... -l ...")。

樂理速成

唱名頻率(Hz)升八度(·)降八度(,)
1 (do)440880220
2 (re)495990247.5
3 (mi)5501100275
4 (fa)5871174293.5
5 (sol)6601320330
6 (la)7331466366.5
7 (si)8251650412.5

節拍:簡譜 1 拍 = 基準時長。附點 - 延長,下劃線 _ 減半。

自動生成播放程式

編寫一個「產生器」程式,讀取樂譜資料(唱名、升降、節拍),輸出可直接編譯的 music.c:

#include 

int 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

生成的 music.c 片段

int main(void) {
    Beep(550,374);
    Beep(550,374);
    ...
    Beep(440,2992);
    return 0;
}

優化方向

  • 支援附點、休止符、連音。
  • 改用 MIDI 或音頻庫獲得更好音色。
  • 跨平台抽象 Beep 介面。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved