数字音乐

数字音乐

编写音乐程序时,首先需要制作被演奏音乐的乐谱文件,制作乐谱文件可用不同的符号标记,只要所编制的程序易于识别即可。MUSIC乐谱文件,程序如下:

#include<stdlib.h>
#include<stdio.h>
#include<dos.h>
#include<conio.h>
void main(int argc,char *argv[])
{
FILE *fp;
int rate;
char sound_high[3];
float sound_long;
register int i=0, j ;
int sign=0;
float str[100][2];
if(argc!=2) /* 命令行参数个数不正确 */ {
printf("Pararneters 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 %f",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;
brcak:
case '5':
str[i++][0]=1568;
break;
case '6':
str[i++][0]=1760;
break;
case '7':
str[i++][0]=1975.5;
break;
default:
printf ( "/n Errors in music.doc /n" );
exit(1);
break;
}
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("/n Errors in music.doc /n " );
exit (1);
break;
}
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 ( "/n Errors in music.doc /n" );
exit(1);
break;
}
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( "/n Errors in music.doc /n " );
exit(1);
break;
}
break;
case '#':
if(sound_high[1]=='#') sign=1;
break;
default:
printf ( "/n Errors in music.doc /n " );
exit (1);
}
}
for(j=0;j<i;j++)
{
sound(str[j][0]); /* 按频率值发出歌曲的音调 */
delay(str[j][1]);
}
nosound(); /* 关闭扬声器 */
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值