c语言midi编程钢琴演奏

本文介绍了使用C语言实现钢琴演奏《起风了》的方法。先介绍了开发工具Visual Studio 2022,接着说明项目创建、引入头文件和创建函数的步骤。详细讲解了MIDI音乐调用的相关函数,最后通过枚举音调、创建数组并遍历实现音乐播放和歌词打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值