PythonからMIDIメッセージを送ってDAWを操作


  • MIDI Machine Control (MMC)を使って、Nuendoを外部から操作できる。
  • PythonのモジュールでMIDIメッセージを送ることができる

これらを利用して、PythonからNuendoを動かす。
もちろん、Nuendoでなくとも、一般的なDAWであれば、同じことができると思います。

0. 環境

  • MacOS 10.15.6 Catalina
  • Nuendo 10.3

1. MIDI Port を開く

Audio MIDI設定

  • Audio Midi Setup を開く
  • ⌘2 で MIDI Studio を開く

  • 新規作成

  • IAC Driverをダブルクリック
  • プロパティタブ
  • 機能の、MIDIマシンコントロールをチェック

  • ポートタブ
  • デバイスをオンラインにする。
  • ポートの名前を決める。
  • 適用

  • Audio MIDI設定は立ち上げたまま

2. PythonでMIDIを送信する

Install Modules

$ pip install mido python-rtmidi

Document

Mido - MIDI Objects for Python - Mido 1.2.9 documentation

Python でMIDI Portを開く

import mido

print(mido.get_output_names())
# ['IAC Driver MMC Port']

port = mido.open_output('IAC Driver MMC Port')

MIDI Messageを送る

  • sysex(system exclusive) messageを 16進数のコマンドで送る。

MIDI Machine Control

# Control Play and Stop
# F0 7F <Device-ID> 06 [<Sub-ID#2> [<parameters>]] F7

# Device-ID -> 7F (ALL Devices)
# Sub-ID#2 -> 01 (Stop)

msg_start = mido.Message.from_hex("F0 7F 7F 06 02 F7")
msg_stop = mido.Message.from_hex("F0 7F 7F 06 01 F7")

# Control Locator
# F0 7F <Device-ID> 06 44 06 01 <hr> <mn> <sc> <fr> <ff> F7

# <hr> -> hour
# <mn> -> minute
# <sc> -> second
# <fr> -> frames
# <ff> -> sub-frames (0 basically)

# move Locater to 00:05:00:00
msg_locate = mido.Message.from_hex("F0 7F 7F 06 44 06 01 00 05 00 00 00 F7")

# send messages

port.send(msg_locate)
port.send(msg_start)
port.send(msg_stop)

# close port

port.close()

関数化してみよう

import mido
import time

def test():
    with mido.open_output('IAC Driver MMC Port') as port:
        port.send(msg_locate)
        port.send(msg_start)
        time.sleep(3)
        port.send(msg_stop)

3. Nuendoで受け取る

  • トランスポート > プロジェクト同期設定... を開く

  • ソースのタブ

  • マシンコントロールのタブ
  • マシンコントロール入力をMIDI マシンコントロールに設定
  • MMC入力を、さっき作ったポートに設定

完成!!!!!!!!!!!!!

未解決問題

  • 稀に、Nuendoの警告で、"24フレームに変更されました、無視しますか?"と聞いてくる。
  • とりあえず無視しています。