在 c++ 中播放自定义简谱音乐
基于 Windows API MIDI 的 music.h 使用帮助
调用本头文件,能够在您的 c++ 程序中播放音色良好的自定义音乐。
下载链接
V1.0:music.zip
V1.1:music.zip
- 添加了左右手谱功能
- 音符延迟使用更精确的
clock()而非sleep() - 修复了若干已知 bug
V1.2:music.zip
-
添加了
generator.cpp以便将乐谱和头文件整合到同一个cpp中方便传播 -
修复了若干已知 bug
由于本次更新内容较少,不再将乐谱文件一并打包,示例乐谱仍可从上版本链接中下载
仅音乐播放器
V1.1:music_exe.zip
0. 环境要求
0.1 软件/语言支持
- x64 Windows 系统
- C++
0.2 编译器配置
- 开启 C++11
-std=c++11 - 连接器命令行
-lwinmm
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. 头文件解析
string key2num(string s)将autopiano格式转化为简谱格式。
2.1 MusicPlayer 类
音乐播放器。将连接相关的 API 进行音乐播放操作。
void setVolume(int _vol)设置音量(0x00至0x7f)void setDelay(int _dctn)设置四分音符延时(毫秒)void play(string s)播放简谱格式的一行音符void playList(MusicList &m)播放歌曲
2.2 MusicList 类
歌曲。可以将若干行音符整合,也可从文件中读取音符。
void setDelay(int _dctn)设置四分音符延时(毫秒)——优先于播放器设置的延时void add(string s)void addk(string s)插入一行简谱格式或autopiano格式的音符void clear()清空歌曲void readFile(string s)从文件中读取音符集
2.3 BGM 类
使用多线程,可使程序在运行同时播放歌曲。
void setMusic(string s)从文件中读取音符集并绑定void play()开始循环播放此音乐void stop()停止播放此音乐
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 共同打包。
- 《Little Princess》
princess.txt - 《On Your Way》
onyourway.txt - 《Town of Flowers Helena》 简谱版
flower.txtAutoPiano 版flower_k.txt
V1.1 更新并新增了多条范例:
- 《Little Princess》 双手谱版
princess_d.txt - 《Sky City》 双手谱版
skycity.txt - 其余 v1.0 的范例得到了 v1.1 兼容性更新
V1.2 添加了 cpp 打包版的范例:
- v1.0/v1.1 的所有范例打包版
- 《Literature》
- 《On My Railgun》
- 《Senbonzakura》
- 下三首曲不在此版本提供
txt版乐谱,若有需要请联系本人
【云剪贴板】