1、,&snd);/* if the answer it to exit ,do so. */ if (snd=0) break;/* Ask how many times to repast the sound. */Nunger of times:/* get the answer */scanf(cnt);/* repeat the sound the number of time specifed */while(cnt-)/* swich on type of sound to produce*/switch (snd)case 1: /* do a siren:sweep up */f
2、or (note=1000;note150;note-=10)sound(note);delay(20);/* Sweep down */for (;note1000;note+=10) delay(20);break;case 2: /* do an overload. sweep up */ for (note=4000;10;delay(70);case 3: /* do a whoop: Sweep up*/ for (note=1000; sound (note);delay (200);case 4: /* do a phaser: sweep down */ for (note=
3、60; notestdlib.htime.hint i,j;randomize();while(!bioskey(1)i=rand()*5000;sound(i);delay(10);nosound();前台音乐设计 首先我们来看下面这个例子,演奏的是好人一生平安#define N1 64#define N2 32#define N4 16#define N8 8#define N16 4#define END 0enum NOTESC10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247,C0=262,D0=296,E0=330,F0=3
4、49,G0=392,A0=440,B0=494,C1=525,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988,C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1796song= D0,N4,E0,N8,D0,N8,C0,N4,A10,N4,G10,N8,E10,N8,G10,N8,A10, N8,C0,N2,A10,N4,A10,N8,C0,N8,G10,N8,A0,N8,E0,N8,G0,N8, D0,N2,E0,N4,D0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,
5、 N8,A10,N8,C0,N2,A10,N4,A10,N8,C0,N8,A10,N8,A10,N8,D10, N8,E10,N8,G10,N2,D0,N4,D0,N4,G0,N4,A0,N8,G0,N8,F0,N2,G0, N2,A0,N4,G0,N8,E0,N8,D0,N8,E0,N8,C0,N8,A10,N8,D0,N2,E0, N4,G0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8,G10,N8,A10,N8, C0,N4,A10,N4,A10,N8,C0,N8,D0,N8,A10,N8,C0,N8,E0,N8,D0, N1,END,END; main() i
6、nt note=0,fre,dur,control; clock_t goal; while(songnote!=0) fre=songnote; dur=songnote+1; if(kbhit() break; if(fre) outportb(0x43,0xb6); fre=(unsigned)(1193180L/fre); outportb(0x42,(char)fre); outportb(0x42,(char)(fre8); control=inportb(0x61); outportb(0x61,(control)|0x3); goal=(clock_t)dur+clock( )
7、; while(goalclock ( ); outportb(0x61,control); goal=(clock_t)0;note=note+2; 音乐是时间的艺术,即把各种音符按不同的时值演奏出来,就可以构成曲调。因此,音乐程序设计中的两个重要因素是:如何用“曲调定义语言”来表示音符(即音高);如何控制音符的持续时间(即音长)。解决了这两个问题之后,剩下的就是如何用c语言控制计算机的扬声器发声。下面我们详细的讲解一下。 (1)音符及音长的定义 音调由音符构成,音调的高低由音符频率决定,频率越高,音调也越高。音乐中使用的频率一般为1311976HZ,它包括了中央C调及其前后的4个8度的音程
8、。 用c语言中的枚举类型常量可定义上述表中的各音符的频率。如果音乐中有比表中的音符更高的音调,则可根据表上的有关值推出,如高8度的C,D和E的频率分别为2091,2350和2638,还需作适当的调整。 EnumNOTES C10=131,DlO=147,ElO=165,FlO=175,GlO=196,A10=220,B10=247 CO=262,DO=294,EO=330,FO=349,GO=392,AO=440,BO=494, C1=523,Dl=587,EI=659,Fl=698,G1=784,A1=880,B1=988, C2=1047,D2=1175,E2=1319,F2=1397,G
9、2=1568,A2=1760,B2=1976 音长即一个音符的持续题意。在乐曲中,音长用全音符、半音符、4分音符来表示,通常以4分音符一拍,等等。音长可用下面定义: #define N1 32 #define N2 16 #define N4 8 #define N8 4 #define N16 2 #define END 0 如果感觉计算机所演奏的乐曲速度过快,可以适当调整上面的值。 (2) 用C语言定义音乐 NOTES类型中各音调对应的简谱如下: 上面的乐谱共有10个音符,其音高和音长如下: (3) 如何控制扬声器如何控制扬声器发生,则可用Turbo C中的库函数中outportb(int
10、 port, char byte),函数的原型在”dos.h”文件中,port为端口地址,byte为传送给端口的字节。扬声器的端也址为0x42,下面的程序中主要是发声的频率。另外,还需要使发声延迟,就要用到”clock_t”,类型变量goal和clock()库函数,变量和程序的原型在”time.h”文件中,使扬声器发声的步骤为: 初始化端口0x42; 向端口0x42传送声频率fre;延迟:当goalclock()时,做循环。后台音乐设计 后台音乐设计主要是程序的背景声音,看下面的例子:graphics.hfcntl.hvoid interrupt(* handler)( );void inte
11、rrupt music( );int handle,control; C10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247, C0=262, D0=296, E0=330, F0=349, G0=392, A0=440, B0=494, C1=523, D1=587, E1=659, F1=698, G1=784, A1=880, B1=988, C2=1047, D2=1175, E2=1319, F2=1397, G2=1568, A2=1760, B2=1796 E1,N4,E1,N8,E1,N8,F1,N4,G1,N4,F1,N
12、4,F1,N4,E1,N4,D1, N4,C1,N4,C1,N4,D1,N4,E1,N4,E1,N4,D1,N4,D1,N4,E1,N4, E1,N8,E1,N8,F1,N4,G1,N4,G1,N4,F1,N4,E1,N4,D1,N4,C1, N4,C1,N4,D1,N4,E1,N4,D1,N4,D1,N4,C1,N4,D1,N4,D1,N8, D1,N8,E1,N4,C1,N4,D1,N4,E1,N8,F1,N8,E1,N4,C1,N4,D1, N4,E1,N8,F1,N8,E1,N4,C1,N4,C1,N4,D1,N4,G0,N4,E1,N4, E1,N4,E1,N8,F1,N4,G1,N
13、4,G1,N4,F1,N4,E1,N4,D1,N4,C1, N4,C1,N4,D1,N4,E1,N4,E1,N4,D1,N4,C1,N4,D1,N4, END,END ; int gdriver=VGA,gmode=1,i; initgraph (&gdriver,&gmode, handler=getvect(0x1c); setvect(0x1c,music);cleardevice( );setbkcolor(BLUE);setcolor(YELLOW);setfillstyle(SOLID_FILL,RED);sector(200,150,50,120,70,50);bar3d(400
14、,150,500,200,10,5);setactivepage(1);sector(200,150,50,170,70,50);bar3d(400,200,500,250,10,5);for(i=0;i(int)dur*2/5*/fre) flag=0; note=note+2; if(note=134)note=0; handler();乐谱文件的制作 我们在这里使用的乐谱文件格式如下:最高音的前面加”*”;高音,在每个音的前面加”h”;中音,在每个音的前面加”m”;低音,在每个音的前面加”L”。“*”、“h”、“m”、“L”与其控制的音符构成音高,决定发声频率。音高的后面是音长,可用整数
15、或小数输入,以控制延时,但中间必须用空格分开。乐谱文件的最前端是一个整数,表示音长基数,一般为300、600、900、1200。乐谱文件的最末端是乐谱文件结束符”#”,以表示乐谱文件结束。下面是电影void main(int argc,char *argv)FILE *fp;int rate;char sound_high3;float sound_long;register int i=0, j ;int sign=0;float str1002;if(argc!=2) /* 命令行参数个数不正确 */ printf(Pararneters Errors! n) ;exit(1);if(fp
16、=fopen(argv1,r)=NULL) /*文件打开失败 */open file music, doc Errors! ); exit (1);fscanf(fp, &rate ); /* 读取音长基数的值*/feof(fp)&!sign ) /* 文件没有结束并且数据还是乐谱 */ fscanf(fp,%s %f,sound_high,&sound_long); /* 得到音频、音长的数值 */ stri1=rate*sound_long; /* 音乐= 音长基数*节拍数*/ switch(sound_high0) case *: /* 最高音 */switch (sound_high1
17、) /* 确定发音的频率 */1 stri+0=1046.5;2 stri+0=1174.7;3 stri+0=1318.5;4 stri+0=1396.9; brcak:5 stri+0=1568;6 stri+0=1760;7 stri+0=1975.5; default: printf ( n Errors in music.doc n exit(1);case h /* 高音*/switch(sound_high1) stri+0=523.3;stri+0=587.3;stri+0=659.3; stri+0=698.5; stri+0=784.0;stri+0=880;stri+0=
18、987.8;n Errors in music.doc n m /* 中音 */ switch(sound_high1) stri+0=262; stri+0=296; stri+0=329.6; stri+0=349.2; stri+0=392;stri+0=440;stri+0=493.9;printf ( l /* 低音 */ stri+0=131; stri+0=147; stri+0=165; stri+0=176; stri+0=196; stri+0=220; stri+0=247;printf( # if(sound_high1=) sign=1;exit (1);for(j=
19、0;j#define CENTERX 320 /*表盘中心位置*/#define CENTERY 175#define CLICK 100 /*喀嗒声频率*/#define CLICKDELAY 30 /*喀嗒声延时*/#define HEBEEP 10000 /*高声频率*/#define LOWBEEP 500 /*低声频率*/#define BEEPDELAY 200 /*报时声延时*/*表盘刻度形状*/int Mrk_18=-5,-160,5,-160,5,-130,-5,-130, ;int Mrk_28=-5,-160,5,-160,2,-130,-2-130, ;/*时针形状*/int HourHand
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1