关于python:以编程方式配置Mac OS X MIDI

Configure Mac OS X MIDI programmatically

我正在编写一个将OSC转换为MIDI的程序,从而允许启用OSC的应用程序(例如我的iPhone上的touchOSC)来控制启用MIDI的应用程序(Sibelius,Ableton Live等)。

我正在使用Python创建OSC服务器并将OSC转换为MIDI。为了使MIDI进入相关应用程序,我正在将MIDI输出至Apple IAC驱动程序,然后将其作为相关程序中的输入启用。

有人知道以编程方式配置Mac MIDI设备的方法吗?特别是,我需要启用默认情况下禁用的IAC驱动程序。

使用FileMon,我发现启用/禁用IAC驱动程序时Audio Midi Setup.app会修改此文件:

?/首选项/ByHost/com.apple.MIDI.0017f2cxxxxx.plist

数字0017f2cxxxxx是我的系统IOPlatformUUID。这是一个简单的XML属性列表,但是我对直接写它很谨慎。即使我做了,想必我还是需要哄骗Midi服务器进程重新以某种方式重新读取它?

最后,我越来越意识到,完全使用IAC驱动程序是一个非常简单的解决方案-首先,它仅适用于Mac!理想情况下,我将编写一个回送MIDI驱动程序,所有问题都将得到解决...


您对直接写入plist的直觉是正确的-您可能不应该这样做。我对此不是100%的确定,但是我有一种感觉,plist反映了MIDI设备的状态,但是更改它不会根据需要打开或关闭该MIDI设备。

要实际打开MIDI设备,可以使用pygame之类的东西。我已经将其用于一些与音频相关的项目,并且该SDK非常简单易用。由于python不直接支持MIDI,因此这可能是您最好的选择(除非自己编写python C模块,否则会很痛苦)。

对于IAC,其他操作系统没有这样的虚拟MIDI设备是很遗憾的。 IAC非常有用,并且擅长于此。因此,尽管依靠IAC进行跨平台的操作不是跨平台的,但您可以编写一个抽象层来处理回送设备。对于Windows用户,您可以推荐与软件一起使用的免费MIDI回送设备。


如果要将OSC发送到MIDI,最好不要在软件中创建Virtual Midi端口,而应尝试远程配置IAC。此虚拟端口将显示在Ableton等中,因此您可以使其以编程方式控制事物。

您可以使用rtmidi-python库(或较旧且略有不同的pyrtmidi)执行此操作-两者均基于跨平台的rtmidi库,该库可直接发送MIDI Control和Notes:

1
2
3
4
5
6
7
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

PyGame本身在后台使用PortMidi。如果您不需要所有PyGame库,那么这可能对您有用。