程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 如何用C程序簡單演奏樂曲,演奏樂曲

如何用C程序簡單演奏樂曲,演奏樂曲

編輯:關於C語言

如何用C程序簡單演奏樂曲,演奏樂曲


如何用C程序簡單演奏樂曲

首先我們要介紹一個函數:

Beep(Frequency,time)

如果我們在程序中運行這個函數

Int main(void)

{

       Beep(Frequency,time);

}

那麼系統將會以Frequency Hz 的頻率發出滴的一聲並持續time ms。

顯然,多次調用這個函數,我們就可以簡單演奏樂曲了。

很簡單是吧!

但是當你開始實踐時,你就會發現,你的樂理水平簡直為零,根本無法看懂一般的簡譜。

於是我們來補充一點樂理知識。

根據這個函數的作用,我們只需明白樂曲中每個音的頻率以及持續的時間就能解決問題了。

先說說音調:

這東西太復雜了,表示看了一大堆關於音調的資料後按著曲譜搞出來一個程序,結果還整體的低了半個八度。最後我的解決辦法是:直接找了個大部分情況下靠譜的頻率先用著,萬一不行再調整。

我找的頻率是:

do          re           mi          fa           sol          la           si

440        495     550        587        660        733        825   單位:Hz

關於怎麼調整,鑒於我可憐的樂理水平,就不在此誤人子弟了。我就祈禱你們不用調吧。

除了基本的頻率外,有時音符的上方或者下方會有個小點,這表示這個音升八度或者降八度,反映在頻率上就是這個音的頻率乘以2或者除以二。

比如說  1 的頻率是 440 Hz 則 1(·)的頻率就是 440*2=880Hz 而 1 的頻率就是 440/2=220Hz,現在音調方面基本上沒什麼問題了。

再說說時間:

在簡譜中

普通的音符就代表1拍

如果音符後面跟著像這樣的 – 符號,那麼有幾個這個符號這個音符就延長幾拍。

還有些音符下面有下劃線,有的還有兩根甚至三根下劃線。

對於這種音符,它每有一根下劃線它的時間就會除以二

這樣時間基本上也沒有什麼問題了。

但是最重要的,1拍到底是多少秒呢?

根據我查的資料,1拍的長度並不固定,可能是1分鐘60拍,也可能是120拍。具體的你可以調整1拍的長度試著看來找到一個最好的長度。

基本的樂理了解完畢,剩下的事情就簡單了,不過就是對著樂譜打無數個Beep了。

 

但是這麼機械的事情有什麼意思,我們絕不重復造輪子。於是,考慮到所需的程序結構及其簡單,我們可以用另一個程序來生成這個程序。而我們只需在程序中輸入每個音符的符號和時間以及1拍的長度這些必不可少的數據。

現用我做的程序為例子這個程序運行後會生成一個所需的,能演奏樂曲的程序源代碼。

 

#include<stdio.h>

int T;                                   //用全局變量表示一拍的時間,這裡的T表示1分鐘有多少拍

int Hz[8]={0,440,495,550,587,660,733,825};                  //用全局變量存儲好各個音符的基本頻率

FILE *p;                                                                         //用於指向目標文件的指針

void music(int hz,int i,int t)                                             //定義一個函數用於在目標的程序中打印Beep函數

{     

       hz=Hz[hz];

       if (i==0)                           //這些if語句用於決定頻率是升八度、不變、還是降八度

              hz=hz/2;

       if (i==2)

              hz=hz*2;

       fprintf(p,"       Beep(%d,%d);\n",hz,60000/T/4*t);      //打印Beep

}

int main(void)

{

       int n=1;

       int hz,t,x;

       p=fopen("music.c","w");                                             //創建目標文件

       scanf("%d",&T);                                              //從外部輸入T,方便調整1拍的長度

       fprintf(p,"int main(void)\n{\n");                                   //打印目標程序

       while(n)

       {

              scanf("%d %d %d %d",&hz,&x,&t,&n);                  //輸入每個音符的音調、是否升降調、時間,和用於表示輸入未結束的標志

              music(hz,x,t);

       }

       fprintf(p,"       return 0;\n}");

       fclose(p);

       return 0;

}

 

我的輸入數據為《我的山大我的家》:

80

3 1 2 1

3 1 2 1

3 1 2 1

2 1 2 1

3 1 8 1

2 1 2 1

2 1 2 1

2 1 2 1

6 0 2 1

1 1 8 1

6 0 2 1

5 0 2 1

6 0 2 1

2 1 2 1

2 1 8 1

3 1 2 1

5 1 2 1

5 1 2 1

3 1 2 1

2 1 8 1

3 1 2 1

3 1 2 1

2 1 2 1

5 1 2 1

3 1 8 1

2 1 2 1

2 1 2 1

1 1 2 1

2 1 2 1

6 0 8 1

6 0 2 1

5 0 2 1

6 0 2 1

2 1 2 1

2 1 8 1

2 1 2 1

2 1 1 1

3 1 1 1

2 1 2 1

6 0 2 1

1 1 8 1

3 1 2 1

3 1 2 1

2 1 2 1

3 1 2 1

3 1 8 1

2 1 2 1

2 1 1 1

3 1 1 1

2 1 2 1

6 0 2 1

1 1 8 1

6 0 2 1

1 1 2 1

1 1 2 1

6 0 2 1

2 1 8 1

5 1 2 1

5 1 2 1

1 1 2 1

3 1 2 1

2 1 8 1

3 1 2 1

3 1 2 1

2 1 2 1

5 1 2 1

3 1 8 1

2 1 2 1

2 1 2 1

1 1 2 1

2 1 2 1

6 0 8 1

6 0 2 1

5 0 2 1

6 0 2 1

2 1 2 1

2 1 8 1

2 1 2 1

6 0 2 1

1 1 2 1

2 1 2 1

1 1 8 1

5 1 4 1

5 1 2 1

3 1 2 1

5 1 2 1

6 1 2 1

1 2 2 1

1 2 1 1

6 1 1 1

5 1 2 1

5 1 1 1

6 1 1 1

5 1 2 1

1 1 2 1

2 1 2 1

6 1 1 1

5 1 1 1

5 1 8 1

6 1 2 1

6 1 2 1

5 1 2 1

3 1 1 1

2 1 1 1

1 1 2 1

3 1 2 1

2 1 2 1

2 1 1 1

3 1 1 1

5 1 2 1

5 1 2 1

1 1 2 1

3 1 2 1

2 1 8 1

5 1 2 1

5 1 1 1

3 1 1 1

5 1 2 1

6 1 2 1

1 2 2 1

1 2 1 1

6 1 1 1

5 1 2 1

5 1 1 1

6 1 1 1

5 1 2 1

1 1 2 1

2 1 2 1

1 1 2 1

6 0 8 1

2 1 2 1

2 1 2 1

2 1 2 1

1 1 2 1

2 1 2 1

6 1 1 1

5 1 1 1

5 1 2 1

2 1 1 1

3 1 1 1

2 1 2 1

2 1 2 1

6 0 2 1

1 1 2 1

1 1 8 1

5 1 4 1

3 1 2 1

6 1 1 1

5 1 1 1

5 1 8 1

3 1 4 1

3 1 2 1

3 1 2 1

2 1 8 1

5 1 4 1

1 1 2 1

2 1 2 1

6 0 8 1

2 1 4 1

2 1 2 1

1 1 2 1

2 1 8 1

5 1 4 1

3 1 2 1

6 1 1 1

5 1 1 1

5 1 8 1

3 1 4 1

3 1 2 1

3 1 2 1

2 1 8 1

5 1 4 1

1 1 2 1

2 1 2 1

6 0 8 1

2 1 4 1

2 1 2 1

6 0 2 1

1 1 8 1

2 1 8 1

2 1 4 1

6 0 4 1

1 1 16 0

最後生成的源代碼:

int main(void)

{

       Beep(550,374);

       Beep(550,374);

       Beep(550,374);

       Beep(495,374);

       Beep(550,1496);

       Beep(495,374);

       Beep(495,374);

       Beep(495,374);

       Beep(366,374);

       Beep(440,1496);

       Beep(366,374);

       Beep(330,374);

       Beep(366,374);

       Beep(495,374);

       Beep(495,1496);

       Beep(550,374);

       Beep(660,374);

       Beep(660,374);

       Beep(550,374);

       Beep(495,1496);

       Beep(550,374);

       Beep(550,374);

       Beep(495,374);

       Beep(660,374);

       Beep(550,1496);

       Beep(495,374);

       Beep(495,374);

       Beep(440,374);

       Beep(495,374);

       Beep(366,1496);

       Beep(366,374);

       Beep(330,374);

       Beep(366,374);

       Beep(495,374);

       Beep(495,1496);

       Beep(495,374);

       Beep(495,187);

       Beep(550,187);

       Beep(495,374);

       Beep(366,374);

       Beep(440,1496);

       Beep(550,374);

       Beep(550,374);

       Beep(495,374);

       Beep(550,374);

       Beep(550,1496);

       Beep(495,374);

       Beep(495,187);

       Beep(550,187);

       Beep(495,374);

       Beep(366,374);

       Beep(440,1496);

       Beep(366,374);

       Beep(440,374);

       Beep(440,374);

       Beep(366,374);

       Beep(495,1496);

       Beep(660,374);

       Beep(660,374);

       Beep(440,374);

       Beep(550,374);

       Beep(495,1496);

       Beep(550,374);

       Beep(550,374);

       Beep(495,374);

       Beep(660,374);

       Beep(550,1496);

       Beep(495,374);

       Beep(495,374);

       Beep(440,374);

       Beep(495,374);

       Beep(366,1496);

       Beep(366,374);

       Beep(330,374);

       Beep(366,374);

       Beep(495,374);

       Beep(495,1496);

       Beep(495,374);

       Beep(366,374);

       Beep(440,374);

       Beep(495,374);

       Beep(440,1496);

       Beep(660,748);

       Beep(660,374);

       Beep(550,374);

       Beep(660,374);

       Beep(733,374);

       Beep(880,374);

       Beep(880,187);

       Beep(733,187);

       Beep(660,374);

       Beep(660,187);

       Beep(733,187);

       Beep(660,374);

       Beep(440,374);

       Beep(495,374);

       Beep(733,187);

       Beep(660,187);

       Beep(660,1496);

       Beep(733,374);

       Beep(733,374);

       Beep(660,374);

       Beep(550,187);

       Beep(495,187);

       Beep(440,374);

       Beep(550,374);

       Beep(495,374);

       Beep(495,187);

       Beep(550,187);

       Beep(660,374);

       Beep(660,374);

       Beep(440,374);

       Beep(550,374);

       Beep(495,1496);

       Beep(660,374);

       Beep(660,187);

       Beep(550,187);

       Beep(660,374);

       Beep(733,374);

       Beep(880,374);

       Beep(880,187);

       Beep(733,187);

       Beep(660,374);

       Beep(660,187);

       Beep(733,187);

       Beep(660,374);

       Beep(440,374);

       Beep(495,374);

       Beep(440,374);

       Beep(366,1496);

       Beep(495,374);

       Beep(495,374);

       Beep(495,374);

       Beep(440,374);

       Beep(495,374);

       Beep(733,187);

       Beep(660,187);

       Beep(660,374);

       Beep(495,187);

       Beep(550,187);

       Beep(495,374);

       Beep(495,374);

       Beep(366,374);

       Beep(440,374);

       Beep(440,1496);

       Beep(660,748);

       Beep(550,374);

       Beep(733,187);

       Beep(660,187);

       Beep(660,1496);

       Beep(550,748);

       Beep(550,374);

       Beep(550,374);

       Beep(495,1496);

       Beep(660,748);

       Beep(440,374);

       Beep(495,374);

       Beep(366,1496);

       Beep(495,748);

       Beep(495,374);

       Beep(440,374);

       Beep(495,1496);

       Beep(660,748);

       Beep(550,374);

       Beep(733,187);

       Beep(660,187);

       Beep(660,1496);

       Beep(550,748);

       Beep(550,374);

       Beep(550,374);

       Beep(495,1496);

       Beep(660,748);

       Beep(440,374);

       Beep(495,374);

       Beep(366,1496);

       Beep(495,748);

       Beep(495,374);

       Beep(366,374);

       Beep(440,1496);

       Beep(495,1496);

       Beep(495,748);

       Beep(366,748);

       Beep(440,2992);

       return 0;

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved