ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:53.48KB ,
资源ID:9678859      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9678859.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第三讲让你的程序声图并茂.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第三讲让你的程序声图并茂.docx

1、第三讲 让你的程序声图并茂C语言高级程序设计讲座第三讲 让你的程序声图并茂鹏程C语言教学网站庆祝建站一周年特别企划技术支持: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,G

8、10,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

9、,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() 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

10、,(char)fre); 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=26

12、2,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,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”文件中,使扬声器发声的步骤为: 初始化端口0

14、x42; 向端口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,F1

15、0=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=1796song= E1,N4,E1,N8,E1,N8,F1,N4,G1,N4,F1,N4,F1,N4,E1,N4,D1, N4,C1,N4,C1,N4,D1,N4,E1,N4,E1,N4,D1,N4

16、,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,N4,G1,N4,F1,N4,E1,N4,D1,N4,C1, N4,C1,N4,D1,N4,E1,N4,E1,N4

17、,D1,N4,C1,N4,D1,N4, END,END ;main() 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,150,500,200,10,5);setactivepage(1);sector(200,

18、150,50,170,70,50);bar3d(400,200,500,250,10,5);for(i=0;i(int)dur*2/5*/fre) flag=0; outportb(0x43,0xb6); fre=(unsigned)(1193180L/fre); outportb(0x42,(char)fre); outportb(0x42,(char)(fre8); control=inportb(0x61); outportb(0x61,(control)|0x3); note=note+2; if(note=134)note=0; handler(); 乐谱文件的制作 我们在这里使用的

19、乐谱文件格式如下:最高音的前面加”*”;高音,在每个音的前面加”h”;中音,在每个音的前面加”m”;低音,在每个音的前面加”L”。“*”、“h”、“m”、“L”与其控制的音符构成音高,决定发声频率。音高的后面是音长,可用整数或小数输入,以控制延时,但中间必须用空格分开。乐谱文件的最前端是一个整数,表示音长基数,一般为300、600、900、1200。乐谱文件的最末端是乐谱文件结束符”#”,以表示乐谱文件结束。下面是电影城南旧事插曲送别的一段。 乐谱文件为:600 m5 1 m3 0.5 m5 0.5 hl 2 m6 1 hl 0.5 m60.5 m5 2 m5 I ml 0.5 m2 0.5

20、m3 1 m2 0.5 ml 0.5 m2 3 #每个音的音长=音长基数*节拍数,其中,音长基数是乐谱文件的第一个字符,如上面乐谱文件为600,每个音的音频可用一摸拟频率值输入。下面是程序源代码、编译、连接成可执行文件musicexe,用法为:music乐谱文件。#include#include#include#includevoid 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!

21、=2) /* 命令行参数个数不正确 */ printf(Pararneters Errors! n) ;exit(1);if(fp=fopen(argv1,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); /* 得到音频、音长的数值 */ stri1=rate*s

22、ound_long; /* 音乐= 音长基数*节拍数*/ switch(sound_high0) case *: /* 最高音 */switch (sound_high1) /* 确定发音的频率 */ case 1: stri+0=1046.5; break; case 2: stri+0=1174.7; break; case 3: stri+0=1318.5; break; case 4: stri+0=1396.9; brcak: case 5: stri+0=1568; break; case 6: stri+0=1760; break; case 7: stri+0=1975.5;

23、break; default: printf ( n Errors in music.doc n ); exit(1); break;break;case h: /* 高音*/switch(sound_high1) case 1:stri+0=523.3;break;case 2:stri+0=587.3;break;case 3:stri+0=659.3;break;case 4: stri+0=698.5; break;case 5: stri+0=784.0; break;case 6:stri+0=880; break;case 7:stri+0=987.8; break;defaul

24、t: printf(n Errors in music.doc n ); exit (1); break;break;case m: /* 中音 */ switch(sound_high1) case 1: stri+0=262; break;case 2: stri+0=296;break;case 3: stri+0=329.6;break;case 4: stri+0=349.2;break;case 5: stri+0=392; break;case 6:stri+0=440; break;case 7:stri+0=493.9;break;default:printf ( n Err

25、ors in music.doc n );exit(1);break; break;case l: /* 低音 */ switch(sound_high1) case 1: stri+0=131; break; case 2: stri+0=147; break; case 3: stri+0=165; break; case 4: stri+0=176; break; case 5: stri+0=196; break; case 6: stri+0=220; break; case 7: stri+0=247; break; default:printf( n Errors in musi

26、c.doc n );exit(1);break;break;case #: if(sound_high1=#) sign=1; break; default:printf ( n Errors in music.doc n );exit (1);for(j=0;ji;j+)sound(strj0); /* 按频率值发出歌曲的音调 */delay(strj1);nosound(); /* 关闭扬声器 */声图并茂 我们来看下面这个程序的源代码,实现的是一个表盘的走动,并且发出响声,整点还有报时功能。#include#include#include#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