① c语言怎么写插入音乐的程序
http://..com/question/231143472.html?push=core
http://..com/question/24018920.html
实训项目三 乐谱播放程序设计
2009-03-19 21:25
一、实训目的
1、用C语言开发音乐程序,写自己喜欢或创作的音乐,使在没有乐器的情况下听到自己创作的音乐。
2、巩固文件读取和数组的有关知识。
3、学习使用PC机扬声器的两个控制函数。
二、功能要求
自己创作乐曲,将其转换为计算机程序能够识别的电子文本格式,利用PC机扬声器的功能播放该乐曲。
三、编程参考
1、发声原理
编写音乐程序时,首先需要制作被演奏音乐的乐谱文件。制作乐谱文件可用不同的符号标记,只要所编制的程序易于识别即可。
下面是编制乐谱文件的一种规则:最高音在每个音的前面加“*”:高音,在每个音的前面加“h”;中音,在每个音的前面加“m”;低音,在每个音的前面加“l”。
“*”,“h”,“m”,“l” 与其控制的音符构成音高,决定发声频率。音高的后面是音长,可用整数或小数输入,以控制延时,但中间必须用空格分开。乐谱文件的最前端是一个整数,表示音长基数,一般为300的倍数。乐谱文件的最末端是乐谱文件结束符“##”,以表示乐谱文件结束。
每个音的音长=音长基数*节拍数,其中,音长基数是乐谱文件的第一个字符,如上面乐谱文件为3600,每个音的音频可用一模拟频率值输入。下面是中央C及其前后4个8度中各个音符的频率值
低8度 1 2 3 4 5 6 7
131 147 165 176 196 220 247
中央C 1 2 3 4 5 6 7
262 296 329.7 349.2 392 440 493.9
高8度 1 2 3 4 5 6 7
523.3 587.3 659.3 698.5 784.0 880 987.8
2、PC机扬声器的两个控制函数
sound() 以指定频率打开PC机的扬声器,频率以赫兹为单位。
nosound() 关闭扬声器。
3、乐谱实例
巴赫的《小步舞曲》:
600 h2 4 m5 1 m6 1 m7 1 h1 1 h2 4 m5 4 m5 4 h3 4 h1 1 h2 1 h3 1 h4 1 h5 4 m5 4 m5 4 h1 4 h2 1 h1 1 m7 1 m6 1 m7 4 h1 1 m7 1 m6 1 m5 1 m4 4 m5 1 m6 1 m7 1 m5 1 m6 6 l2 1 m1 1 l7 1 l6 1 h2 4 m5 1 m6 1 m7 1 h1 1 h2 4 m5 4 m5 4 h3 4 h1 1 h2 1 h3 1 h4 1 h5 4 m5 4 m5 4 h1 4 h2 1 h1 1 m7 1 m6 1 m7 4 h1 1 m7 1 m6 1 m5 1 m6 4 m7 1 m6 1 m5 1 m4 1 m5 10 ##
四、拓展训练
1、制作选曲菜单,使其可以播放多首乐曲;
2、修改某些参数,改变乐曲播放速度。
源程序
#include<stdio.h>
#include<stdlib.h>
#include<dos.h>
void main(int argc,char *argv[])
{ FILE *fp;
int rate;
char sound_high[3];
int sound_long;
register int i=0,j;
int sign=0;
float str[200][2];
if(argc!=2) /*命令行参数个数不正确*/
{ printf("Parameters Errors!\n");
exit(1);
} if((fp=fopen(argv[1],"r"))==NULL) /*文件打开失败*/
{ printf("Open file music.doc Errors!\n");
exit(1);
} fscanf(fp,"%d",&rate);/*读取音长基数的值*/
while(!feof(fp)&&!sign) /*文件没有结束并且数据还是乐谱*/
{ fscanf(fp,"%s%d",sound_high,&sound_long); /*得到音频,音长的数值*/
str[i][1]=rate*sound_long; /*音长=音长基数*节拍数*/
switch(sound_high[0])
{ case'*': /*最高音*/
switch(sound_high[1]) /*确定发声频率*/
{ case'1':
str[i++][0]=1046.5;
break;
case'2':
str[i++][0]=1174.7;
break;
case'3':
str[i++][0]=1318.5;
break;
case'4':
str[i++][0]=1396.9;
break;
case'5':
str[i++][0]=1568;
break;
case'6':
str[i++][0]=1760;
break;
case'7':
str[i++][0]=1975.5;
break;
default:
printf("\nErrors in music.doc\n");
exit(1);
}
break;
case'h': /*高音*/
switch(sound_high[1])
{ case'1':
str[i++][0]=523.3;
break;
case'2':
str[i++][0]=587.3;
break;
case'3':
str[i++][0]=659.3;
break;
case'4':
str[i++][0]=698.5;
break;
case'5':
str[i++][0]=784.0;
break;
case'6':
str[i++][0]=880;
break;
case'7':
str[i++][0]=987.8;
break;
default:
printf("\nErrors in music.doc\n");
exit(1);
}
break;
case'm': /*中音*/
switch(sound_high[1])
{ case'1':
str[i++][0]=262;
break;
case'2':
str[i++][0]=296;
break;
case'3':
str[i++][0]=329.6;
break;
case'4':
str[i++][0]=349.2;
break;
case'5':
str[i++][0]=392;
break;
case'6':
str[i++][0]=440;
break;
case'7':
str[i++][0]=493.9;
break;
default:
printf("\nErrors in music.doc\n");
exit(1);
}
break;
case'l': /*低音*/
switch(sound_high[1])
{ case'1':
str[i++][0]=131;
break;
case'2':
str[i++][0]=147;
break;
case'3':
str[i++][0]=165;
break;
case'4':
str[i++][0]=176;
break;
case'5':
str[i++][0]=196;
break;
case'6':
str[i++][0]=220;
break;
case'7':
str[i++][0]=247;
break;
default:
printf("\nErrors in music.doc\n");
exit(1);
}
break;
case'#':
if(sound_high[1]=='#')sign=1;
break;
default:
printf("\nErrors in music.doc\n");
exit(1);
} }
for(j=0;j<=i-1;j++)
{ sound(str[j][0]); /*按频率发出歌曲的音调*/
delay(str[j][1]);
} nosound(); /*关闭扬声器*/
}
② 如何用c语言编写歌曲
很简单的。
计算机发声原理:
声音有三个特性:响度、音调、音色。
响度,这个非常好理解。就是我们感觉到的声音的大小。具体点说就是由“振幅”决定,振幅越大响度越大。一般计量响度的单位是分贝,dB。
音调,这个就是声音的高低,由“频率”决定,频率越高音调越高。频率单位是赫兹,符号Hz。
音色,在生活当中,我们会发现各种物品发出的声音的特点是不一样的,如二胡和笛子。声音的特性就是音色。而决定声音的音色是由于物体本身的材料、结构。
对于我们的计算机而言。发声的设置都是固定了的。要么要计算机上的那个喇叭,那么是外接的音响等。
现在这里对计算机上的那个喇叭用TurboC2.0进行编程,使之发出动听的音乐《梁祝》。
第一步:定义《梁祝》的每一个音符的频率和时间,将定义好的频率和时间写入文件或者保存在数组里面。如果仅仅是写一两个程序自己玩玩的话,那直接保存在数组里面就可以了。如果你想自己写个播放器的话,那你先自己定义一种音乐格式文件(类似.mp3、.wav这种文件,这里暂时把这个文件定为.mymusic),将《梁祝》每个音符的频率、时间写入这个自定义的音乐格式文件liangzhu.mymusic。
第二步:完成了liangzhu.mymusic文件的定义后,我们要做的事情就是读文件,控制喇叭发声。这个具体可以参照现有的资料。这里需要事先写几个函数,读文件的函数,暂停函数,频率对照函数等等。
第三步,将上面的程序链接起来,就OK了。
将上面的步骤优化下,一个DIY的音乐播放器就成功了。
我上面说的只是控制了声音的频率和时间,其实还可以控制响度。对于一些特殊的设备,控制音色也不是不可能。
这种程序我在大一的时候写过。现在想起来不难的。
主要是对C语言是否熟练,当然,你想要实现一个播放器,那你途中会遇到很多困难的。
祝你好运!
③ 如何写一个可以播放音乐的程序(用简单C语言编写,可以给出音频文件,只需要播放即可)
用VC++编译通过,代码如下(其中a.wav为自己给出):
#include<windows.h>
#pragma comment(lib,"winmm.lib")
void main()
{
PlaySound("C:\\a.wav",0,SND_FILENAME|SND_SYNC);
}
④ 求一个c语言代码,能实现播放音乐功能
用C语言播放音乐,一般需要额外的库或者调用系统的API函数。
以Windows为例,可以通过PlaySound函数播放wav格式的音乐。示例如下:
#include<stdio.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
int main()
{
PlaySound(TEXT("1.wav"),0,SND_FILENAME); //1.wav是要播放的音乐文件
return 0;
}
如果想播放mp3音乐可以使用如下代码。
注意:生成程序后,请在cmd中执行此程序,不要在vc/vs的IDE中运行。
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#pragma comment(lib, "Winmm.lib")
int main(int argc, char *argv[])
{
//绝对地址形式
TCHAR fileName[]="ganlusi.mp3";
TCHAR shortName[MAX_PATH];
GetShortPathName(fileName,shortName,sizeof(shortName)/sizeof(TCHAR));
TCHAR cmd[MAX_PATH+10];
wsprintf(cmd,"play %s",shortName);
mciSendString(cmd,NULL, 0, NULL);
Sleep(5 * 60 * 1000); //这里是防止一播放就结束做的延迟
return 0;
}
⑤ 如何用c语言编出能用键盘敲出音乐的的程序
下面用beep函数发音,按键 1,2,3,4,5,6,7,8 对应 多来米发少。。。
按换行键结束。0.3秒一个音,不要按得太快。
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
char p;
int i=0;
printf("input 12345678..\n");
while ( i < 50 ){
p = getch();
if (p == '\r') break;
switch(p-'0'){
case 1: Beep(523,300);break;
case 2: Beep(587,300);break;
case 3: Beep(659,300);break;
case 4: Beep(698,300);break;
case 5: Beep(784,300);break;
case 6: Beep(880,300);break;
case 7: Beep(980,300);break;
case 8: Beep(1060,300);break;
default: break;
}
i++;
}
exit(0);
}
⑥ c语言写音乐,我要一个准确的源代码,谢谢
能不能具体点呢?是像写五线谱那种写mid呢,还是??
#include<dos.h>
void main(void)
{
unsigned FREQUENCY[]={392,392,440,392,523,494,
392,392,440,392,587,523,
392,392,784,659,523,494,
440,698,698,659,523,587,523};
/*此处的FREQUENCY为乐谱每一个音符的频率,替换成你的谱子即可*/
unsigned DELAY[]={375,125,500,500,500,1000,
375,125,500,500,500,1000,
375,125,500,500,500,1000,
375,125,500,500,500,1000};
/*此处DELAY为每个音符播放的时间,专业术语貌似是拍子速度吧!*/
int CIRCLE;/*谱子共有几个音符*/
for(CIRCLE=0;CIRCLE<25;CIRCLE++)
{
sound(FREQUENCY[CIRCLE]);
delay(DELAY[CIRCLE]);
nosound();
}
}
TC 3.0编译通过!
⑦ 求用c语言编写的播放背景音乐的代码
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
unsigned frequency[100];
char hight[100];
unsigned time[100];
unsigned rate;
void main()
{
void set(unsigned f[],char h[],unsigned t[],int r,int num);
void music(unsigned f[],unsigned t[],int num);
int flag=0;
FILE *f1;
int i,n,menu;
char FileName[30];
while(1)
{ f1=NULL;
i=n=0;
printf("本程序采用编码的形式播放音乐。\n");
printf("\n用记事本编辑乐谱,然后通过输入文件名播放音乐\n");
printf("乐谱文件可以自创,也可以抄别人的\n");
printf("\n现在可以先输入数字再按回车播放音乐:\n");
printf("1 播放指定音乐music1\n");
printf("2 播放指定音乐music2\n");
printf("3 通过程序文件名播放音乐\n");
printf("4 退出\n");
while(1)
{
printf("menu=");scanf("%d",&menu);
if(menu==1)
{
strcpy(FileName,"music1.txt");
break;
}
if(menu==2)
{
strcpy(FileName,"music2.txt");
break;
}
if(menu==3)
{
scanf("%s",FileName);
break;
}
if(menu==4)
exit(0);
}
printf("\n该文件的音乐编码如下:\n");
if((f1=fopen(FileName,"r"))==NULL)
{
printf("不能打开文件!\n");
exit(1);
}
fscanf(f1,"%d",&rate);
while(!feof(f1)&&flag!=1)
{
fscanf(f1," %d%c%d",&frequency[i],&hight[i],&time[i]);
printf(" %d%c%d",frequency[i],hight[i],time[i]);
if(time[i]!=-1)
{
i++;n++;
}
else
flag=1;
}
printf("\n");
set(frequency,hight,time,rate,n);
music(frequency,time,n);
fclose(f1);
}
getch();
}
void set(unsigned f[],char h[],unsigned t[],int r,int num)
{
int i,k;
for(i=0;i<num;i++)
{
t[i]=t[i]*r;
switch(h[i])
{
case 'H':k=4;break;
case 'M':k=2;break;
case 'L':k=1;
}
switch(f[i])
{
case 1: f[i]=262*k; break;
case 2: f[i]=296*k; break;
case 3: f[i]=330*k; break;
case 4: f[i]=349*k; break;
case 5: f[i]=392*k; break;
case 6: f[i]=440*k; break;
case 7: f[i]=494*k; break;
}
}
}
void music(unsigned f[],unsigned t[],int num)
{
int i;
for(i=0;i<num;i++)
{
Beep(f[i],t[i]);
}
}
⑧ 如何用c语言编写8051单片机音乐程序
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一个52标准内核的头文件
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
sbit BEEP=P1^7; //喇叭输出脚
sbit P10=P1^0;
sbit K1= P3^2;
sbit K2= P3^5;
sbit K3= P2^4;
sbit K4= P2^5;
uchar th0_f; //在中断中装载的T0的值高8位
uchar tl0_f; //在中断中装载的T0的值低8位
//T0的值,及输出频率对照表
uchar code freq[36*2]={
0xA9,0xEF,//00220HZ ,1 //0
0x93,0xF0,//00233HZ ,1#
0x73,0xF1,//00247HZ ,2
0x49,0xF2,//00262HZ ,2#
0x07,0xF3,//00277HZ ,3
0xC8,0xF3,//00294HZ ,4
0x73,0xF4,//00311HZ ,4#
0x1E,0xF5,//00330HZ ,5
0xB6,0xF5,//00349HZ ,5#
0x4C,0xF6,//00370HZ ,6
0xD7,0xF6,//00392HZ ,6#
0x5A,0xF7,//00415HZ ,7
0xD8,0xF7,//00440HZ 1 //12
0x4D,0xF8,//00466HZ 1# //13
0xBD,0xF8,//00494HZ 2 //14
0x24,0xF9,//00523HZ 2# //15
0x87,0xF9,//00554HZ 3 //16
0xE4,0xF9,//00587HZ 4 //17
0x3D,0xFA,//00622HZ 4# //18
0x90,0xFA,//00659HZ 5 //19
0xDE,0xFA,//00698HZ 5# //20
0x29,0xFB,//00740HZ 6 //21
0x6F,0xFB,//00784HZ 6# //22
0xB1,0xFB,//00831HZ 7 //23
0xEF,0xFB,//00880HZ `1
0x2A,0xFC,//00932HZ `1#
0x62,0xFC,//00988HZ `2
0x95,0xFC,//01046HZ `2#
0xC7,0xFC,//01109HZ `3
0xF6,0xFC,//01175HZ `4
0x22,0xFD,//01244HZ `4#
0x4B,0xFD,//01318HZ `5
0x73,0xFD,//01397HZ `5#
0x98,0xFD,//01480HZ `6
0xBB,0xFD,//01568HZ `6#
0xDC,0xFD,//01661HZ `7 //35
};
//定时中断0,用于产生唱歌频率
timer0() interrupt 1
{
TL0=tl0_f;TH0=th0_f; //调入预定时值
BEEP=~BEEP; //取反音乐输出IO
}
//******************************
//音乐符号串解释函数
//入口:要解释的音乐符号串,输出的音调串,输出的时长串
changedata(uchar *song,uchar *diao,uchar *jie)
{
uchar i,i1,j;
char gaodi; //高低+/-12音阶
uchar banyin;//有没有半个升音阶
uchar yinchang;//音长
uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C调的7个值
*diao=*song;
for(i=0,i1=0;;)
{
gaodi=0; //高低=0
banyin=0;//半音=0
yinchang=4;//音长1拍
if((*(song+i)=='|') || (*(song+i)==' ')) i++;
//拍子间隔和一个空格过滤
switch(*(song+i))
{
case ',': gaodi=-12;i++;//低音
break;
case '`': gaodi=12;i++; //高音
break;
}
if(*(song+i)==0) //遇到0结束
{
*(diao+i1)=0; //加入结束标志0
*(jie+i1)=0;
return;
}
j=*(song+i)-0x30; i++; //取出基准音
j=jie7[j]+gaodi; //加上高低音
yinc: switch(*(song+i))
{
case '#': //有半音j加一个音阶
i++;j++;
goto yinc;
case '-': //有一个音节加长
yinchang+=4;
i++;
goto yinc;
case '_': //有一个音节缩短
yinchang/=2;
i++;
goto yinc;
case '.': //有一个加半拍
yinchang=yinchang+yinchang/2;
i++;
goto yinc;
}
*(diao+i1)=j; //记录音符
*(jie+i1)=yinchang; //记录音长
i1++;
}
}
//******************************************
//奏乐函数
//入口:要演奏的音乐符号串
void play(uchar *songdata)
{
uchar i,c,j=0;
uint n;
uchar xdata diaodata[112]; //音调缓冲
uchar xdata jiedata[112]; //音长缓冲
changedata(songdata,diaodata,jiedata); //解释音乐符号串
TR0=1;
for(i=0;diaodata[i]!=0;i++) //逐个符号演奏
{
tl0_f=freq[diaodata[i]*2]; //取出对应的定时值送给T0
th0_f=freq[diaodata[i]*2+1];
for(c=0;c<jiedata[i];c++) //按照音长延时
{
for(n=0;n<32000;n++);
if((!K1)||(!K2)||(!K3)||(!K4))//发现按键,立即退出播放
{
TR0=0;
return;
}
}
TR0=0;
for(n=0;n<500;n++); //音符间延时
TR0=1;
}
TR0=0;
}
//仙剑
uchar code xianjian[]={
"|3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6---|"
"3_3_3_2_3.6_|5_6_5_5_22_3_|45_4_32_1_|3.--3_|"
"67_6_55_3_|5--3_5_|26_5_32_3_|3---|"
"26_6_6-|16_6_66_7_|`17_6_76_7_|3.--3_|"
"67_6_55_3_|5--3_5_|67_6_76_7_|3---|"
"26_6_6-|16_6_66_7_|`17_6_7.5_|6---|"
};
uchar code song3[]={
"5-5_3_2_1_|3---|6-6_4_2_1_"
",7--,5_|1.3_5.1_|,7.3_5 5_|"
"6.7_`1.6_|6_5_5-3_2_|1.1_13_2_|"
"1.1_12_3_|2.1_,62_3_|2-- ,5_|"
"1.3_5.1_|,7.3_55_|6.7_`1.6_|"
"6_5_5-3_2_|1.1_13_2_|1.1_12_3_"
"2.,6_,71_2_|1--"
};
//世上只有妈妈好
uchar code mamahao[]={
"6.5_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|"
"2.3_55_6_|321-|5.3_2_1_,6_1_|,5--"
};
//三个按键选择三首不同的音乐播放,一个键停止播放
void main(void) // 主程序
{
TMOD = 0x01; //使用定时器0的16位工作模式
TR0 = 0;
ET0 = 1; //定时器0中断
EA = 1; //打开总中断
while(1)
{
if(!K1)
{
while(!K1);
play(xianjian); //播放音乐
}
if(!K2)
{
while(!K2);
play(song3); //播放音乐
}
if(!K3)
{
while(!K3);
play(mamahao); //播放音乐
}
}
}
⑨ C语言,音乐播放器,怎么做 简单的,播放一首歌就行(不用太正式,能播放就行,主要是原理)谢谢
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
int main(void)
{
PlaySound("C:\\sounds\\起风了.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//这个路径是在我C盘下的路径,所以路径你要改成你电脑下的路径,还有只能播放wav格式的,需要播放MP3格式的要下载mply32文件
while (1)
{
printf("program is running... here\n"); //这里跑你的程序,按 Ctrl-C 组合键,结束程序。
Sleep(1000); //休息1秒
}
exit(0);
}
⑩ 用C语言怎么编写音乐程序
0x18, 0x30, 0x1C , 0x10,//格式为: 频率常数, 节拍常数, 频率常数, 节拍常数。
我猜测可能是单片机编程。
以0x开头的为16进制数字,它对应声音的频率或节拍。
那么0x18到底代表高音1还是中音3,这取决于单片机生产厂商,一般它会在说明书上说明。
PS:如果你想搞音乐编程,可以使用高级的音乐库文件。