模拟MIDI设备 - Windows

6
我需要关于Windows编程、MIDI和WDM方面的建议。我正在尝试编写一个小应用程序,它将位于系统托盘中,并被广告为MIDI输入/输出设备,以便MIDI程序可以发送到它,并将消息转换为不同的格式。我一直在阅读Cant的WDM书籍并搜寻有关编写设备驱动程序的信息,但不知道是否走上了正确的道路。 我还不知道如何: a) 将我的驱动程序注册为MIDI兼容(我是否将其引用放入注册表中,并让操作系统将MIDI调用指向dll中的功能?) b) 将MIDI数据通过我的驱动程序直接传递到我的应用程序,这可能会太大而无法成为驱动程序本身。
任何关于如何开始的建议都将不胜感激。 谢谢, Pete
3个回答

8

Windows MIDI驱动程序不需要在内核中实现,它们可以完全在用户空间作为DLL实现。

MSDN有关于需要实现的函数的一些信息 - 音频设备消息用于MIDI - 不幸的是,它有些欠缺。

过去在NT4 DDK中有这种类型驱动程序的示例代码,但是最近的DDK / WDK版本不再包括它。

一些更好(虽然较旧)的文档和示例代码仍然可以在搜索后找到:


2
设备是由设备驱动程序枚举(或模拟),而不是应用程序。您在系统托盘中看到的是应用程序图标。因此,您需要同时具备驱动程序和应用程序 - 您不能让一段已编译代码兼具两者功能。
在驱动程序方面,您可能希望查看MSDN文档。这将回答您问题的部分(a)。
假设您仍然想继续,(b)最好是让您的应用程序从驱动程序中提取数据。这比另一种方式要简单得多——应用程序可以轻松地找到驱动程序,但驱动程序很难找到特定的应用程序(进程)。

谢谢回复。今天下午我一直在阅读更多的驱动程序书籍并运行示例,现在我开始看到了解决这个问题的路径。但是有一个问题:让我的应用程序持续执行读取操作以从设备驱动程序中提取信息似乎效率低下。是否有简单的方法可以向驱动程序注册我的应用程序,通过某种形式的IPC获得提示来唤醒并拉取数据呢? 事情正在变得更加清晰...慢慢来。 谢谢, 皮特 - user380998
在您的驱动程序中使用循环缓冲区即可。 MIDI 是相当实时的;如果没有应用程序使用它,驱动程序可以安全地覆盖旧数据。 - MSalters

0

如果您正在寻找更简单的入门方式,那么有一个MIDI回送驱动程序可用,制造它的人也提供(或曾经提供)其版本,允许您的程序直接与驱动程序通信。这为您提供了所需的行为,其中程序显示为MIDI设备。回送驱动程序位于http://nerds.de/en/loopbe1.html。我不再看到开发者页面,但如果您联系他们,您可能能够购买许可证以直接访问无需回送的驱动程序。


不幸的是,这些受到严格的许可限制,不能用于学习或甚至扩展自己的实现。 - Mike 'Pomax' Kamermans
当然,这就是让别人做工作的代价。无论如何,请给Tobias Erichsen发送电子邮件。https://www.tobias-erichsen.de/software/loopmidi.html他的驱动程序具有良好的API,可以设置各种配置的端口名称。 - Brad
我知道它确实可以,已经试过了,但考虑到他的驱动程序是唯一的,作为一个开源开发者来说,这对我的音频工作来说是“很棒”,但对我需要做的开源编程来说还不够好 =) - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans 说的有道理,但不幸的是我认为在这种情况下这就是现实。除非你知道有一个开源的实现……那将会很好看到。 - Brad
这是我到这里的方式。我正在谷歌上搜索如何实现win10虚拟MIDI设备和驱动程序,以便我可以停止依赖loopbe1,并拥有可以由社区维护的代码,超出我特定需要的范围。 - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans,请在您取得进展时向我们更新!这真是令人兴奋。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接