在 C++ 中从 MIDI 设备获取 ID

Posted

技术标签:

【中文标题】在 C++ 中从 MIDI 设备获取 ID【英文标题】:Get ID from MIDI devices in C++ 【发布时间】:2009-12-26 00:00:46 【问题描述】:

我是一名音乐家和程序员,我想创建自己的程序来制作音乐。 在制作 GUI 之前,我将从 C++ 中的控制台应用程序开始。

我是 C/C++ 的新手,知道如何制作基本的控制台应用程序,并且阅读过 Win32 API。

我在 MSDN 中寻找 Win32 应用程序中的多媒体,我发现了很多 MIDI 功能:http://msdn.microsoft.com/en-us/library/dd798495(VS.85).aspx

我可以通过这种方式接收插入多少个 MIDI 设备:

#include <windows.h>
#include <iostream>
using namespace std;
int main() 
    cout << midiInGetNumDevs();
    cout << " MIDI devices connected" << endl;
    return 0;

但是现在我想知道这些设备是如何被调用的,我认为是 midiInGetID 函数和 while 循环。有人可以帮我吗?该函数需要一个HMIDIIN 参数,我不知道如何获得,因为几乎所有的 MIDI 函数都使用这个参数。

我知道这不是最明显的话题,但如果有人可以帮助我,那就太好了。

谢谢:)

【问题讨论】:

【参考方案1】:

要获取信息,您循环调用midiInGetDevCaps,第一个参数从包含的0 到排除midiInGetNumDevs 的结果不等。每次调用都会用关于第 N 个设备的信息填充一个 MIDIINCAPS 结构(在调用函数时传递一个指向该结构的指针)。要打开一个设备并填写其他调用所需的 HMIDIIN,您可以调用midiInOpen,并将设备编号(同样,包括 0 到 N-1)作为第二个参数。

同样的概念也适用于输出设备,只是名称用Out 代替In(结构用OUT 代替IN)。

【讨论】:

我在一个新的答案中回复了你,因为我不能在这里标记我的代码。【参考方案2】:

好的,我想通了。我不知道midiInGetDevCaps 需要调用它的特定属性才能返回设备名称。

这是我的代码:

#include <windows.h>
#include <iostream>
using namespace std;
int main() 
    unsigned int devCount = midiInGetNumDevs();
    cout << devCount << " MIDI devices connected:" << endl;
    MIDIINCAPS inputCapabilities;
    for (unsigned int i = 0; i < devCount; i++) 
        midiInGetDevCaps(i, &inputCapabilities, sizeof(inputCapabilities));
        cout << "[" << i << "] " << inputCapabilities.szPname << endl;
    

感谢您的帮助!

【讨论】:

以上是关于在 C++ 中从 MIDI 设备获取 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Pygame 从 MIDI 设备获取输入?

从 C# 控制台应用程序枚举 UWP MIDI API 设备?

从停止的设备获取当前的 MIDI 时间码

从 MIDI 设备实时获取输入(Python)

在 Java 中从 Receiver 获取 midi 消息

在 C# 中从蓝牙设备获取数据