用C語言開發音樂程式

來源:互聯網
上載者:User

用C語言開發音樂程式

用C語言開發音樂程式主要用到兩個庫函數:

sound() 以指定頻率開啟PC機的擴音器,頻率以赫茲為單位。

nosound() 關閉擴音器。

一 樂譜檔案的製作

編寫音樂程式時,首先需要製作被演奏音樂的樂譜檔案。製作樂譜檔案可用不同的符號標記,只要所編製的程式易於識別即可。

下面是編製樂譜檔案的一種規則:最高音在每個音的前面加“*”:高音,在每個音的前面加“h”;中音,在每個音的前面加“m”;低音,在每個音的前面加“l”。

“*”,“h”,“m”,“l”與其控制的音符構成音高,決定發聲頻率。音高的後面是音長,可用整數或小數輸入,以控制延時,但中間必須用空格分開。樂譜檔案的最前端是一個整數,表示音長基數,一般為300的倍數。樂譜檔案的最末端是樂譜檔案結束符“##”,以表示樂譜檔案結束。

每個音的音長=音長基數*節拍數,其中,音長基數是樂譜檔案的第一個字元,如上面樂譜檔案為3600,每個音的音頻可用一類比頻率值輸入。下面是中央C及其前後4個8度中各個音符的頻率值

低8度 1 2 3 4 5 6 7

131 147 165 176 196 220 247

中央C 1 2 3 4 5 6 7

262 296 329.7 349.2 392 440 493.9

高8度 1 2 3 4 5 6 7

523.3 587.3 659.3 698.5 784.0 880 987.8

最高8度 1 2 3 4 5 6 7

1046.5 1174.7 1318.5 1396.9 1568.0 1760 1975.5

二 來源程式

#include<stdio.h>

#include<stdlib.h>

#include<dos.h>

void main(int argc,char *argv[])

{

FILE *fp;

int rate;

char sound_high[3];

float sound_long;

register int i=0,j;

int sign=0;

float str[200][2];

if(argc!=2) /*命令列參數個數不正確*/

{

printf("Parameters Errors!\n");

exit(1);

}

if((fp=fopen(argv[1],"r"))==NULL) /*檔案開啟失敗*/

{

printf("Open file music.doc Errors!\n");

exit(1);

}

fscanf(fp,"%d",&rate);/*讀取音長基數的值*/

while(!feof(fp)&&!sign) /*檔案沒有結束並且資料還是樂譜*/

{

fscanf(fp,"%s%f",sound_high,&sound_long); /*得到音頻,音長的數值*/

str[1]=rate*sound_long; /*音長=音長基數*節拍數*/<BRTCH(SOUND_HIGH[0])

{

case'*': /*最高音*/

{

case'1':

str[i++][0]=1046.5;

break;

case'2':

str[i++][0]=1174.7;

break;

case'3':

str[i++][0]=1318.5;

break;

case'4':

str[i++][0]=1396.9;

break;

case'5':

str[i++][0]=1568;

break;

case'6':

str[i++][0]=1760;

break;

case'7':

str[i++][0]=1975.5;

break;

default:

printf("\nErrors in music.doc\n");

exit(1);

}

case'h': /*高音*/<BRTCH(SOUND_HIGH[1])

{

case'1':

str[i++][0]=523.3;

break;

case'2':

str[i++][0]=587.3;

break;

case'3':

str[i++][0]=659.3;

break;

case'4':

str[i++][0]=698.5;

break;

case'5':

str[i++][0]=784.0;

break;

case'6':

str[i++][0]=880;

break;

case'7':

str[i++][0]=987.8;

break;

default:

printf("\nErrors in music.doc\n");

exit(1);

}

case'm': /*中音*/<BRTCH(SOUND_HIGH[1])

{

case'1':

str[i++][0]=262;

break;

case'2':

str[i++][0]=296;

break;

case'3':

str[i++][0]=329.6;

break;

case'4':

str[i++][0]=349.2;

break;

case'5':

str[i++][0]=392;

break;

case'6':

str[i++][0]=440;

break;

case'7':

str[i++][0]=493.9;

break;

default:

printf("\nErrors in music.doc\n");

exit(1);

}

case'l': /*低音*/<BRTCH(SOUND_HIGH[1])

{

case'1':

str[i++][0]=131;

break;

case'2':

str[i++][0]=147;

break;

case'3':

str[i++][0]=165;

break;

case'4':

str[i++][0]=176;

break;

case'5':

str[i++][0]=196;

break;

case'6':

str[i++][0]=220;

break;

case'7':

str[i++][0]=247;

break;

default:

printf("\nErrors in music.doc\n");

exit(1);

}

case'#':

if(sound_high[1]=='#')sign=1;

break;

default:

printf("\nErrors in music.doc\n");

exit(1);

}

}

for(j=0;j<=i-1;j++)

{

sound(str[j][0]); /*按頻率發出歌曲的音調*/

delay(50*str[j][1]);

}

nosound(); /*關閉擴音器*/

}

三 樂譜例:巴哈的《小步舞曲》

600 h2 4 m5 1 m6 1 m7 1 h1 1 h2 4 m5 4 m5 4 h3 4 h1 1 h2 1 h3 1 h4 1 h5 4 m5 4 m5 4 h1 4 h2 1 h1 1 m7 1 m6 1 m7 4 h1 1 m7 1 m6 1 m5 1 m4 4 m5 1 m6 1 m7 1 m5 1 m6 6 l2 1 m1 1 l7 1 l6 1 h2 4 m5 1 m6 1 m7 1 h1 1 h2 4 m5 4 m5 4 h3 4 h1 1 h2 1 h3 1 h4 1 h5 4 m5 4 m5 4 h1 4 h2 1 h1 1 m7 1 m6 1 m7 4 h1 1 m7 1 m6 1 m5 1 m6 4 m7 1 m6 1 m5 1 m4 1 m5 10 ##

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.