实现功能
- 弹奏音乐
- 播放曲谱
简述
代码主要是用Windows系统自带的轰鸣声 Beep() 函数来实现的,通过宏定义函数名实现获取按键值后的调用来完成播放。播放曲谱也即实现录入简单曲谱 1 - 7 的音阶,存放特定的音阶序列,如: 1 4 5 7 3 ... 完成播放。
测试环境
使用Win10 + Code::Blocks IDE编写,有兴趣的话可以copy下来。
运行截图
代码
#include <conio.h>
#include <iostream>
#include <windows.h>
#include <stdio.h>
#define M1 Beep(523,200);
#define M2 Beep(587,200);
#define M3 Beep(659,200);
#define M4 Beep(698,200);
#define M5 Beep(784,200);
#define M6 Beep(880,200);
#define M7 Beep(980,200);
//低音
#define L1 Beep(262,200);
#define L2 Beep(294,200);
#define L3 Beep(330,200);
#define L4 Beep(349,200);
#define L5 Beep(392,200);
#define L6 Beep(440,200);
#define L7 Beep(493,200);
//高音
#define N1 Beep(532,200);
#define N2 Beep(588,200);
#define N3 Beep(660,200);
#define N4 Beep(698,200);
#define N5 Beep(784,200);
#define N6 Beep(880,200);
#define N7 Beep(988,200);
//半弦音
#define H1 Beep(1046,200);
#define H2 Beep(1175,200);
#define H3 Beep(1319,200);
#define H4 Beep(1397,200);
#define H5 Beep(1568,200);
#define H6 Beep(1760,200);
#define H7 Beep(1976,200);
#define N 1000 //曲谱的音节
using namespace std;
int music[N];
int mcount = 0;
void play(); //演奏
void readMusic(); //读取曲谱
void playMusic(); //播放曲谱
void menu(); //菜单
//菜单
void menu(){
int choice;
do
{
cout<<"------------------------------"<<endl;
cout<<"0、退出"<<endl;
cout<<"1、弹奏(1-7)"<<endl;
cout<<"2、播放曲谱"<<endl;
cout<<"------------------------------"<<endl;
cout<<"请输入选择:"<<endl;
scanf("%d",&choice); //根据choice的值选取功能
switch(choice)
{
case 0:
exit(0);
break;
case 1:
system("cls");
cout<<"按ESC返回上一级"<<endl;
play();
break;
case 2:
system("cls");
playMusic();
break;
default:
cout<<"输入错误!"<<endl;
}
system("pause");
system("cls");
}
while(choice != 0);
}
//读取曲谱
void readMusic(){
int i=0;
FILE * fp;
fp=fopen("music.txt","a+"); //以只读方式打开文件流
if(fp==NULL){
cout<<"文件打开失败!"<<endl;
exit(0);
}
//读取到结构体数组
while(!feof(fp)){
fscanf(fp,"%d",&music[i]);
i++;
}
mcount = i; //获取播放的音节数量
fclose(fp);
}
//播放曲谱
void playMusic(){
int i;
for(i = 0;i < mcount;i++){
Sleep(100);
printf("%d ",music[i]);
switch(music[i])
{
case 1:H1;break;
case 2:H2;break;
case 3:H3;break;
case 4:H4;break;
case 5:H5;break;
case 6:H6;break;
case 7:H7;break;
}
Sleep(100);
}
}
//演奏
void play(){
char ch;
while(1)
{
if(kbhit())
{
ch = getch();
switch(ch)
{
case '1':H1;break;
case '2':H2;break;
case '3':H3;break;
case '4':H4;break;
case '5':H5;break;
case '6':H6;break;
case '7':H7;break;
case '\033':return;
}
}
}
}
int main()
{
readMusic();
menu();
}
总结
代码还是比较简单的,当然由于是简易版,也有一些BUG。比如说音乐播放的间隔控制不佳,没有实现恰当的停顿,因此听起来不宜识别。不过简单的播放还是可以的,欢迎各位小伙伴下载讨论。
附简单曲谱
放到music.txt即可读取播放
两只老虎
1 2 3 1 1 2 3 1 3 4 5 3 4 5 5 6 5 4 3 1 5 6 5 4 3 1 2 51 0 2 5 1 0
小星星
1 2 5 5 6 6 5 4 4 3 3 2 2 1 5 5 4 4 3 3 2 5 5 4 4 3 3 2 1 1 5 5 6 6 5 4 4 3 3 2 2 1
白月光与朱砂痣(这个效果一般,hahahaaaaa)
1 7 1 5 6 6 5 2 2 4 3 1 7 1 3 4 4 5 2 1 1
1 7 1 5 6 6 5 2 2 4 3 2 3 1 7 1 3 4 5 2 1 1
3 3 2 1 1 1 2 2 3 3 4 3 3 0 2 3 2 1 1 1 5 2 2 3 2 1 1
3 2 2 3 2 1 1 5 2 2 2 3 3 4 3 3 5 1 1 2 3 2 1 1 1 5 5 2 2 3 2 1 1
3 2 3 3 2 1 1 1 5 2 2 2 3 3 4 3 3 3 3 3 3 2 1 1 1 5 5 2 2 3 2 1 1 1
3 2 3 3 2 1 1 1 1 5 2 2 2 3 3 4 3 3 5 1 1 2 3 2 1 1 5 2 2 3 2 1 1 1
1 7 1 5 5 6 6 6 5 2 3 4 3 4 3 3 1 7 1 3 4 4 6 1 1 2 1 7
1 7 1 5 5 6 6 6 5 2 3 4 3 4 3 3 1 7 7 1 1 2 3 2 6 1 2 1 1