c语言midi编程钢琴演奏

开篇先礼貌地附上效果视频链接:

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音乐调用的一些函数

包括:

  1. HMIDIOUT函数
  2. midiOutOpen函数
  3. midiOutShortMsg函数
  4. 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+CH0或若干个数据字节

音色表

/*
    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     //枪声

音码表

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
嵌入式MIDI协议编程是指在嵌入式系统中使用MIDI(音乐仪器数字接口)协议进行编程的过程。MIDI协议是一种数字通讯协议,用于在音乐电子设备之间传输音乐信息。在嵌入式系统中,我们可以利用MIDI协议来实现音乐设备、声音控制器、合成器等的通讯和控制。 在嵌入式MIDI协议编程中,我们需要首先了解MIDI协议的数据格式和通讯规则。MIDI消息一般包括状态字节和数据字节,状态字节用于表示消息类型(例如音符、控制器等),而数据字节用于传输具体的音乐信息。通过理解MIDI消息的结构和含义,我们可以在嵌入式系统中编写相应的处理逻辑。 在实际编程过程中,我们可以使用各种嵌入式开发工具和设备,如Arduino、Raspberry Pi等。通过编写相应的代码,我们可以实现MIDI输入、输出、解析和处理等功能。例如,我们可以通过MIDI输入接口接收外部音乐设备的指令,然后根据这些指令控制嵌入式系统内部的声音生成器;同时,我们也可以通过MIDI输出接口将系统内部的音乐信息传输给外部设备进行播放或控制。 总之,嵌入式MIDI协议编程是一项涉及音乐、通讯和嵌入式技术的复合性任务。通过深入了解MIDI协议和灵活运用嵌入式系统编程技术,我们可以实现各种音乐设备和系统的控制和交互,为音乐科技领域的发展做出贡献。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值