いらないモノ、ひつようなモノ

書籍、音楽、そして若干のテクノロジー

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/