C++实现简单钢琴(文件读取 - 播放曲谱)

实现功能

  • 弹奏音乐
  • 播放曲谱

简述

        代码主要是用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

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值