以下のtweetで,つまみやらスライダが大量にくっついたMIDIデバイスが存在するらしいことを知った.
DaVinci Resolveを、MIDIデバイスでコントロール出来るようにするツール「MIDIGrade」 | 映像職人 https://t.co/FJXsdm6kKl pic.twitter.com/k431Dc9Y1N
— 映像職人 (@eizoushokunin) 2016年8月24日
探してみたところ,USB接続で手頃な価格(ヨドバシで¥4,000なり)のデバイスを発見.色々とパラメータを調整したりするのに便利そうだったので,MIDIコントローラとPythonで通信してみた.
http://www.korg.com/jp/products/computergear/nanokontrol2/
使ったもの
Korg nanoKontrol2
上で紹介したこれ.
安い,小さいととりあえず試してみるにはぴったりなデバイス.
ボタン3つとつまみ,スライダのセットが8chあるほかにボタンが10個ぐらいある.
設定ソフトでボタンに付いたLEDの動作モードとか,ボタンの動作モード(トグルかモーメンタリか)が選べたりと意外と高機能.
Python3 + rtmidi2
先行研究(「[python][web audio api]ブラウザとMIDIコントローラを繋げてみる。」)によれば,PythonからMIDIデバイスを読むにはpygameを使えば良いらしい・・・
しかし,pygameは機能が多すぎるし導入は面倒だしで今回は見送り(便利なんだけどね!).
そこでMIDIライブラリRtMidiのラッパーであるrtmidi2を使ってみた.
RtMidi自体がプラットフォーム依存では無いためrtmidi2もクロスプラットフォームらしい.最近,Windowsに対応してないライブラリが多い気がするのでありがたい話である.
ただし,C++のRtMidiをほんとうにそのままラップしただけらしく,結構Pythonicで無いところがある.
通信サンプル
以下は,接続されているデバイスからnanoKONTROL2を検索し,デバイス→PCのメッセージを延々と表示するサンプルと実行中にボタンを押したりつまみを回したときの出力である.get_message()
で得られるMIDIデバイスからのメッセージは3要素のuint8_t配列で,1要素目がの上位4bitがメッセージタイプ,下位4bitがチャンネル,2項目がノート番号,3項目が変更後の値になっている.
よって,基本的に2項目と3項目を確認すれば,どのつまみやスライダがいくつの値になったかが確認できる.
import time
import rtmidi2
midi_in = rtmidi2.MidiIn()
print(midi_in.ports)
device_name = "nanoKONTROL2"
try:
index = midi_in.ports_matching(device_name+"*")[0]
input_port = midi_in.open_port(index)
except IndexError:
raise(IOError("Input port not found."))
while True:
time.sleep(0.01)
message = input_port.get_message()
if message: print(message)
[u'nanoKONTROL2 0']
[176, 34, 127]
[176, 34, 0]
[176, 50, 127]
[176, 50, 0]
[176, 18, 1]
[176, 18, 2]
[176, 18, 3]
[176, 18, 4]
[176, 18, 5]
[176, 18, 6]
[176, 18, 7]
[176, 18, 8]
[176, 18, 9]
[176, 18, 10]
[176, 18, 11]
# 以下略
注意点
ポーリング間隔
上のサンプルでは,MIDIデバイスからのメッセージをポーリングで確認した.しかし,このポーリング間隔を短くしすぎるとPCがフリーズしてプロセスを殺すことさえ出来なくなるので注意.実際には,rtmidi2のreadmeにあるように,コールバック関数を定義して非同期に処理をした方が無難.
メッセージのタイミング
非常に残念なことにMIDIデバイスがPCにメッセージを送信するのは,デバイスの状態が変化したときだけの様子.
そのため,アプリケーション起動直後に現在のつまみやスライダの状態を一括で取得するといったことは出来ない.
欲を言えば任意のタイミングで任意の軸の現在値を取得できることが望ましいが本来そういう用途をするための物では無いので我慢である.
最後に
早いところPC→MIDIデバイスについても書いてしまいたい.