C语言程序设计(第9章实用编程技巧)3

文章作者 100test 发表时间 2007:03:10 17:23:14
来源 100Test.Com百考试题网


9.3 音响技巧
9.3.1 音乐程序设计
我们知道,音乐是音高和音长的有序组合,设计微机音乐最重要的就是如何定义音高和音长,以及如何让扬声器发出指定的音符。下面给出音符与频率的关系表。C语言提供的三个函数sound( )、nosound( )和clock( )可以很方便地解决上述的问题。sound( )函数可以用指定频率打开PC机扬声器直到用nosound( )函数来关闭它; clock( )函数正好用来控制发声时间,而且它不受PC机主频高低的影响。下面这段程序可使微机发出c调1的声音。

表9-2 音符与频率关系表
音符 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

[例9-12] 音乐程序music1.c
#include
#include
void pause(int).
void sound1(int,int).
void main(void)
{
int i,freq,speed=5.
int time=4*speed.
char *qm="iddgwwwqqgfff dddfghhhggg ddgwwwqqgfff\
ddffhjqqqqq wpggjhgddgqq hhqwwqjjjggg\
ddgwwwqqqgfff ddffhjqqqqqq"./*定义歌曲*/
while (*qm !=\0){
i=1.
switch(*qm){
case k:
time=1*speed. i=0.
break.
case i:
time=6*speed. i=0.
break.
case o:
time=10*speed. i=0.
break.
case p:
pause(time). i=0.
break.
case a:
freq=523.
break.
case s:
freq=587.
break.
case d:
freq=659.
break.
case f:
freq=698.
break.
case g:
freq=784.
break.
case h:
freq=880.
break.
case j:
freq=988.
break.
case z:
freq=262.
break.
case X:
freq=294.
break.
case c:
freq=330.
break.
case v:
freq=349.
break.
case b:
freq=392.
break.
case n:
freq=440.
break.
case m:
freq=494.
break.
case q:
freq=1047.
break.
case w:
freq=1175.
break.
case e:
freq=1319.
break.
case r:
freq=1397.
break.
case t:
freq=2568.
break.
case y:
freq=1760.
break.
case u:
freq=1976.
break.
default:
i=0.
break.
}
if(i)
sound1(freq,time).
}
}
void sound1(int freq,int time) /*freq为频率,time为持续时间*/
{
union{
long divisor.
unsigned char c[2].
}count.
unsigned char ch;
count.divisor=1193280/freq. /* 1193280 是系统时钟速率*/
outp(67,182).
outp(66,count.c[0]).
outp(66,count.c[1]).
ch=inp(97).
outp(97,ch|3).
pause(time).
outp(97,ch).
}
void pause(int time)
{
int t1,t2.
union REGS in,out.
in.h.ah=0X2c.
int86(0X21,&.in,&.out). /* 取当前时间*/
t1=t2=100*out.h.dh out.h.dl. /*out.h.dh 为秒值,out.h.dl 为1/100 秒值*/
while(t2-t1 {
int86(0X21,&.in,&.out).
t2=100*out.h.dh out.h.dl.
if (t2 }
}

9.3.2 自动识谱音乐程序
音乐的简谱是由各种音符构成的,将这些音符按不同的频率、持续时间连续发出声音,就形成了旋律。因此音乐演奏的关键是曲调的定义与识别及发音时间的控制。
为了实现计算机自动识谱,可定义一套曲调的编码,其中“ 1 2 3 4 5 6 7”表示中音的1、2、3、5、6、7;高音可在中音之后加“ *”;低音在中音之后加“;”号;减号“ -”表示两拍;“.”表示一拍半;“=”表示四分之一拍;下画线“ _”表示1 / 2拍。
我们可用文本编辑软件(如E D I T)按上述编码将一首曲子的乐谱输到计算机中,得到乐谱文件供程序调用。其中乐谱文件的第一节的数字分别为:节拍基数和速度,输入时用空格分开。乐谱文件的第二行到最后一行为歌曲的内容,每小节之间用“ /”分开。
下面根据“世上只有妈妈好”编制曲谱文件如下Ma.txt:



相关文章


山西:2005年下NCRE,PETS考试开始报名
辽宁:全国计算机等级考试开始报考
C语言程序设计(第9章实用编程技巧)3
第三章输入输出函数及控制流程语句
重庆:2005年全国计算机等级考试开始报名
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛