| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3041 人关注过本帖
标题:一个音乐小程序
只看楼主 加入收藏
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

确切的说应该从主板上的扬声器中发出的


永不放弃!
2004-07-23 12:41
chengstone
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
收藏
得分:0 
我唯一不理解的是outportb函数可以使扬声器发出声音?

qq:69558139
2004-07-23 12:43
三少爷
Rank: 1
等 级:新手上路
帖 子:192
专家分:0
注 册:2004-4-29
收藏
得分:0 

tc编译出来好像有点问题不知何故

?Compiling WINDOWS\DESKTOP\222.C:  ?Error WINDOWS\DESKTOP\222.C 23: Declaration terminated incorrectly 焙 ?Error WINDOWS\DESKTOP\222.C 52: Cannot convert 'void (interrupt *)(...)' to '焙 ?Error WINDOWS\DESKTOP\222.C 53: Cannot convert 'int *' to 'void (interrupt *)焙 ?match in parameter '__isr' in call to 'setvect(int,void (interrupt *)(...))' 焙 ?Error WINDOWS\DESKTOP\222.C 57: Cannot convert 'void (interrupt *)()' to 'voi焙 ?Error WINDOWS\DESKTOP\222.C 57: Type mismatch in parameter '__isr' in call to焙 ?Warning WINDOWS\DESKTOP\222.C 60: Function should return a value 焙 ? 焙


2004-07-23 22:51
三少爷
Rank: 1
等 级:新手上路
帖 子:192
专家分:0
注 册:2004-4-29
收藏
得分:0 

//看看这个如何

#include<stdlib.h> #include<stdio.h> #include<dos.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("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%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; 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();/*关闭扬声器*/

}

//600 m5 1 m3 0.5 m5 0.5 h1 2 m6 1 h1 0.5 m6 0.5 m5 2 m5 1 m1 0.5 m2 0.5 m3 1 m2 0.5 m1 0.5 m2 3 # # 将音乐代码比如上面一段加入文本文件,拖入生成的.exe文件即可放音


2004-07-23 23:21
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 

那些中断是怎么设置的呢?


淘宝杜琨
2004-07-29 21:27
erios
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-8-12
收藏
得分:0 
有谁能告诉我原理是什么?

改变不能接受的;
接受不能改变的。
2004-08-13 09:23
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

/*格式整理后,便于大家学习研究*/

#include<stdio.h> #include<dos.h> int n=0; int fg=0; int b; void soundkid(int x,int y) { int a; outportb(0x43,0xb6); outportb(0x42,x); outportb(0x42,y); a=inportb(0x61); a=a|3; outportb(0x61,a); }; void nosoundkid() { int a; a=inportb(0x61); a=a&0xfd; outportb(0x61,a); }; void interrupt(*old)(void); void interrupt new() { switch(b) { case 1: soundkid(200,17); break; case 2: soundkid(216,15); break; case 3: soundkid(30,14); break; case 4: soundkid(109,13); break; case 5: soundkid(226,11); break; case 6: soundkid(150,10); break; case 7: soundkid(110,9); break; case 0: nosoundkid(); break; case'e':nosoundkid(); break; default:; } if(b!=0&b!='e') { n++; if(n>10){ n=0; fg=1; } } else{ n++; if(n>0){ n=0; fg=1; } } }; int main(void) { int code[42]={3,0,3,4,5,0,5, 4,3,2,1,0,1,2, 3,0,3,2,0,2,3, 0,3,4,5,0,5,4, 3,2,1,0,1,2,3, 2,1,0,1,0,1,'e' }; int i; for(i=0;i<42;i++) { b=code[i]; old=getvect(0x1C); setvect(0x1c,new); for(;;){ if(fg==1){ fg=0; setvect(0x1c,old); break; } } } getch(); return 0; }

2004-08-26 13:53
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

/*同样,改变一下风格,供大家研究分析*/

#include<stdlib.h> #include<stdio.h> #include<dos.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("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%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; 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(); /*关闭扬声器*/

}

2004-08-26 14:06
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

分析:主要操作是写端口、文件操作和中断程序设计。

这些操作都有相应的库函数(比如getvect和setvect),

在此不予说明,只要查库函数就可以呢!

当然了解高、中、低音的频率分布是很重要的!

2004-08-26 14:12
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
好像停止不了啊

2004-09-03 17:53
快速回复:一个音乐小程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020456 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved