puredataからMIDI-OXへ鞍替え
はじめに
昨日からproteus 2000の壊れたロータリーエンコーダの代替手段として、外部からSysExを使って買ったのに使われていないnanoKONTROLを使って制御しようとする試み。。
で、SysExをpuredataから出力しようと色々試してみたがWindowsXPSP3上でpuredata(0.42.5-extended)のmidioutを使ってSysExをまともに出力できないと結論。
正常に信号が認識されて、proteus 2000を制御できているシーケンサからのSysEx出力と、puredataからの出力を見比べるためにMIDI-OXを使ってモニターした。puredata側でmessageでカンマ区切りの数列を作ったり色々しても一つのSysExとは認識してもらえないということが分かった。全部が同じtime slotに入らなきゃとか書いている記事を見つけたがどうやってそれを実現するのか不明。
MAX/MSPのsxformatがあればいいのに、時間があれば自分でnativeで作ったほうがいいかもなぁと、夢想しながらpuredataはあきらめることにした。
ちょっと寄り道してSynthEditでもできるだろうかと考えたが、ControlオブジェクトからSysExをだせるだけなのでこれもNG.
最後にあきらめてMIDI-OXを使うことにする。
なぜ諦めて、、かというと、nano kontrolなどの0-127の分解能をそのままあらゆるパラメータの分解能に写像しなきゃいけないから計算必要だよなと考えたから。もしかしたらVBとか使ったらMIDI-OXでできるのかもしれないけど、もうここまで来るとやっつけ。プログラムしないで対処という方針に決定。
しかしここからまだかなり悩むことになる。
改めて、狙い
MIDI-OXとかMIDI-Yokeって、これまで使ったこと無かったんだよな。これはWindows上でMIDIを扱おうと思ったら必須のツールといってだろう*1。
これからやろうとしていることは、
「nanoKONTROL -> MIDI-Yoke -> MIDI-OX(ここでnanoKONTROLのCC#をSysEXに変換する予定) -> 本当のMIDI出力デバイス(ここでは EDIROL UA-1000) -> Proteus 2000(実は UA-1000との間にはKAWAI MAV-8で繋がっているが)」
これで、SysEx経由nanoKONTROLでproteus 2000を制御するのが目的だ。
MIDI-OX, MIDI-Yoke
midi-yokeをインストールしてMIDI仮想デバイスを生成。midi-oxを起動して信号のルーチングを行う。nanoKontrolから生成したMIDI Yoke仮想デバイスへルーチング。また、MIDI-OXから実MIDIデバイス(UA-1000)へルーチング。
ここで、またハマッタ。
MIDI Yoke 1の仮想デバイスに出しているから、なんとなくMIDI Yoke 1の仮想デバイスから実MIDIデバイス(UA-1000)に出してやればいいような気がしていたが変換するのだからMIDI-OX Event Portから実MIDIデバイス(UA-1000)に出してやる必要があるのだ。当たり前といえば当たり前だけど。。
KORG KONTROL EditorとMIDI-OXのData Mappingで苦闘
こんな風にCC#をnanoKONTROLにマッピングした。
まだ完全形ではないけが一つの暫定解。とくにaudiotionのボタンをトグルにするとか色々試してみての結果も含まれている。midi-oxのData MappingとKORG KONTROL Editorにすべてのノウハウが入っている。
KONTROL Editorはバイナリなのでここには掲載しない。
MIDI-OXのData Mappingは以下のような感じでエントリがずっと続く。
midi-oxをセーブしてできるiniファイルの[Data Map]の部のみを後で掲載する。
MIDI-OXでのData Mappingについて
幾つかポイントがあるのでまとめておく。
- 一つの信号から複数のSysExを出力するときは、「Pass original value on [Clone]」にチェックを入れて、入力値の複製を作成してさらにMappingの先のエントリに渡すことをする。これを続ければ幾つでもSysExを出力できる。これは、そもそもやりたかったメインエンコーダの制御をしようと思ったら「open session, エンコーダを廻して, close session」の3つのSysExを投げる必要があるからである。
- nanoKONTROLの仕様によるところが大きいが、ボタンの挙動(button behavior)を「momentary」にすると、ボタンをpushしたときと、releaseしたとき二つの信号が出るようになっている。pushしたときには127の値を出力するようにKontrolEditorで設定するがreleaseしたときは0の値が出るように設定する。この値はmidi-oxから外に出す必要はない。であるからそれは「discard」するように指定する。これをしないと通信が輻輳してしまう。
- nanoKONTROLのボタンの挙動を「toggle」にしたほうがいい場合もある。proteus2000の例で言えば、save/copyボタンとmultiボタン、そしてAuditionボタン。これは一旦ボタンを押すと一回だけ値を送出してボタンが点灯したままになるnanoKONTROLの動きがぴったり感覚と一致する。
- ボタンを押したときではなくスライダーを動かしたときやノブを動かして値を変化させることをしたい。midi-oxでは計算はできなくてもここまではサポートしてくれる。入力信号の二つのデータバイトをそれぞれFA, FBとしてSysEx中に記載できる。そうか、SysExではFA,FB,FCなどは使われないからうまくパターン待ちできるということか。ちなみにFCはMIDIメッセージのステイタスバイト。今回はFBすなわち0から127の間でnanoKONTROLからそう出される第二データバイトを使ってSysEXを記載した。ボリュームをはじめ各ノブは0から127の値を出すから今回は助かった。もしこれらのノブがもっと精度の高い0-255とかそれ以上の値を出力するようであったらnanoKONTROLは使えなかっただろう。
[Data Map] MapVersion=5 MapIsOn=1 MapKeys=0 Map Flags=0 MapCount=62 Map1=15,4,1,1,127,127,255,9,65535,65535,65535,65535,4,Syx1 Syx1=F0 18 0F 7F 55 40 10 F7 Map2=15,4,1,1,127,127,255,9,65535,65535,65535,65535,4,Syx2 Syx2=F0 18 0F 7F 55 40 22 01 00 7F 7F F7 Map3=15,4,1,1,127,127,255,9,65535,65535,65535,65535,0,Syx3 Syx3=F0 18 0F 7F 55 40 11 F7 Map4=15,4,1,1,0,0,255,10,65535,65535,65535,65535,0 Map5=15,4,2,2,65535,65535,255,9,65535,65535,65535,65535,4,Syx5 Syx5=F0 18 0F 7F 55 40 10 F7 Map6=15,4,2,2,65535,65535,255,9,65535,65535,65535,65535,4,Syx6 Syx6=F0 18 0F 7F 55 40 20 04 00 01 F7 Map7=15,4,2,2,65535,65535,255,9,65535,65535,65535,65535,0,Syx7 Syx7=F0 18 0F 7F 55 40 11 F7 Map8=15,4,3,3,127,127,255,9,65535,65535,65535,65535,4,Syx8 Syx8=F0 18 0F 7F 55 40 10 F7 Map9=15,4,3,3,127,127,255,9,65535,65535,65535,65535,4,Syx9 Syx9=F0 18 0F 7F 55 40 22 01 00 01 00 F7 Map10=15,4,3,3,127,127,255,9,65535,65535,65535,65535,0,Syx10 Syx10=F0 18 0F 7F 55 40 11 F7 Map11=15,4,3,3,0,0,255,10,65535,65535,65535,65535,0 Map12=15,4,4,4,127,127,255,9,65535,65535,65535,65535,4,Syx12 Syx12=F0 18 0F 7F 55 40 10 F7 Map13=15,4,4,4,127,127,255,9,65535,65535,65535,65535,4,Syx13 Syx13=F0 18 0F 7F 55 40 20 20 00 01 F7 Map14=15,4,4,4,127,127,255,9,65535,65535,65535,65535,0,Syx14 Syx14=F0 18 0F 7F 55 40 11 F7 Map15=15,4,4,4,0,0,255,10,65535,65535,65535,65535,0 Map16=15,4,5,5,127,127,255,9,65535,65535,65535,65535,4,Syx16 Syx16=F0 18 0F 7F 55 40 10 F7 Map17=15,4,5,5,127,127,255,9,65535,65535,65535,65535,4,Syx17 Syx17=F0 18 0F 7F 55 40 20 30 00 01 F7 Map18=15,4,5,5,127,127,255,9,65535,65535,65535,65535,0,Syx18 Syx18=F0 18 0F 7F 55 40 11 F7 Map19=15,4,5,5,0,0,255,10,65535,65535,65535,65535,0 Map20=15,4,6,6,127,127,255,9,65535,65535,65535,65535,4,Syx20 Syx20=F0 18 0F 7F 55 40 10 F7 Map21=15,4,6,6,127,127,255,9,65535,65535,65535,65535,4,Syx21 Syx21=F0 18 0F 7F 55 40 20 21 00 01 F7 Map22=15,4,6,6,127,127,255,9,65535,65535,65535,65535,0,Syx22 Syx22=F0 18 0F 7F 55 40 11 F7 Map23=15,4,6,6,0,0,255,10,65535,65535,65535,65535,0 Map24=15,4,7,7,127,127,255,9,65535,65535,65535,65535,4,Syx24 Syx24=F0 18 0F 7F 55 40 10 F7 Map25=15,4,7,7,127,127,255,9,65535,65535,65535,65535,4,Syx25 Syx25=F0 18 0F 7F 55 40 20 02 00 01 F7 Map26=15,4,7,7,127,127,255,9,65535,65535,65535,65535,0,Syx26 Syx26=F0 18 0F 7F 55 40 11 F7 Map27=15,4,7,7,0,0,255,10,65535,65535,65535,65535,0 Map28=15,4,8,8,127,127,255,9,65535,65535,65535,65535,4,Syx28 Syx28=F0 18 0F 7F 55 40 10 F7 Map29=15,4,8,8,127,127,255,9,65535,65535,65535,65535,4,Syx29 Syx29=F0 18 0F 7F 55 40 20 01 00 01 F7 Map30=15,4,8,8,127,127,255,9,65535,65535,65535,65535,0,Syx30 Syx30=F0 18 0F 7F 55 40 11 F7 Map31=15,4,8,8,0,0,255,10,65535,65535,65535,65535,0 Map32=15,4,9,9,65535,65535,255,9,65535,65535,65535,65535,4,Syx32 Syx32=F0 18 0F 7F 55 40 10 F7 Map33=15,4,9,9,65535,65535,255,9,65535,65535,65535,65535,4,Syx33 Syx33=F0 18 0F 7F 55 40 20 10 00 01 F7 Map34=15,4,9,9,65535,65535,255,9,65535,65535,65535,65535,0,Syx34 Syx34=F0 18 0F 7F 55 40 11 F7 Map35=15,4,10,10,127,127,255,9,65535,65535,65535,65535,4,Syx35 Syx35=F0 18 0F 7F 55 40 10 F7 Map36=15,4,10,10,127,127,255,9,65535,65535,65535,65535,4,Syx36 Syx36=F0 18 0F 7F 55 40 20 11 00 01 F7 Map37=15,4,10,10,127,127,255,9,65535,65535,65535,65535,0,Syx37 Syx37=F0 18 0F 7F 55 40 11 F7 Map38=15,4,10,10,0,0,255,10,65535,65535,65535,65535,0 Map39=15,4,11,11,65535,65535,255,9,65535,65535,65535,65535,4,Syx39 Syx39=F0 18 0F 7F 55 40 10 F7 Map40=15,4,11,11,65535,65535,255,9,65535,65535,65535,65535,0,Syx40 Syx40=F0 18 0F 7F 55 40 20 03 00 01 F7 Map41=15,4,11,11,65535,65535,255,9,65535,65535,65535,65535,0,Syx41 Syx41=F0 18 0F 7F 55 40 11 F7 Map42=15,4,49,49,0,127,255,9,65535,65535,65535,65535,4,Syx42 Syx42=F0 18 0F 7F 55 01 02 03 01 FB 00 F7 Map43=15,4,50,50,0,127,255,9,65535,65535,65535,65535,0,Syx43 Syx43=F0 18 0F 7F 55 01 02 04 01 FB 00 F7 Map44=15,4,119,119,65535,65535,255,9,65535,65535,65535,65535,4,Syx44 Syx44=F0 18 0F 7F 55 40 10 F7 Map45=15,4,119,119,0,127,255,9,65535,65535,65535,65535,4,Syx45 Syx45=F0 18 0F 7F 55 40 22 10 00 FB 00 F7 Map46=15,4,119,119,65535,65535,255,9,65535,65535,65535,65535,0,Syx46 Syx46=F0 18 0F 7F 55 40 11 F7 Map47=15,4,122,122,1,44,255,9,65535,65535,65535,65535,0,Syx47 Syx47=F0 18 0F 7F 55 01 02 01 04 FB 00 F7 Map48=15,4,123,123,1,32,255,9,65535,65535,65535,65535,0,Syx48 Syx48=F0 18 0F 7F 55 01 02 08 04 FB 00 F7 Map49=15,4,124,124,65535,65535,255,9,65535,65535,65535,65535,4,Syx49 Syx49=F0 18 0F 7F 55 40 10 F7 Map50=15,4,124,124,0,127,255,9,65535,65535,65535,65535,4,Syx50 Syx50=F0 18 0F 7F 55 40 22 11 00 FB 00 F7 Map51=15,4,124,124,65535,65535,255,9,65535,65535,65535,65535,0,Syx51 Syx51=F0 18 0F 7F 55 40 11 F7 Map52=15,4,125,125,65535,65535,255,9,65535,65535,65535,65535,4,Syx52 Syx52=F0 18 0F 7F 55 40 10 F7 Map53=15,4,125,125,0,127,255,9,65535,65535,65535,65535,4,Syx53 Syx53=F0 18 0F 7F 55 40 22 12 00 FB 00 F7 Map54=15,4,125,125,65535,65535,255,9,65535,65535,65535,65535,0,Syx54 Syx54=F0 18 0F 7F 55 40 11 F7 Map55=15,4,126,126,65535,65535,255,9,65535,65535,65535,65535,4,Syx55 Syx55=F0 18 0F 7F 55 40 10 F7 Map56=15,4,126,126,65535,65535,255,9,65535,65535,65535,65535,4,Syx56 Syx56=F0 18 0F 7F 55 40 22 13 00 FB 00 F7 Map57=15,4,126,126,65535,65535,255,9,65535,65535,65535,65535,0,Syx57 Syx57=F0 18 0F 7F 55 40 11 F7 Map58=15,4,127,127,65535,65535,255,9,65535,65535,65535,65535,4,Syx58 Syx58=F0 18 0F 7F 55 40 10 F7 Map59=15,4,127,127,0,127,255,9,65535,65535,65535,65535,4,Syx59 Syx59=F0 18 0F 7F 55 40 22 14 00 FB 00 F7 Map60=15,4,127,127,65535,65535,255,9,65535,65535,65535,65535,0,Syx60 Syx60=F0 18 0F 7F 55 40 11 F7 Map61=15,4,118,118,127,127,255,9,65535,65535,65535,65535,0,Syx61 Syx61=F0 18 0F 7F 55 40 10 F7 Map62=15,4,118,118,0,0,255,9,65535,65535,65535,65535,0,Syx62 Syx62=F0 18 0F 7F 55 40 11 F7
最後に
- channel volume とか panの信号を出すとすぐにproteus側が通信量に参ってしまってハングする。ノブ制御の信号はガンガンだしても輻輳しないのに。ちょっと残念。
- 0から127の値の制約はでかい。また、計算できないこともいまさらながら大きい障壁だ。layerのPANは例えば-64から63だからこれは計算しないとmidi-oxでは対応できない。layerのfilterのfreq(周波数)は0-255だからそもそも値が足りない。
- nanoKONTROLのシーン機能を利用してみたい。シーンを変えてスライダとノブをふんだんに使ってamplitude envelopを編集するとか楽しそうだ。これは値が0から100、もしくは127だからどうにかなる。
- LFOの種類が18個だからボタンでどうにかできる。ただ、2つのLFOを持つのでシーンを二つ使ってしまうが。
- データダンプをするためにボタンを使うというのもあるだろう。これはscene1にあるべきか
- 一つのボタンを押すと、複数の異なる設定をするというやり方もあるだろう。例えば、FX A、FX Bのエフェクタを取り去るとか。
- nanoKONTROLだけではなくほかのフィジカルコントローラをつなげてもっといろんなことができるだろう。でもそのときはpuredataでちゃんと計算ができる環境で万能な対処ができるようにしたい。いっそのこと、ちいちゃくて見難い液晶を一切覗き込まないでもいい環境になりたい。
まだまだ色々な応用が考えられるだろう。いい案があったら教えてほしいな。是非試してみたいです。
*1:http://www.midiox.com/