在 c++ 中播放自定义简谱音乐

· · 个人记录

基于 Windows API MIDImusic.h 使用帮助

调用本头文件,能够在您的 c++ 程序中播放音色良好的自定义音乐。

下载链接

V1.0:music.zip

V1.1:music.zip

V1.2:music.zip

由于本次更新内容较少,不再将乐谱文件一并打包,示例乐谱仍可从上版本链接中下载

仅音乐播放器

V1.1:music_exe.zip

0. 环境要求

0.1 软件/语言支持

0.2 编译器配置

1. 如何自定义音乐

1.1 简谱格式

在任意文本文档中,第一行输入一个整数,表示乐曲节奏进行的快慢(一个四分音符的延时,毫秒),之后若干行输入指定格式的字符串,表示音符集,即可完成创作。——适用于 v1.0 版本

在 v1.1 版本中,加入了左右手谱功能,允许程序同时播放两重旋律。此时,音符集部分将自动以两行为一组,每组为同时演奏的两重旋律。使用空行将强制打断多重旋律判定。

例如:

1 2 3 4 5 5 4 3 2 1
1^- 2^- 3^ 4^- 5^--

1 1 5 5 6 6 5

1^- 2^- 3^ 4^- 5^--

前两行音符将同时播放,此后,后两行音符将依次播放。

音符集格式规范

任意两个音符/和弦间应用空格隔开。事实上,播放音符的判定会在空格处执行。

高/低/升音号必须紧跟在音符后面,但这些符号内部的顺序不限。

延/分音号与音符间的顺序不限,但延/分音号内部将从左到右判读。和弦的延/分音号建议放在和弦外面。

字符 说明 使用示例
1~7 音符 1 2 3 4 5 表示播放 do re mi fa sol 五个音符
0 休止符
, 低音 即音符向下附点,最多可以有三个低音号。如 1, 2,,
^ 高音 类比低音
# 升音 向上半音高。如 4#
- 延音 每个延音号将为音符额外多出一个四分音符的延时
_ 分音 每个分音号将使音符的延时减半
. 附点 每个附点号将使音符的延时增半(×1.5)
[] 和弦 中括号内的音符将一次性演奏
| 小节线 程序将忽略这个符号

在 v1.1/v1.2 版本中,相继添加了 * % & 分别将音符的延时缩减为原先的三分之一,五分之一和七分之一。

1.2 autopiano 格式

将简谱格式的第一行的整数取负数,即自动判别为 autopiano 格式。

该格式复刻了 autopiano 网站的格式要求,并在播放时自动转化为简谱格式。

2. 头文件解析

2.1 MusicPlayer

音乐播放器。将连接相关的 API 进行音乐播放操作。

2.2 MusicList

歌曲。可以将若干行音符整合,也可从文件中读取音符。

2.3 BGM

使用多线程,可使程序在运行同时播放歌曲。

3. 程序使用范例

3.1 播放指定乐曲

#include <bits/stdc++.h>
using namespace std;
#include "music.h"
signed main(){
    MusicPlayer player;
    MusicList m;
    m.readFile("skycity.txt"); //此处输入乐曲存放的文件名
    player.playList(m);
    return 0;
}

3.2 BGM播放

#include <bits/stdc++.h>
using namespace std;
#include "music.h"
#include <conio.h>
signed main(){
    BGM bgm("skycity.txt",0x4f);
    bgm.play();
    //下面这部分可以换成需要的程序内容。音乐播放将不会妨碍程序运行。
    puts("Please Input A & B");
    int a,b;scanf("%d %d",&a,&b);
    printf("A + B = %d\n",a+b);
    puts("Press Any Key to EXIT");
    getch();

    bgm.stop();
    return 0;
}

4. 乐曲范例

包括程序使用范例中的 flower.txt 和若干首乐曲应已和 music.h 共同打包。

V1.1 更新并新增了多条范例:

V1.2 添加了 cpp 打包版的范例:

【云剪贴板】