《C语言高级程序设计讲座.doc》由会员分享,可在线阅读,更多相关《C语言高级程序设计讲座.doc(14页珍藏版)》请在金锄头文库上搜索。
1、C语言高级程序设计讲座3C语言程序设计 2009-07-27 08:48 阅读156 评论0 字号: 大 中 小小 技术支持:http:/202.112.86.129 经过上面两节课的学习,我们应该对C语言的图形设计有一定的了解,这节课我们主要讲一下C语言的发音,让你的程序声图并茂。学习目标 学习用C语言发声 了解声音功能函数 了解乐谱文件的制作 能够结合图像与声音,让你的程序声图并茂打破沉寂 首先我们来看一个源代码:#define FALSE 0#define TRUE 1#includemain()int snd; /* which sound to produce */int cnt;
2、/* number of times to repeat sound */int note; /* Current note, when sweeping frequencies */while (TRUE) /* Male Sure any previous sounds ave turned off. */ nosound();/* Ask the user for which type of sounf*/printf (1-siren;2-overload;3-whoop;4-phaser; 0-exit);/* read the answer */ scanf (%d,&snd);/
3、* if the answer it to exit ,do so. */ if (snd=0) break;/* Ask how many times to repast the sound. */printf (Nunger of times:);/* get the answer */scanf(%d,&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 u
4、p */for (note=1000;note150;note-=10)sound(note);delay(20);/* Sweep down */for (;note10;note-=10)sound(note);delay(70);break;case 3: /* do a whoop: Sweep up*/ for (note=1000;note10;note-=10) sound (note);delay (200);break;case 4: /* do a phaser: sweep down */ for (note=60; note2000;note+=10 )sound (n
5、ote);delay(100);break;default: /* unknown,ask a gain */ printf ( Invalid entry;try again n); break; 请大家打开TC运行该代码,程序重复的询问用户要产生哪一种声音。C语言调用两个库函数使PC发出声音:sound()打开声音;nosound()关闭声音。他们包含在dos.h中,格式如下: void sound (unsigned int frequency); void nosound (void); 其中frequency为频率,单位Hz。 为了使声音持续一段时间,我们还常用delay()函数,格
6、式如下: void delay(unsigned int milliseconde); 其中milliseconde表示所需延时的时间。 下面这个例子将不断发出各种频率的声音:#include#include#include#includemain()int i,j;randomize();while(!bioskey(1)i=rand()*5000;sound(i);delay(10);nosound();前台音乐设计 首先我们来看下面这个例子,演奏的是好人一生平安#include#include#define N1 64#define N2 32#define N4 16#define N
7、8 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=349,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,G1
8、0,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,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,
9、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() int 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
10、); outportb(0x42,(char)(fre8); control=inportb(0x61); outportb(0x61,(control)|0x3);goal=(clock_t)dur+clock( ); while(goalclock ( ); if(fre) outportb(0x61,control); goal=(clock_t)0;note=note+2; 音乐是时间的艺术,即把各种音符按不同的时值演奏出来,就可以构成曲调。因此,音乐程序设计中的两个重要因素是:如何用“曲调定义语言”来表示音符(即音高);如何控制音符的持续时间(即音长)。解决了这两个问题之后,剩下的就
11、是如何用c语言控制计算机的扬声器发声。下面我们详细的讲解一下。 (1)音符及音长的定义 音调由音符构成,音调的高低由音符频率决定,频率越高,音调也越高。音乐中使用的频率一般为1311976HZ,它包括了中央C调及其前后的4个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
12、=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,G2=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 如果感觉计算机所演奏的乐曲速度过快,
13、可以适当调整上面的值。 (2) 用C语言定义音乐 NOTES类型中各音调对应的简谱如下: 上面的乐谱共有10个音符,其音高和音长如下: (3) 如何控制扬声器如何控制扬声器发生,则可用Turbo C中的库函数中outportb(int port, char byte),函数的原型在”dos.h”文件中,port为端口地址,byte为传送给端口的字节。扬声器的端也址为0x42,下面的程序中主要是发声的频率。另外,还需要使发声延迟,就要用到”clock_t”,类型变量goal和clock()库函数,变量和程序的原型在”time.h”文件中,使扬声器发声的步骤为:初始化端口0x42;向端口0x42传送声频率fre;延迟:当goalclock()时,做循环。后台音乐设计 后台音乐设计主要是程序的背景声音,看下面的例子:#include#include#include#include#include#define N1 64#define N2 32#define N4 16#define N8 8#define N16 4#define END 0void interrupt(* handler)( );void interrupt music( );int handle,control;enum NOTES C10=131,D10=147,E10=165,F