當前位置:成語大全網 - 書法字典 - 如何用C語言寫歌

如何用C語言寫歌

我們知道,音樂是音高和音長的有序組合。設計微型計算機音樂最重要的是如何定義音高和音長,以及如何使揚聲器發出指定的音符。下表顯示了音符和頻率之間的關系。C語言提供的三個函數sound()、nosound()和clock()可以輕松解決上述問題。聲音()功能可以以指定的頻率打開PC揚聲器,直到使用無聲音()功能將其關閉;Clock()函數只是用來控制發聲時間,不受PC主頻的影響。下面的程序可以使微機發出C調1的聲音。

音符-頻率關系表

註c d e f g a b

1 2 3 4 5 6 7

頻率262 294 330 349 392 440 494

註c d e f g a b

1 2 3 4 5 6 7

頻率523 587 659 698 784 880 988

註c d e f g a b

1 2 3 4 5 6 7

頻率1047 1175 1319 1397 2568 1760 1976。

# include & ltstdio.h & gt

# include & ltdos.h & gt

void pause(int);

void sound 1(int,int);

無效總管(無效)

{

int i,freq,speed = 5;

int time = 4 * speed

char * QM =“iddgwwwQQgfff dddfghhhggg ddgwwwqqgfff \

ddffhjqqqq wpggjhgdgqq hhqwwqjjjjggg \

ddgwwwqqqgfff ddffhjqqqqqq/*定義歌曲*/

while(* qm++!='\0'){

I = 1;

開關(* QM ){

案例“k”:

時間= 1 *速度;I = 0;

打破;

案例“I”:

時間= 6 *速度;I = 0;

打破;

案例“o”:

時間= 10 *速度;I = 0;

打破;

案例“p”:

暫停(時間);I = 0;

打破;

案例a:

freq = 523

打破;

案例:

freq = 587

打破;

案例“d”:

freq = 659

打破;

案例“f”:

freq = 698

打破;

案例“g”:

freq = 784

打破;

案例“h”:

freq = 880

打破;

案例“j”:

freq = 988

打破;

案例“z”:

freq = 262

打破;

案例“X”:

freq = 294

打破;

案例“c”:

freq = 330

打破;

案例“v”:

freq = 349

打破;

案例b:

freq = 392

打破;

案例“n”:

freq = 440

打破;

案例“m”:

freq = 494

打破;

案例“q”:

freq = 1047;

打破;

案例“w”:

freq = 1175;

打破;

案例“e”:

freq = 1319;

打破;

案例“r”:

freq = 1397;

打破;

案例“t”:

freq = 2568

打破;

案例“y”:

freq = 1760;

打破;

大小寫“u”:

freq = 1976;

打破;

默認值:

I = 0;

打破;

}

如果(壹)

sound 1(freq,time);

}

}

void sound 1(int freq,int time)/* freq是頻率,time是持續時間*/

{

工會

長除數;

無符號字符c【2】;

}計數;

無符號字符ch;

count . divisor = 1193280/freq;/* 1193280是系統時鐘速率*/

outp(67182);

outp(66,count . c【0】);

outp(66,count . c【1】);

ch = InP(97);

outp(97,ch | 3);

暫停(時間);

outp(97,ch);

}

無效暫停(間歇時間)

{

int t1,T2;

工會規章進、出;

in . h . ah = 0X2c;

int 86(0x 21;在& ampout);/*獲取當前時間*/

t 1 = T2 = 100 * out . h . DH+out . h . dl;/*out.h.dh是第二個值,out.h.dl是1/100第二個值*/

while(T2-t 1 & lt;時間)

{

int 86(0x 21;在& ampout);

T2 = 100 * out . h . DH+out . h . dl;

if(T2 & lt;t 1)T2+= 6000;/*增加壹分鐘*/

}

}