Конфигурировать Mac OS X MIDI программно

Я пишу программу, которая преобразует OSC в MIDI, позволяя приложениям с включенным OSC (например, touchOSC на моем iPhone) управлять приложениями с поддержкой 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-драйвер loopback, и все мои проблемы были бы решены …

Ваша догадка о написании прямо на plist правильная – вы, вероятно, не должны этого делать. Я не уверен на 100%, но у меня такое ощущение, что plist отражает состояние MIDI-устройства, но изменение его не откроет или не закрывает это MIDI-устройство по мере необходимости.

Чтобы действительно открыть MIDI-устройство, вы можете использовать что-то вроде pygame . Я использовал его для некоторых проектов, связанных с аудио, и SDK очень прост и удобен в работе. Поскольку python не имеет большой поддержки для MIDI напрямую, это, вероятно, лучший выбор (если не написать сам модуль python C, что было бы довольно болезненно).

Что касается IAC, то постыдно, что в других ОС нет таких виртуальных MIDI-устройств, как это. IAC очень полезен и хорош в том, что он делает. Поэтому, полагаясь на IAC для чего-то подобного, это не будет кросс-платформенным, вы можете написать слой абстракции для управления устройством loopback. Для пользователей Windows вы можете рекомендовать бесплатное устройство loopback для подключения к вашему программному обеспечению.

PyGame сам использует PortMidi под капотом. Если вам не нужна вся библиотека PyGame, возможно, это может быть полезно для вас.

Если вы хотите отправить OSC на MIDI, вам лучше всего создать виртуальный порт Midi в программном обеспечении, а пытаться удаленно настроить IAC. Этот виртуальный порт появится в Ableton и т. Д., Чтобы затем вы могли управлять им программным способом.

Вы можете сделать это, используя библиотеку rtmidi-python (или более старые и немного разные pyrtmidi ) – оба основаны на кросс-платформенной rtmidi lib, которая обеспечивает прямую отправку MIDI Control и Notes:

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