展开全部
很简单的。
计算机发声原理:
声音有三个特性:响度、音调、音色。
响度,这个非常好理解。就是我们感觉到的声音的大小。具体点说就是由“振幅”决定,振幅越大响度越大。一般计量响度的单位是分贝,dB。
音调,这个就是声音的高低,由“频率”决定,频率越高音调越高。频率单位是赫兹,符号Hz。
音色,在生活当中,我们会发现各种物品发出的声音的特点是不一样的,如二胡和笛子。声音的特性就是音色。而决定声音的音色是由于物体本身的材料、结构。
对于我们的计算机而言。发声的设置都是固定了的。要么要计算机上的那个喇叭,那么是外接的音响等。
现在这里对计算机上的那个喇叭用Turbo C 2.0进行编程,使之发出动听的音乐《梁祝》。
第一步:定义《梁祝》的每一个音符的频率和时间,将定义好的频率和时间写入文件或者保存在数组里面。如果仅仅是写一两个程序自己玩玩的话,那直接保存在数组里面就可以了。如果你想自己写个播放器的话,那你先自己定义一种音乐格式文件(类似.mp3、.wav这种文件,这里暂时把这个文件定为.mymusic),将《梁祝》每个音符的频率、时间写入这个自定义的音乐格式文件liangzhu.mymusic。
第二步:完成了liangzhu.mymusic文件的定义后,我们要做的事情就是读文件,控制喇叭发声。这个具体可以参照现有的资料。这里需要事先写几个函数,读文件的函数,暂停函数,频率对照函数等等。
第三步,将上面的程序链接起来,就OK了。
将上面的步骤优化下,一个DIY的音乐播放器就成功了。
我上面说的只是控制了声音的频率和时间,其实还可以控制响度。对于一些特殊的设备,控制音色也不是不可能。
这种程序我在大一的时候写过。现在想起来不难的。
主要是对C语言是否熟练,当然,你想要实现一个播放器,那你途中会遇到很多困难的。
祝你好运!
计算机发声原理:
声音有三个特性:响度、音调、音色。
响度,这个非常好理解。就是我们感觉到的声音的大小。具体点说就是由“振幅”决定,振幅越大响度越大。一般计量响度的单位是分贝,dB。
音调,这个就是声音的高低,由“频率”决定,频率越高音调越高。频率单位是赫兹,符号Hz。
音色,在生活当中,我们会发现各种物品发出的声音的特点是不一样的,如二胡和笛子。声音的特性就是音色。而决定声音的音色是由于物体本身的材料、结构。
对于我们的计算机而言。发声的设置都是固定了的。要么要计算机上的那个喇叭,那么是外接的音响等。
现在这里对计算机上的那个喇叭用Turbo C 2.0进行编程,使之发出动听的音乐《梁祝》。
第一步:定义《梁祝》的每一个音符的频率和时间,将定义好的频率和时间写入文件或者保存在数组里面。如果仅仅是写一两个程序自己玩玩的话,那直接保存在数组里面就可以了。如果你想自己写个播放器的话,那你先自己定义一种音乐格式文件(类似.mp3、.wav这种文件,这里暂时把这个文件定为.mymusic),将《梁祝》每个音符的频率、时间写入这个自定义的音乐格式文件liangzhu.mymusic。
第二步:完成了liangzhu.mymusic文件的定义后,我们要做的事情就是读文件,控制喇叭发声。这个具体可以参照现有的资料。这里需要事先写几个函数,读文件的函数,暂停函数,频率对照函数等等。
第三步,将上面的程序链接起来,就OK了。
将上面的步骤优化下,一个DIY的音乐播放器就成功了。
我上面说的只是控制了声音的频率和时间,其实还可以控制响度。对于一些特殊的设备,控制音色也不是不可能。
这种程序我在大一的时候写过。现在想起来不难的。
主要是对C语言是否熟练,当然,你想要实现一个播放器,那你途中会遇到很多困难的。
祝你好运!
展开全部
还是我来说吧,没那么复杂的。
主要原理就是用sound (频率);这个函数发出指定频率的声音,再用delay(时间);这个函数来使声音保持一定时间。
先给你个程序吧,是我自己编的。这个程序的作用就是播放名为music.txt的音乐文件。我再给个简单的music.txt(生日歌),只要把music.txt放在tc\目录下,再运行程序就行了。
程序很简单的,相信楼主一定看的懂。
**********************************************************************
程序:
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#define X 600000
void main()
{ FILE*fp;
char sound_high[3];
float sound_long[100];
register int k,j,i=0;
int sign=0;
float str[100];
if((fp=fopen("music.txt","r"))==NULL)
{ printf ("Open file error\n");
exit(0);
}
while(!feof(fp)&&!sign)
{ fscanf(fp,"%s",sound_high);
fscanf(fp,"%f",&sound_long[i]);
switch(sound_high[0])
{ case'*':
{ switch(sound_high[1])
{ case'1':
str[i++]=1046.5;
break;
case'2':
str[i++]=1174.7;
break;
case'3':
str[i++]=1318.5;
break;
case'4':
str[i++]=1396.9;
break;
case'5':
str[i++]=1568;
break;
case'6':
str[i++]=1760;
break;
case'7':
str[i++]=1975.5;
break;
default:
printf("error in music1\n");
exit(1);
}
break;
}
case'h':
{ switch(sound_high[1])
{ case'1':
str[i++]=523.3;
break;
case'2':
str[i++]=587.3;
break;
case'3':
str[i++]=659.3;
break;
case'4':
str[i++]=698.5;
break;
case'5':
str[i++]=784.0;
break;
case'6':
str[i++]=880;
break;
case'7':
str[i++]=987.8;
break;
default:
printf("error in music2\n");
exit(1);
}
break;
}
case'm':
{ switch(sound_high[1])
{ case'1':
str[i++]=262;
break;
case'2':
str[i++]=296;
break;
case'3':
str[i++]=329.6;
break;
case'4':
str[i++]=349.2;
break;
case'5':
str[i++]=392;
break;
case'6':
str[i++]=440;
break;
case'7':
str[i++]=493.9;
break;
default:
printf("error in music3\n");
exit(1);
}
break;
}
case'l':
{ switch(sound_high[1])
{ case'1':
str[i++]=131;
break;
case'2':
str[i++]=147;
break;
case'3':
str[i++]=165;
break;
case'4':
str[i++]=176;
break;
case'5':
str[i++]=196;
break;
case'6':
str[i++]=220;
break;
case'7':
str[i++]=247;
break;
default:
printf ("error in music4\n");
exit(1);
}
break;
}
case's':
{ str[i++]=0;
break;
}
case'#':
if (sound_high[1]=='#')
sign=1;
break;
default:
printf ("error in music5\n");
exit(1);
}
}
for (j=0;j<=i-1;j++)
{ if (str[j]!=0)
{ sound(str[j]);
for (k=0;k<=sound_long[j];k++)
delay(X);
}
else
{ nosound();
for (k=0;k<=sound_long[j];k++)
delay(X);
}
}
nosound();
}
**********************************************************************
音乐文件music.txt:
m1 3 s 3 m1 5 s 3 m2 15 s 3 m1 15 s 3 m4 15 s 3 m3 15 s 20
m1 3 s 3 m1 5 s 3 m2 15 s 3 m1 15 s 3 m5 15 s 3 m4 15 s 20
m1 3 s 3 m1 5 s 3 h1 15 s 3 m6 15 s 3 m4 15 s 3 m3 15 s 3 m2 10 s 20
m6 3 s 3 m6 5 s 3 m6 15 s 3 m4 15 s 3 m5 15 s 3 m4 15 s 20 ##
主要原理就是用sound (频率);这个函数发出指定频率的声音,再用delay(时间);这个函数来使声音保持一定时间。
先给你个程序吧,是我自己编的。这个程序的作用就是播放名为music.txt的音乐文件。我再给个简单的music.txt(生日歌),只要把music.txt放在tc\目录下,再运行程序就行了。
程序很简单的,相信楼主一定看的懂。
**********************************************************************
程序:
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#define X 600000
void main()
{ FILE*fp;
char sound_high[3];
float sound_long[100];
register int k,j,i=0;
int sign=0;
float str[100];
if((fp=fopen("music.txt","r"))==NULL)
{ printf ("Open file error\n");
exit(0);
}
while(!feof(fp)&&!sign)
{ fscanf(fp,"%s",sound_high);
fscanf(fp,"%f",&sound_long[i]);
switch(sound_high[0])
{ case'*':
{ switch(sound_high[1])
{ case'1':
str[i++]=1046.5;
break;
case'2':
str[i++]=1174.7;
break;
case'3':
str[i++]=1318.5;
break;
case'4':
str[i++]=1396.9;
break;
case'5':
str[i++]=1568;
break;
case'6':
str[i++]=1760;
break;
case'7':
str[i++]=1975.5;
break;
default:
printf("error in music1\n");
exit(1);
}
break;
}
case'h':
{ switch(sound_high[1])
{ case'1':
str[i++]=523.3;
break;
case'2':
str[i++]=587.3;
break;
case'3':
str[i++]=659.3;
break;
case'4':
str[i++]=698.5;
break;
case'5':
str[i++]=784.0;
break;
case'6':
str[i++]=880;
break;
case'7':
str[i++]=987.8;
break;
default:
printf("error in music2\n");
exit(1);
}
break;
}
case'm':
{ switch(sound_high[1])
{ case'1':
str[i++]=262;
break;
case'2':
str[i++]=296;
break;
case'3':
str[i++]=329.6;
break;
case'4':
str[i++]=349.2;
break;
case'5':
str[i++]=392;
break;
case'6':
str[i++]=440;
break;
case'7':
str[i++]=493.9;
break;
default:
printf("error in music3\n");
exit(1);
}
break;
}
case'l':
{ switch(sound_high[1])
{ case'1':
str[i++]=131;
break;
case'2':
str[i++]=147;
break;
case'3':
str[i++]=165;
break;
case'4':
str[i++]=176;
break;
case'5':
str[i++]=196;
break;
case'6':
str[i++]=220;
break;
case'7':
str[i++]=247;
break;
default:
printf ("error in music4\n");
exit(1);
}
break;
}
case's':
{ str[i++]=0;
break;
}
case'#':
if (sound_high[1]=='#')
sign=1;
break;
default:
printf ("error in music5\n");
exit(1);
}
}
for (j=0;j<=i-1;j++)
{ if (str[j]!=0)
{ sound(str[j]);
for (k=0;k<=sound_long[j];k++)
delay(X);
}
else
{ nosound();
for (k=0;k<=sound_long[j];k++)
delay(X);
}
}
nosound();
}
**********************************************************************
音乐文件music.txt:
m1 3 s 3 m1 5 s 3 m2 15 s 3 m1 15 s 3 m4 15 s 3 m3 15 s 20
m1 3 s 3 m1 5 s 3 m2 15 s 3 m1 15 s 3 m5 15 s 3 m4 15 s 20
m1 3 s 3 m1 5 s 3 h1 15 s 3 m6 15 s 3 m4 15 s 3 m3 15 s 3 m2 10 s 20
m6 3 s 3 m6 5 s 3 m6 15 s 3 m4 15 s 3 m5 15 s 3 m4 15 s 20 ##
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我们知道,音乐是音高和音长的有序组合,设计微机音乐最重要的就是如何定义音高和音长,以及如何让扬声器发出指定的音符。下面给出音符与频率的关系表。C语言提供的三个函数sound(
)、nosound(
)和clock(
)可以很方便地解决上述的问题。sound(
)函数可以用指定频率打开PC机扬声器直到用nosound(
)函数来关闭它;
clock(
)函数正好用来控制发声时间,而且它不受PC机主频高低的影响。下面这段程序可使微机发出c调1的声音。
音符与频率关系表
音符
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
#include<stdio.h>
#include<dos.h>
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<time)
{
int86(0X21,&in,&out);
t2=100*out.h.dh+out.h.dl;
if
(t2<t1)t2+=6000;
/*
增加一分钟*/
}
}
)、nosound(
)和clock(
)可以很方便地解决上述的问题。sound(
)函数可以用指定频率打开PC机扬声器直到用nosound(
)函数来关闭它;
clock(
)函数正好用来控制发声时间,而且它不受PC机主频高低的影响。下面这段程序可使微机发出c调1的声音。
音符与频率关系表
音符
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
#include<stdio.h>
#include<dos.h>
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<time)
{
int86(0X21,&in,&out);
t2=100*out.h.dh+out.h.dl;
if
(t2<t1)t2+=6000;
/*
增加一分钟*/
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询