以编程方式配置Mac OS X MIDI

4 投票
3 回答
2560 浏览
提问于 2025-04-16 16:55

我正在写一个程序,把OSC转换成MIDI,这样可以让支持OSC的应用(比如我iPhone上的touchOSC)控制支持MIDI的应用(像Sibelius、Ableton Live等等)。

我用Python创建了一个OSC服务器,把OSC转换成MIDI。为了把MIDI发送到目标应用,我把MIDI输出到Apple的IAC驱动程序,然后在目标应用中把它设置为输入。

有没有人知道怎么在Mac上通过编程来配置MIDI设备?特别是,我需要启用IAC驱动,因为默认情况下它是禁用的。

我使用FileMon观察到,Audio Midi Setup.app在启用或禁用IAC驱动时会修改这个文件:

~/Preferences/ByHost/com.apple.MIDI.0017f2cxxxxx.plist

这里的0017f2cxxxxx是我的系统IOPlatformUUID。这个文件是一个简单的XML属性列表,但我对直接写入它有点担心。即使我写了,估计还得想办法让MIDI服务器进程重新读取它吧?

最后,我越来越意识到使用IAC驱动其实是个不太好的解决方案——首先,它只在Mac上能用!理想情况下,我应该写一个回环MIDI驱动,这样我的问题就都能解决了……

3 个回答

0

PyGame这个库其实在背后使用了一个叫做PortMidi的东西。如果你不需要用到PyGame的所有功能,这个PortMidi可能对你有帮助。

1

如果你想把OSC信号发送到MIDI,最好的办法是通过软件创建一个虚拟MIDI端口,而不是尝试远程配置IAC。这个虚拟端口会在Ableton等软件中显示出来,这样你就可以通过编程来控制各种功能。

你可以使用 rtmidi-python 这个库来实现这个功能(或者使用一个较旧、稍微不同的 pyrtmidi),这两个库都是基于跨平台的 rtmidi 库,能够简单地发送MIDI控制信号和音符:

import rtmidi_python as rtmidi

vmidi_out = rtmidi.MidiOut()
vmidi_out.open_virtual_port('My Virtual MIDI Output Port')

vmidi_out.send_message([0x90, 48, 100]) # Note on
vmidi_out.send_message([176, 7, 100]) # Control Change - Volume 
3

你说的直接写plist文件的想法是对的——其实最好不要这么做。我不是百分之百确定,但我感觉plist文件反映的是MIDI设备的状态,直接修改它并不能打开或关闭这个MIDI设备。

要真正打开MIDI设备,你可以使用像pygame这样的工具。我用它做过一些音频相关的项目,开发工具包非常简单易用。因为Python对MIDI的支持不是很好,所以这可能是你最好的选择(除非你自己写Python的C模块,那样会很麻烦)。

至于IAC,真可惜其他操作系统没有像这样的虚拟MIDI设备。IAC非常有用,功能也很强大。所以虽然依赖IAC来做这样的事情不太适合跨平台使用,但你可以为操作回环设备写一个抽象层。对于Windows用户,你可以推荐一个免费的MIDI回环设备来和你的软件一起使用。

撰写回答