开篇先礼貌地附上效果视频链接:
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)