开篇先礼貌地附上效果视频链接:
C语言钢琴演奏《起风了》,经典回归!!!_哔哩哔哩_bilibili
一、开发工具
我们使用的是visual studio2022这款IDE。visual studio2022是由微软开发的一款集成开发环境(IDE),用于开发各种类型的软件应用程序。它提供了丰富的工具和功能,包括代码编辑器、调试器、编译器、版本控制等,能够帮助开发人员更高效地编写、调试和部署应用程序。VS支持多种编程语言,包括C++、C#、VB.NET、JavaScript等,适用于Windows平台上的应用程序开发。这里默认大家成功安装, 不再一一赘述。
二、项目创建
这里我们选择c++的空项目,并将项目扩展名.cpp重置为.c
三、引入头文件
这里我们使用的头文件有<stdio.h>、<conio.h> 、<mmsystem.h>、<windows.h>
还要引入动态链接库"winmm.lib"
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <conio.h>
#pragma comment(lib,"winmm.lib")
四、创建函数
我们创建的是最基本的main函数与qfl(起风了)函数,并将其嵌套
int qfl(){
}
int main(){
qfl();
}
五、Before begin
在开始之前,我们要先简单介绍一下midi音乐调用的一些函数
包括:
- HMIDIOUT函数
- midiOutOpen函数
- midiOutShortMsg函数
- midiOutClose函数
1、HMIDIOUT函数
HMIDIOUT
是Windows多媒体编程中用于表示 MIDI 输出设备句柄的一个类型。在Windows的MIDI(Musical Instrument Digital Interface,乐器数字接口)编程接口中,当你成功打开一个MIDI输出设备时,系统会返回一个 HMIDIOUT
类型的句柄,你可以通过这个句柄向MIDI设备发送各种MIDI消息,如音符、控制信息等。
简单来说,就是将你电脑上的midi音乐播放设备起一个名字,方便以后调用
例如:
HMIDIOUT handle;
这里就定义了一个名为handle的句柄用于以后的midi函数传参
2、midiOutOpen函数
midiOutOpen
是Windows多媒体API中用于打开MIDI输出设备的一个函数。在Windows编程中,如果你需要与MIDI输出设备(如声卡上的MIDI端口或外部MIDI合成器)交互并发送MIDI消息,通常会使用这个函数来获取到该设备的句柄。
参数如下
MMRESULT midiOutOpen(
LPHMIDIOUT lphMidiOut,
UINT uDeviceID,
DWORD_PTR dwCallback,
DWORD_PTR dwInstance,
DWORD fdwOpen
);
参数说明:
LPHMIDIOUT lphMidiOut
:指向一个 HMIDIOUT
类型的变量的指针,函数成功执行后,将在此处存储打开的MIDI输出设备的句柄。这里要输入的值也就是上面HMIDIOUT函数定义的句柄,通俗的说,就是你给midi设备起的名字。
UINT uDeviceID
:指定要打开的MIDI输出设备的标识符。开发者可以通过调用 midiOutGetNumDevs
函数获取系统中 MIDI 输出设备的总数,然后使用 midiOutGetDevCaps
函数获取每个设备的具体信息,包括设备的 uDeviceID
。在实际应用中,开发者根据需求选择合适的 uDeviceID
来打开或操作对应的 MIDI 输出设备。
DWORD_PTR dwCallback
:如果希望使用回调函数来处理MIDI输出消息,可以提供一个回调函数的地址。若不需要回调,则设置为NULL。
DWORD_PTR dwInstance
:应用程序定义的数据,当调用回调函数时作为参数传递。如果不需要回调函数,则此参数无效。
DWORD fdwOpen
:在 midiOutOpen
函数中,fdwOpen
参数用于指定打开 MIDI 输出设备时的一些附加选项或行为特征。它可以是一个或多个预定义的标志组合(通过按位或运算符 | 组合)。例如:
CALLBACK_NULL
:表示不使用回调函数。CALLBACK_WINDOW
或CALLBACK_TASK
:表明使用窗口消息或线程回调函数来通知 MIDI 消息的发送完成情况。CALLBACK_FUNCTION
:使用函数指针作为回调函数。MIDI_IO_STATUS
:在回调函数中包含 MIDI 输入/输出的状态信息。
函数成功执行后返回值是 MMSYSERR_NOERROR
,表示成功打开了指定的MIDI输出设备;否则返回相应的错误代码。
在这里,我们并不需要使用回调函数,所以,我们只需要写成如下格式即可:
midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
3、midiOutShortMsg函数
midiOutShortMsg
是 Windows 多媒体(Multimedia)API 提供的一个函数,用于直接发送短 MIDI 消息到已打开的 MIDI 输出设备。这个函数适用于发送单个 MIDI 消息,消息长度不超过三个字节(因为标准 MIDI 消息最多包含三部分:status byte、data1 和 data2)。
函数原型如下:
MMRESULT midiOutShortMsg(
HMIDIOUT hmo,
DWORD dwMsg
);
参数说明:
-
HMIDIOUT hmo
:这是通过midiOutOpen
函数打开 MIDI 输出设备时返回的设备句柄。 -
DWORD dwMsg
:这是一个包含整个 MIDI 消息的 DWORD 值。其中,低字节包含 MIDI 消息的状态字节,接下来的两个字节分别包含 MIDI 数据1和数据2。如果 MIDI 消息只需要一个或两个数据字节,那么高位字节应当填充为0。
第一个参数就是我们midi音乐设备的名字
第二个参数则要参照midi通信协议了
这里用通俗的语言讲一下:
(1)音符弹奏
假如我们想让midi设备在第一声道(0—f)上以100(0—127)的声音大小弹奏中央C(音码为60)则代码如下:
midiOutShortMsg(handle, 0x00643C90);
其中0x00并无意义,但要加上0x前缀在0x之后有多少0也对消息没有影响,
64为100的16进制数,代表音量大小;
3c为60的16进制数,代表音调;
90为第一声道,具体声道值为90—9f,其中99声道为类似鼓声的音色,而a—f声道发音较为短促,我们这里依照情况使用9声道及其后的声道。
也就是说,我们需要按顺序填写4个部分,即:0x00前缀、音量、音调、声道。
这样就能按照我们所想弹奏出需要的音符了
(2)音色切换
我们还可以使用此函数切换音色,
代码如下:
midiOutShortMsg(handle, 0xC000); //设置通道0的乐器为 大钢琴
在这里除了0x前缀外有两个参数
c0表示改变声道0的音色,我们也可以举一反三,设置为c1、c2等,c后面跟随的数字表示为声道数
00则是乐器的代表数字,00代表大钢琴
也就是说,这个命令将声道0的乐器设置为大钢琴
我将具体状态参数与音色表、音码表放在附录里供大家参考,如有其他需要请自行查阅。
4、midiOutClose函数
midiOutClose
是Windows多媒体(Multimedia)API中用于关闭已打开的MIDI输出设备的函数。当你不再需要向某个MIDI输出设备发送消息,或者应用程序即将退出时,应调用此函数来释放系统资源。
函数原型如下:
MMRESULT midiOutClose(HMIDIOUT hmo);
参数说明:
HMIDIOUT hmo
:这是通过midiOutOpen
函数成功打开 MIDI 输出设备时返回的设备句柄。
也就是说演奏完成后需要将我们的midi设备关闭,与midiOutOpen函数不同的是:我们只需要输入要关闭的设备名称即可
代码如下:
midiOutClose(handle);
六、正式开始
如果你能将上述代码理解的话,小张同学相信你已经能将midi音乐编程写出自己的风格了。那么下面就与我一起欣赏这代码与音乐结合的盛宴吧!
1、枚举音调与其在演奏时用到的音
enum Scale //音阶参数
{
Rest = 0, C8 = 108, B7 = 107, A7s = 106, A7 = 105, G7s = 104, G7 = 103, F7s = 102, F7 = 101, E7 = 100,
D7s = 99, D7 = 98, C7s = 97, C7 = 96, B6 = 95, A6s = 94, A6 = 93, G6s = 92, G6 = 91, F6s = 90, F6 = 89,
E6 = 88, D6s = 87, D6 = 86, C6s = 85, C6 = 84, B5 = 83, A5s = 82, A5 = 81, G5s = 80, G5 = 79, F5s = 78,
F5 = 77, E5 = 76, D5s = 75, D5 = 74, C5s = 73, C5 = 72, B4 = 71, A4s = 70, A4 = 69, G4s = 68, G4 = 67,
F4s = 66, F4 = 65, E4 = 64, D4s = 63, D4 = 62, C4s = 61, C4 = 60, B3 = 59, A3s = 58, A3 = 57, G3s = 56,
G3 = 55, F3s = 54, F3 = 53, E3 = 52, D3s = 51, D3 = 50, C3s = 49, C3 = 48, B2 = 47, A2s = 46, A2 = 45,
G2s = 44, G2 = 43, F2s = 42, F2 = 41, E2 = 40, D2s = 39, D2 = 38, C2s = 37, C2 = 36, B1 = 35, A1s = 34,
A1 = 33, G1s = 32, G1 = 31, F1s = 30, F1 = 29, E1 = 28, D1s = 27, D1 = 26, C1s = 25, C1 = 24, B0 = 23,
A0s = 22, A0 = 21
};
enum Voice //F大调
{
H1 = F2, H2 = G2, H3 = A2, H4 = B2, H5 = C3, H6 = D3, H7 = E3,
J1 = F3, J2 = G3, J3 = A3, J4 = B3, J5 = C4, J6 = D4, J7 = E4,
K1 = F4, K2 = G4, K3 = A4, K4 = B4, K5 = C5, K6 = D5, K7 = E5,
L1 = F5, L2 = G5, L3 = A5, L4 = B5, L5 = C6, L6 = D6, L7 = E6,
LOW_SPEED = 500, MIDDLE_SPEED = 400, HIGH_SPEED = 300,
_ = 0//XFF
};
注意,因为《起风了》是F大调,所以小张在枚举Voice时 第一个音为F2而不是C2,大家可以按照自己的需要来输入Voice参数
2、创建歌词、曲谱数组
char geci[58][40] =
{"这一路上走走停停\n",
"顺着少年漂流的痕迹\n",
"迈出车站的前一刻\n",
"竟有些犹豫\n",
"不禁笑这近乡情怯\n",
"仍无可避免\n",
"而长野的天\n",
"依旧那么暖\n",
"风吹起了从前\n\n",
"从前初识这世间 万般流连\n",
"看着天边似在眼前\n",
"也甘愿赴汤蹈火去走它一遍\n",
"如今走过这世间 万般流连\n",
"翻过岁月不同侧脸\n",
"措不及防闯入你的笑颜\n\n",
"我曾难自拔于世界之大\n",
"也沉溺于其中梦话\n",
"不得真假 不做挣扎 不惧笑话\n",
"我曾将青春翻涌成她\n",
"也曾指尖弹出盛夏\n",
"心之所动 且就随缘去吧\n",
"逆着光行走 任风吹雨打\n",
"\n",
"短短的路走走停停\n",
"也有了几分的距离\n",
"不知抚摸的是故事\n",
"还是段心情\n",
"也许期待的不过是\n",
"与时间为敌\n",
"再次看到你\n",
"微凉晨光里\n",
"笑得很甜蜜\n\n",
"从前初识这世间 万般流连\n",
"看着天边似在眼前\n",
"也甘愿赴汤蹈火去走它一遍\n",
"如今走过这世间 万般流连\n",
"翻过岁月不同侧脸\n",
"措不及防闯入你的笑颜\n\n",
"我曾难自拔于世界之大\n",
"也沉溺于其中梦话\n",
"不得真假 不做挣扎 不惧笑话\n",
"我曾将青春翻涌成她\n",
"也曾指尖弹出盛夏\n",
"心之所动 且就随缘去吧\n",
"\n",
"晚风吹起你鬓间的白发\n",
"抚平回忆留下的疤\n",
"你的眼中 明暗交杂 一笑生花\n",
"暮色遮住你蹒跚的步伐\n",
"走进床头藏起的画\n",
"画中的你 低着头说话\n\n",
"我仍感叹于世界之大\n",
"也沉醉于儿时情话\n",
"不剩真假 不做挣扎 无谓笑话\n" ,
"我终将青春还给了她\n",
"连同指尖弹出的盛夏\n",
"心之所动 就随风去了\n",
"以爱之名 你还愿意吗\n" };
int qifengle[] = {
H7,J1,J2,J3, _,H5,J5,J3,J3, _, _, _,H7, _, _, _,
H7,J1,J2,J3, _,H5,J5,J3,J2,J3,J1,J2,H7,J1,H5, _,
H7,J1,J2,J3, _,H5,J5,J3,J3, _, _, _,H7, _, _, _,
H7,J1,J2,J3, _,H5,J5,J3,J2,J3,J1,J2,H7,J1,H5, _,
J7,K1,K2,K3, _,J5,K5,K3,K3, _, _, _,
J7,K1,K2,K3, _,J5,K5,K3,K2,K3,K1,K2,J7,K1,J5, _,
J7,K1,K2,K3, _,J5,K5,K3,K3, _, _, _, _,
K6,K3,K2,J6,J3,H6,J2,J3,H6, _, _, _,9,//前奏
J2, _, _,J1,J2, _,J1,J2, _,J3, _,J5, _,J3, _,9,//这一路上走走停停
J2, _, _,J1,J2, _,J1,J2,J3,J2,J1,H6, _, _, _,9,//顺着少年漂流的痕迹
J2, _, _,J1,J2, _,J1,J2, _,J3, _,J5, _,J3, _,9,//迈出车站的前一刻
J2, _, _,J3,J2, _,J1,J2,J2, _, _, _,9,//竟有些犹豫
J2, _, _,J1,J2, _,J1,J2, _,J3, _,J5, _,J3, _,9,//不禁笑这近乡情怯
J2, _, _,J3,J2, _,J1, _,H6, _, _, _,9,//仍无可避免
J3,J2,J1,J2,J1, _, _, _,9,//而长野的天
J3,J2,J1,J2,J1, _, _, _,9,//依旧那么暖
H5,J3,J2,J1,J2, _,J1, _, _, _, _, _,9,//风吹起了从前
J1, _,J2, _,J3, _,J1, _,J6, _,J5,J6, _, _,J2,J7, _,J6,J7, _, _,9,//从前初识这世间 万般流连
J7, _,J6,J7, _,J3, _,K1,K2,K1,J7,J6, _, _,9,//看着天边似在眼前
J5, _,J6, _,J5,J6,J5,J6,J5,J6, _,J5,J2, _,J5, _,J3, _, _, _,9,//也甘愿赴汤蹈火去走它一遍
J1, _,J2, _,J3, _,J1, _,J6, _,J5,J6, _, _,J2,J7, _,J6,J7, _, _,9,//如今走过这世间 万般流连
J7, _,J6,J7, _,J3, _,K1,K2,K1,J7,J6, _, _,9,//翻过岁月不同侧脸
J5, _,J6, _,K3,K3, _,J5, _,J6, _,K3,K3, _,J5,J6, _,J6, _, _, _,9,//措不及防闯入你的笑颜
K1, _,K2, _,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K2, _, _,9,//我曾难自拔于世界之大
K2,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K3, _, _,9,//也沉溺于其中梦话
K2,K1,K1,J6, _,K1, _,K1,K2, _,K1,J6, _,K1,K1, _,K3, _,K3,K2,K3, _,K2, _, _,9,//不得真假 不做挣扎 不惧笑话
K1, _,K2, _,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K2, _, _,9,//我曾将青春翻涌成她
K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K3, _, _,9,//也曾指尖弹出盛夏
K3,K2,K2,K1, _,J6, _,K3, _,K2, _,K1,J6, _,K1, _,K1, _, _, _,9,//心之所动 且就随缘去吧
J6, _,K3, _,K2, _,K1,J6, _,K3, _,K2, _,K1,J6, _,K1, _,K1, _, _, _, _, _,9,//逆着光行走 任风吹雨打
J7,K1,K2,K3, _,J5,K5,K3,K3, _, _, _,
J7,K1,K2,K3, _,J5,K5,K3,K2,K3,K1,K2,J7,K1,J5, _,
J7,K1,K2,K3, _,J5,K5,K3,K3, _, _, _, _,
K6,K3,K2,J6,J3,H6,J2,J3,H6, _, _, _,9,//间奏1
J2, _, _,J1,J2, _,J1,J2, _,J3, _,J5, _,J3, _,9,//短短的路走走停停
J2, _, _,J1,J2, _,J1,J2,J3,J2,J1,H6, _, _, _,9,//也有了几分的距离
J2, _, _,J1,J2, _,J1,J2, _,J3, _,J5, _,J3, _,9,//不知抚摸的是故事
J2, _, _,J3,J2, _,J1,J2,J2, _, _, _,9,//还是段心情
J2, _, _,J1,J2, _,J1,J2, _,J3, _,J5, _,J3, _,9,//也许期待的不过是
J2, _, _,J3,J2, _,J1, _,H6, _, _, _,9,//与时间为敌
J3,J2,J1,J2,J1, _, _, _,9,//再次看到你
J3,J2,J1,J2,J1, _, _, _,9,//微凉晨光里
H5,J3,J2,J1,J2, _,J1, _, _, _, _, _,9,//笑得很甜蜜
J1, _,J2, _,J3, _,J1, _,J6, _,J5,J6, _, _,J2,J7, _,J6,J7, _, _,9,//从前初识这世间 万般流连
J7, _,J6,J7, _,J3, _,K1,K2,K1,J7,J6, _, _,9,//看着天边似在眼前
J5, _,J6, _,J5,J6,J5,J6,J5,J6, _,J5,J2, _,J5, _,J3, _, _, _,9,//也甘愿赴汤蹈火去走它一遍
J1, _,J2, _,J3, _,J1, _,J6, _,J5,J6, _, _,J2,J7, _,J6,J7, _, _,9,//如今走过这世间 万般流连
J7, _,J6,J7, _,J3, _,K1,K2,K1,J7,J6, _, _,9,//翻过岁月不同侧脸
J5, _,J6, _,K3,K3, _,J5, _,J6, _,K3,K3, _,J5,J6, _,J6, _, _, _,9,//措不及防闯入你的笑颜
K1, _,K2, _,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K2, _, _,9,//我曾难自拔于世界之大
K2,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K3, _, _,9,//也沉溺于其中梦话
K2,K1,K1,J6, _,K1, _,K1,K2, _,K1,J6, _,K1,K1, _,K3, _,K3,K2,K3, _,K2, _, _,9,//不得真假 不做挣扎 不惧笑话
K1, _,K2, _,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K2, _, _,9,//我曾将青春翻涌成她
K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K3, _, _,9,//也曾指尖弹出盛夏
K3,K2,K2,K1, _,J6, _,K3, _,K2, _,K1,J6, _,K1, _,K1, _, _, _, _, _,9,//心之所动 且就随缘去吧
K3,J2,K5,K3,K2,K3,K1,K2,J7,K1,J5, _,
J7,K1,K2,K3, _,J3,K5,K3, _, _, _, _,
J7,K1,K2,K3, _,J3,K5,K3, _, _, _, _,
K2, _,H7, _,J6,K5, _,J5,K6, _, _,K1,K3,J6,K6,K5,K2, _, _, _,
K2, _,H7, _,J4,K7, _,J7, _,K4,K7, _,J7, _,K4,K7, _,K6,K4, _,
H1, _,K6, _,J5, _,K5, _,J4, _,K4, _,K3, _,K2, _,K1, _,
K7,_, _, _,K7,_, _, _,K7,_, _, _,K7,_, _, _,9,//间奏2
K1, _,K2, _,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K2, _, _,9,//晚风吹起你鬓间的白发
K2,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K3, _, _,9,//抚平回忆留下的疤
K2,K1,K1,J6, _,K1, _,K1,K2, _,K1,J6, _,K1,K1, _,K3, _,K3,K2,K3, _,K2, _, _,9,//你的眼中 明暗交杂 一笑生花
K1, _,K2, _,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K2, _, _,9,//暮色遮住你蹒跚的步伐
K2,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K3, _, _,9,//走进床头藏起的画
K3,K2,K2,K1, _,J6, _,K3, _,K2, _,K1,J6, _,K1, _,K1, _, _, _, _, _, _,9,//画中的你 低着头说话
K1, _,K2, _,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K2, _, _,9,//我仍感叹于世界之大
K2,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K3, _, _,9,//也沉醉于儿时情话
K2,K1,K1,J6, _,K1, _,K1,K2, _,K1,J6, _,K1,K1, _,K3, _,K3,K2,K3, _,K2, _, _,9,//不剩真假 不做挣扎 无谓笑话
K1, _,K2, _,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K2, _, _,9,//我终将青春还给了她
K2,K3, _,K6,K5, _,K6,K5, _,K6,K5, _,K3, _, _,9,//连同指尖弹出的盛夏
K3,K2,K2,K1, _,J6, _,K3, _,K2, _,K1,J6, _,K1, _,K1, _, _, _,9,//心之所动 就随风去了
J6, _,K3, _,K2, _,K1,J6, _,K3, _,K2, _,K1,J6, _,K1, _,K1, _, _, _, _, _,//以爱之名 你还愿意吗
};
3、 遍历数组,播放音乐、打印歌词
这里的判断语句意思为:遍历音符数组每当有‘9’时,则打印一段歌词,每当有‘_’时,则停顿175+110秒,每个音符演奏175毫秒
HMIDIOUT handle;
midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
midiOutShortMsg(handle, 0 << 8 | 0xC0); //设置通道0的乐器为 大钢琴
unsigned short note = 0; //音符编号
unsigned short velocity = 100; // 力度值,范围通常在0-127
unsigned char statusByte = 0x90 | (0 & 0x0F);//0为声道
int c = 0;
for (int i = 0; i - 1 <1279; i++) {
if (qifengle[i] == 9)
{
printf("%s", geci[c]);
c++;
}
else {
Sleep(175);
if (qifengle[i]=='_')
{
Sleep(110);
}
else
{
note = qifengle[i];
}
}
// 组合3个字节的消息到一个DWORD值
unsigned long noteOnMsg = (((unsigned long)velocity << 16) | (((unsigned long)note) << 8) | (unsigned long)statusByte);
// 发送MIDI消息
midiOutShortMsg(handle, noteOnMsg);
}
midiOutClose(handle);
记得将以上函数写入qfl();函数中。
再次奉上效果链接,如果可以帮到大家的话,小张真的会深感荣幸!
C语言钢琴演奏《起风了》,经典回归!!!_哔哩哔哩_bilibili
七、结语
在编程学习中,我们应保持着快乐的心态,在学习中取悦自己,享受学习带来的成就感,才能在这条路上坚持下去! !!
附录
状态参数
命令类型 | 命令字节的内容 | 数据字节1的内容 | 数据字节2的内容 |
---|---|---|---|
关闭音符 | 80+CH | 音符音高 | 关闭力度 |
开启音符 | 90+CH | 音符音高 | 打开力度 |
触后压力 | A0+CH | 音符音高 | 触后压力值 |
控制器 | B0+CH | 控制器编号 | 控制的数值 |
音色切换 | C0+CH | 音色编号 | - |
通道压力 | D0+CH | 该通道全部键盘的触后压力 | - |
弯音轮 | E0+CH | 弯音轮低位数据 | 弯音轮高位数据 |
系统普通信息、实时信息、及高级信息代码 | F0+CH | 0或若干个数据字节 |
音色表
/*
General MIDI Level 1 旋律乐器对照表
Note: 只向某个MIDI通道发送Program Change命令设置乐器,是不能发音的,
想要发音,还必须发出开音符指令;有些乐器开始播放后,如果不发关音
符指令,会持续发音很长时间
*/
//Piano 1-8 键盘乐器 define = MIDI GM1列表序号 - 1
#define Acoustic_Grand_Piano 0 //平台钢琴
#define Bright_Acoustic_Piano 1 //亮音钢琴
#define Electric_Grand_Piano 2 //电钢琴
#define Honky_tonk_Piano 3 //酒吧钢琴
#define Electric_Piano_1 4 //电钢琴1
#define Electric_Piano_2 5 //电钢琴2
#define Harpsichord 6 //羽管键琴
#define Clavi 7 //电翼琴
//Chromatic Percussion 9-16 固定音高敲击乐器
#define Celesta 8 //钢片琴
#define Glockenspiel 9 //钟琴
#define Music_Box 10 //音乐盒
#define Vibraphone 11 //颤音琴
#define Marimba 12 //马林巴琴
#define Xylophone 13 //木琴
#define Tubular_Bells 14 //管钟
#define Dulcimer 15 //洋琴
//Organ 17-24 风琴
#define Drawbar_Organ 16 //音栓风琴
#define Percussive_Organ 17 //敲击风琴
#define Rock_Organ 18 //摇滚风琴
#define Church_Organ 19 //教堂管风琴
#define Reed_Organ 20 //簧风琴
#define Accordion 21 //手风琴
#define Harmonica 22 //口琴
#define Tango_Accordion 23 //探戈手风琴
//Guitar 25-32 吉他
#define Acoustic_Guitar_nylon 24 //木吉他 尼龙弦
#define Acoustic_Guitar_steel 25 //木吉他 钢弦
#define Electric_Guitar_jazz 26 //电吉他 爵士
#define Electric_Guitar_clean 27 //电吉他 原音
#define Electric_Guitar_muted 28 //电吉他 闷音
#define Overdriven_Guitar 29 //电吉他 破音
#define Distortion_Guitar 30 //电吉他 失真
#define Guitar_harmonics 31 //吉他泛音
//Bass 33-40 贝斯
#define Acoustic_Bass 32 //民谣贝司
#define Electric_Bass_finger 33 //电贝司 指奏
#define Electric_Bass_pick 34 //电贝司 拨奏
#define Fretless_Bass 35 //无格贝斯
#define Slap_Bass_1 36 //捶钩贝斯1
#define Slap_Bass_2 37 //捶钩贝斯2
#define Synth_Bass_1 38 //合成贝司1
#define Synth_Bass_2 39 //合成贝司2
//Strings 41-48 弦乐器
#define Violin 40 //小提琴
#define Viola 41 //中提琴
#define Cello 42 //大提琴
#define Contrabass 43 //低音大提琴
#define Tremolo_Strings 44 //颤弓弦乐
#define Pizzicato_Strings 45 //弹拨弦乐
#define Orchestral_Harp 46 //竖琴
#define Timpani 47 //定音鼓
//Ensemble 49-56 合奏
#define String_Ensemble_1 48 //弦乐合奏1
#define String_Ensemble_2 49 //弦乐合奏2
#define SynthStrings_1 50 //合成弦乐1
#define SynthStrings_2 51 //合成弦乐2
#define Choir_Aahs 52 //人声“啊”
#define Voice_Oohs 53 //人声“喔”
#define Synth_Voice 54 //合成人声
#define Orchestra_Hit 55 //交响打击乐
//Brass 57-64 铜管乐器
#define Trumpet 56 //小号
#define Trombone 57 //长号
#define Tuba 58 //大号
#define Muted_Trumpet 59 //闷音小号
#define French_Horn 60 //圆号/法国号
#define Brass_Section 61 //铜管乐
#define SynthBrass_1 62 //合成铜管1
#define SynthBrass_2 63 //合成铜管2
Reed 65-72 簧乐器
#define Soprano_Sax 64 //高音萨克斯风
#define Alto_Sax 65 //中音萨克斯风
#define Tenor_Sax 66 //次中音萨克斯风
#define Baritone_Sax 67 //上低音萨克斯风
#define Oboe 68 //双簧管
#define English_Horn 69 //英国管
#define Bassoon 70 //低音管
#define Clarinet 71 //单簧管
//Pipe 73-80 吹管乐器
#define Piccolo 72 //短笛
#define Flute 73 //长笛
#define Recorder 74 //直笛
#define Pan_Flute 75 //排笛
#define Blown_Bottle 76 //瓶笛
#define Shakuhachi 77 //尺八
#define Whistle 78 //哨子
#define Ocarina 79 //陶笛
//Synth Lead 81-88 合成音主旋律
#define Lead_1_square 80 //方波
#define Lead_2_sawtooth 81 //锯齿波
#define Lead_3_calliope 82 //汽笛风琴
#define Lead_4_chiff 83 //合成吹管
#define Lead_5_charang 84 //合成电吉他
#define Lead_6_voice 85 //人生键盘
#define Lead_7_fifths 86 //五度音
#define Lead_8_bass_lead 87 //贝司吉他合奏
//Synth Pad 89-96 合成音和弦衬底
#define Pad_1_new age 88 //新世纪
#define Pad_2_warm 89 //温暖
#define Pad_3_polysynth 90 //多重和音
#define Pad_4_choir 91 //人生合唱
#define Pad_5_bowed 92 //玻璃
#define Pad_6_metallic 93 //金属
#define Pad_7_halo 94 //光华
#define Pad_8_sweep 95 //扫掠
//Synth Effects 97-104 合成音效果
#define FX_1_rain 96 //雨
#define FX_2_soundtrack 97 //电影音效
#define FX_3_crystal 98 //水晶
#define FX_4_atmosphere 99 //气氛
#define FX_5_brightness 100 //明亮
#define FX_6_goblins 101 //魅影
#define FX_7_echoes 102 //回音
#define FX_8_sci_fi 103 //科幻
//Ethnic 105-112 民族乐器
#define Sitar 104 //西塔琴
#define Banjo 105 //五弦琴/斑鸠琴
#define Shamisen 106 //三味线
#define Koto 107 //十三弦琴/古筝
#define Kalimba 108 //卡林巴铁片琴
#define Bag_pipe 109 //苏格兰风琴
#define Fiddle 110 //古提琴
#define Shanai 111 //獸笛,类似唢呐
//Percussive 113-120 打击乐器
#define Tinkle_Bell 112 //叮铛铃
#define Agogo 113 //阿哥哥鼓
#define Steel_Drums 114 //钢鼓
#define Woodblock 115 //木鱼
#define Taiko_Drum 116 //太鼓
#define Melodic_Tom 117 //定音铜鼓
#define Synth_Drum 118 //合成股
#define Reverse_Cymbal 119 //逆转钹声
//Sound Effects 121-128 特殊音效
#define Guitar_Fret_Noise 120 //吉他滑弦杂声
#define Breath_Noise 121 //呼吸杂声
#define Seashore 122 //海岸
#define Bird_Tweet 123 //鸟鸣
#define Telephone_Ring 124 //电话铃声
#define Helicopter 125 //直升机
#define Applause 126 //拍手
#define Gunshot 127 //枪声