2022年c语言发声程序 .pdf
《2022年c语言发声程序 .pdf》由会员分享,可在线阅读,更多相关《2022年c语言发声程序 .pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、字号:大中 小c 语言经典教程 : 发声技术问题 : 乐谱的 1 、2、3、 4、5、6、7,加上高低音可以谱出动听的曲子,请编写程序,使计算机能够播放歌曲。 分析 播放歌曲意味着让计算机发声,声音从 PC 机内的扬声器发出,所以这个问题将与硬件扬声器电路有关。 解答 解决这一编程问题,让我们首先简单了解一下计算机发声的原理。在PC 机的系统板上装有定时与计数器 8253 芯片,还有 8255 可编程并行接口芯片,由它们组成的硬件电路可用来产生 PC 机内扬声器的声音,对于 286 、386、486、586 等 PC 微机,由于采用了超大规模集成电路,因而看不到这些芯片,它们均集成在外围电路芯
2、片上了。当我们操作计算机时,常常听到的发声,就是由软件控制这些电路而产生的。声音的长短和音调的高低,均可由程序进行控制。在扬声器电路中,定时器的频率决定了扬声器发音的频率, 所以可通过设定定时器电路的频率来使扬声器发出不同的声音。对定时器电路进行频率设定时, 首先对其命令寄存器( 口地址为 0 x43) 写命令字, 如写入 0 xb6,这可用名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 19 页 - - - - - - - - - outporb(0 x43,0 xb6
3、) ;来实现, 则表示选择该定时器的第二个通道,计数频率先送低 8 位( 二进制 ) ,后送高 8 位。接着用口地址 0 x42 送频率计数值,先送低 8 位,后送高 8 位,即用outportb(0 x42,低 8 位频率计数值) 和 outportb(0 x42,高 8 位频率计数值 ) 来实现。通过这两步使定时器电路产生一系列方波信号,此信号是否能推动扬声器发音,还要看由 8255 产生的门控信号和送数信号是否为 1 ,而它们也可编程,口地址为 0 x61 。为了不影响 8255 口地址 61H 中的其他高位,应先输入口地址 6lH 的现有值 bits,即用 bits= inportb(
4、0 x61)来实现,然后就可用 outportb(0 x61,bits|3)来允许发声,而用 outportb(0 x61,bits&0 xfc)来禁止发声,且不改变 8255 其它位原来的值,关于这方面的详细内容可以参阅 IBM PC/XT 接口技术方面书籍有关内容。5.1 声音函数编写音乐程序播放歌曲,最简单的方法是可以直接使用 TURBO C 在 dos.h 中提供的有关发声的函数 sound()和 nosound()。sound() 函数用于产生声音,其原型如下:void sound(unsigned frequency);该函数的入口参数为扬声器要产生声音的频率。名师资料总结 - -
5、 -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 19 页 - - - - - - - - - 与 sound()函数相反, nosound ()函数用于关闭扬声器,其原型为:void nosound(void);该函数没有入口和出口参数,它只是简单地把口地址 61H 中的低 2 位清 0 。在利用函数 sound 产生指定频率的声音后,一般要过一段时间后再调用函数 nosound 关闭扬声器, 这样我们才能清楚地听到一个声音。如果扬声器刚打开就关闭,我们是很难听到一个声音的。 某个频率的声音
6、延续时间的长短是重要的,它将直接影响音响效果。这需要使用 TURBOC 提供了专门的延时函数 delay ,其原型说明如下:void delay (unsigned milliseconds);该函数中断程序的执行,中断的时间由 milliseconds 指定。例程3-36 :该程序每间隔 10000 milliseconds pc 扬声器发出不同频率的声音,直到频率大于5000hz。#include main() int freq; for(freq=50;freq5000;freq+=50) sound (freq); 名师资料总结 - - -精品资料欢迎下载 - - - - - - -
7、- - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 19 页 - - - - - - - - - delay(10000); nosound(); 如果不能使用上述现成的函数 sound()和 nosound(),当然我们也可以采用上节中的方法,用 I/O 接口的输入输出函数,自己编写产生声音和关闭声音的函数。下面可供参考的函数SOUND() 与 TURBOC 提供的产生声音函数 sound()的算法类似:首先函数 SOUND()中使用了一个由一个整数和两个字符组成的联合,其目的在于方便地把一个 16 位数分解成两个 8 位数。为了打开扬声器,
8、 需要把口地址 61H 的低 2 位置位,但又不能影响其他高位,为此,先输入口地址 61H 中的现有值,与 3 逻辑或后再输出到口地址 61H。void SOUND(unsigned frequency) union unsigned divisor; unsigned char c2; tone;/* 定义由个整数和两个字符组成的联合 */ tone.divisor=119328/frequency; /* 计算该频率对应的定时器计数值 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
9、 - 第 4 页,共 19 页 - - - - - - - - - outportb(0 x43,0 xb6) ; /* 通知定时器采用新的计数 */ outportb(0 x42,tone.c0); /* 计数低字节先送到定时器 */ outportb(0 x42,tone.c1); /* 计数高字节后送到定时器 */ outportb(0 x61, inportb(0 x61) | 3 ); /* 使定时器到喇叭的输出有效 */ 如下供参考的函数 NOSOUND() ,为了不影响口地址 61H 中的其他高位,应先输入口地址 6lH 的现有值在屏蔽掉低 2 位后再输出到口地址 61H。voi
10、d NOSOUND(void) outportb(0 x61,inportb(0 x61) & 0 xfc); /* 使定时器到喇叭的输出无效 */ 5.2 计算机乐谱表 3-18 是频率与音阶的对照表。我们可以通过该表编制出自己的驱动程序。编制乐谱程序一般在原乐谱的基础上添加一些控制字符来完成。如:。_11176 3232 6 2 就是孟庭苇演唱的“羞答答的玫瑰静俏俏地开”的第一句歌词的乐谱。在计算机中可以表述为:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 19 页
11、 - - - - - - - - - 600 H1 0.5 H1 0.5 H1 0.5 M7 0.5 M6 1 H3 1 H2 0.5 H3 0.5 H2 0.5 M6 0.5 H2 2 第一个为音长基准,一般为 300 , 600,900,1200。后面字 H1 表示高音的 1 ,音阶的设置如下:最高音:在音符前加“ E”;高音:在音符前加“计”;中音:在音符前加“ M ”;低音:在音符前加“ L”;再后面的字为节拍数,其中的 0.5 表示节拍数, 每个音的音长音长基数u33410X 拍数,如第一个“ 1”的音长为6000.5 300。表 3-18频率与音阶的对照表低音1 2 3 4 5 名
12、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 19 页 - - - - - - - - - 6 7 频率131 147 165 176 196 220 247 中音1 2 3 4 5 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 19 页 - - - - - - - - - 6 7 频率262 296 330 349 392 440 494 高音1
13、 2 3 4 5 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 19 页 - - - - - - - - - 6 7 频率523 587 659 699 784 880 988 最高音1 2 3 4 5 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 19 页 - - - - - - - - - 6 7 频率1047 1175 1319 1397
14、1568 1760 1976 知道了这些知识,就容易编制个乐谱驱动程序。思路是将各个频率存储在一个二维数组中, 根据音阶字符、 音符和节拍数, 得到发音的音长,使用 sound 函数发音, 使用 delay 函数控制。5.3 问题实现5.3.1 调用 sound() 和 unsound() 下面的程序(例程 3-37 )先开辟两个数组 freq96和 dely96分别用于存储声音的频名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 19 页 - - - - - - - -
15、 - 率和延时。采用图形方式,利用 printtext()函数在屏幕上分别显示字符串 Welcome ! ,Please press any key to start .,Enjoy yourself !”,Press any key to end ! 和 Thank you! Bye Bye . printtext()定义如下:void printtext(unsigned char *temp,int i) setcolor(4); /设置颜色为 red settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); / 设置字符的字体,方向和大小 outtextxy(10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年c语言发声程序 2022 语言 发声 程序
限制150内