技術の家庭菜園

https://tpcbtw.com/

ZOOM G3X(v2.10)をMIDIコントローラーとして使う

※本稿ではG3X(v2.10)とコンピュータのその通信の解析から最終的にG3Xのデータを扱えるMIDIとして取り出すところまでを書いていく。
最終的な手順を知りたい場合は「スタートパケットの複製」の後半部から読むとよいだろう。

この手法はZOOMのGシリーズ製品(G1on,G3,G3n,G5,G5nなど)全体に応用が効くと考えられるが、特に環境が違う場合、同様のデータ列では動かない可能性が高い。*1
他製品や、私と異なるファームウェアを使用している場合は是非簡単なMIDIメッセージの送受信テストからスタートし、それでだめならパケット解析を行って欲しい。

ZOOM G3とMIDIの話

先日ZOOMのマルチエフェクターG3Xを購入した。

f:id:tpcbtw:20180609131114j:plainG3はその使い勝手の良いデザイン、ZOOM定評の空間系エフェクト、ZOOMにしてはマシになった歪み系エフェクト、そして相変わらずの安さで一世を風靡したエフェクタだ。
今はG3n,G3Xnとして生まれ変わっているが、私の購入したのは旧モデルのG3Xだ。
ちなみに中古で5000円だった。安い。
当然私はこれをギター用のエフェクターとして購入したのだが、このシリーズにはUSB端子が付いている。
これはUSBオーディオとして使用するためのものだそうだが、専用ソフトを用いてエフェクトを書き換えたりもできるらしい。
試しにパソコンに接続してみて気付く。G3はオーディオインターフェイスとして認識されると同時に、MIDIバイスとして認識されるのである。

f:id:tpcbtw:20180609131357p:plain

「(汎用USBオーディオ)」などと書いて誤魔化しているが正真正銘MIDIバイスである。

MIDIバイスとしては、in/outともにを持ち、機能は一通りありそうだ。
もし仮にG3をMIDIコントローラーとして使えるのであれば、それはパフォーマンス時に幅がとても広がる。ぜひ何とかして使いたい。
しかしG3は公式にはMIDIが使えると言っていない。実際に適当なソフトウェアでG3からのMIDIをモニタリングしても、何も信号を出さない。こちらから信号を送っても特に反応はない。
またいくつか海外でG3からMIDIを受け取ろうという取り組みはあるが、(特にv2.00以降では)うまく行っている様子はない。*2

Can I use zoom G3 as midi controller? | The Gear Page
https://www.thegearpage.net/board/index.php?threads/can-i-use-zoom-g3-as-midi-controller.1123392/

しかしこのページの議論や様々な先人のブログからもある通り、G3はれっきとしたMIDIバイスであり、何かの要請でMIDIを返すデバイスであるはずのだ。
以上からG3(v2.00以降)にMIDIを吐かせるために、その始まりとなる何らかの信号をPC側から与えていると推察できる。
その始まりとなるメッセージは何なのだろうか。
そのメッセージさえ別のソフトによって与えることができるのであれば、G3にMIDIを吐かせることもできるのではないか。
それを解明するために、まずはパケット解析から行っていくことにする。

パケット解析

さて、ここではG3のUSBのストリームを監視し、任意のパケットを取り出すことを目指す。
具体的にはエフェクトのエディットソフト"ZOOM Edit&Share"がG3と通信している様子から、その挙動を監視し、それらしいパケットを取り出したい。
パケットキャプチャといえば、やはりWiresharkだろう。そしてWiresharkにはバージョン2.0からオプションでUSBPcapというUSBキャプチャ機能も付いている。
これを用いて解析を行っていく。
インストールやセットアップは割愛、G3を接続した後、該当のポートに対しキャプチャを開始した後に、Edit&Shareを起動する。
すると、Edit&Shareを起動した途端、ものすごい勢いでパケットが流れてくる。

f:id:tpcbtw:20180609164207p:plain

USBにはいくつかの接続方式があり、USB-MIDIはBulk転送と呼ばれる方式を取る。このタイムラインを眺めていると、そのinとoutが周期的に、交互に繰り返されている様子が見て取れる。
ここでG3側のノブを操作するとこの転送周期にいくつかのパケットが混ざり込む。
具体的には

0000   1b 00 80 9b 44 4e 08 a8 ff ff 00 00 00 00 09 00   ....DN.¨ÿÿ......
0010   00 01 00 01 00 03 03 08 00 00 00 04 f0 52 00 07   ............ðR..
0020   59 50 f7                                          YP÷

というパケットがPCからG3に渡されたあと、G3からノブの情報が渡され、

0000   1b 00 80 9b 44 4e 08 a8 ff ff 00 00 00 00 09 00   ....DN.¨ÿÿ......
0010   00 01 00 01 00 03 03 08 00 00 00 04 f0 52 00 07   ............ðR..
0020   59 16 f7                                          Y.÷

スタートパケットの複製

さてこのスタートパケットを何らかの形で作り上げなくてはいけない。
最終手段としてはプログラムを書けば良いのだが、本当にそれは最終手段にしたい。
まずはMIDIメッセージを用いて、これを実装することを考える。
とりあえず、適当なMIDIメッセージを作り出し、それをキャプチャしてみると以下のようなパケットになった。

0000   1b 00 80 cb b0 4b 08 a8 ff ff 00 00 00 00 09 00   ...Ë°K.¨ÿÿ......
0010 00 01 00 01 00 03 03 04 00 00 00 0b b0 07 00 ............°..
MIDIの送受信にはMIDI-OXを用いている。
これを見ればわかるようにnoteやCCでは31バイトの長さのようだ。様々なメッセージを作ってみるが、これは変わらない。
つまり通常のnoteやCCでは、このスタートパケットを作ることは不可能である。
しかし、MIDI-OX上のいろんなボタンを押していると以下のようなパケットを送ることに成功した。
0000   1b 00 80 cb b0 4b 08 a8 ff ff 00 00 00 00 09 00   ...Ë°K.¨ÿÿ......
0010 00 01 00 01 00 03 03 08 00 00 00 04 f0 7e 7f 07 ............ð~..
0020 09 01 f7 ..÷

これは"GM On"というメッセージであり、SysEx(システムエクスクルーシブ)というものらしい。

偏ったDTM用語辞典 - システムエクスクルーシブ:System Exclusiveとは
https://www.g200kg.com/jp/docs/dic/systemexclusive.html

つまりは先のメッセージ"GM On"はユニバーサルシステムエクスクルーシブの1つで

SYSX: F0 7E 7F 09 01 F7

というメッセージなのだ。
これを先程の"GM On"のパケットの最後7バイトと見比べる。

F0 7E 7F 07 09 01 F7

この間に入っている1バイト07はおそらくチェックサムか何か*3だろう。

ではスタートパケットを作るにはどうしたらよいか。
29バイト目までは何か固有のもの*4で、SysExではそれ以降のバイト列を考えれば良いことがわかる。
スタートパケットの30バイト目からは以下のようなデータだ。

F0 52 00 07 59 50 F7

これはF0から始まりF7で終わっているので、やはりSysExのフォーマットと一致している。
ここで4バイト目の07は先ほどと同様に考えれば何か別の符号だ。
つまりこの07を省き、送るべきメッセージはこうだ。

SYSX: F0 52 00 59 50 F7

このメッセージをMIDI-OXから送る。MIDI-OXからはView→SysExから任意のSysExを送ることができる。

f:id:tpcbtw:20180609164908p:plain
送信後にノブやボタンを操作すると、G3からメッセージが届き始めた。成功である。
このMIDI送信状態はUSB接続を切るかエンドメッセージを受信するまで維持されるため、MIDI-OXを終了したり、一度G3をmidiバイスから切りはずしたりしても問題はない。
これなら別ソフトウェアから利用できそうである。

SysExをチャンネルメッセージに変換する

さて、メッセージを受け取れたのは良いのだが、G3から届いたメッセージもまたSysExであった。
つまり通常のチャンネルメッセージのように30,31バイト長のものではなく、メーカーごとにそのフォーマットも違うため、通常のソフトでは扱うことができない。
ここまで使ってきたMIDI-OXはSysExを扱うことができ、また任意のMIDIを受け取ったときにそれを別のメッセージへ変化したり、MIDIパッチベイとしての機能も持っているが、SysExだけは変換できないようである。

Translating (Mapping) SysEx - MidiOx
http://www.midiox.com/cgi-bin/yabb/YaBB.pl?board=query;action=display;num=1364504205

SYSEX to MIDI - MidiOx
http://www.midiox.com/cgi-bin/yabb/YaBB.pl?board=query;action=display;num=1060228531

ここで回答者2名は"Bome's Midi Translator"*5を使うことを質問者に勧めている。
これを使って、SysExを単純なチャンネルメッセージに変換していきたい。

インストールとセットアップは割愛。Midi InにG3を、Outには出力先を入れ、新しいプリセットを作成する。
Bome's Midi Translatorではmidiの学習機能がある。"Capture MIDI"を押し任意のノブを回したり押したりする事でSysExの変数部を自動的に認識し、変数ppやqqとして扱えるようにできる。

f:id:tpcbtw:20180609171253p:plain

今回はフットスイッチのSysExを単純なノートオンに変換した。スイッチなので変数部は存在せず、単純なメッセージのみだ。割り当てたのは"90 30 FF"でC3のvel255のnote onという意味だ。*6

これで問題なく変換ができた。これを仮想MIDIケーブルや実際にケーブルでフィードバックさせれば、DAWやDJソフト、VJソフトにマッピングができた。

まとめ

パケットキャプチャからZOOM GシリーズはMIDIの中でもSysExを用いて通信している事が分かった。
G3がMIDIを送る為のスタートパケットは"SYSX: F0 52 00 59 50 F7"であり、これをMIDI-OXを用いてG3に送ることにより以後G3から信号を受け取れるようになった。
G3から送られてくるSysExはBome's Midi Translatorにより任意のチャンネルメッセージに変換でき、これによりG3をMIDIコントローラーとして扱うことができた。

 

 

*1:そもそもG3のファームウェアバージョンが1.00番代であれば、こんな面倒な手続きは必要ないらしい。そして後継機のG3nやG5nに関しては"MIDI"と仕様に記述があった。しかし同時に公開されるべきMIDIインプリが公開されてないので、これがどのような形で利用できるかは未知数である。
またインプリを公開しないのはMIDI規格に反する。MIDI1.0規格Ver.4.2には以下のように書かれている。

標準MIDIインプリメンテーション・チャートは、送受信機能の早見表として各製品ごとに作成される。(中略)このチャートは、すべてのMIDI製品の取扱い説明書に含まれていなければならない。

つまりインプリがない以上、G3nはMIDI規格に準拠していないのだが、それで"MIDI"という文言を使っていいのだろうか。G3までは公式で"MIDI"という文言は使っおらず、"たまたま"MIDIライクな通信をしていただけなのでインプリがなくても問題はないのだが、仕様に"MIDI"と書いてしまった以上、G3n以降では問題がある気がしてならない。

*2:逆にmidiによってG3を操作するという例はいくつかある。これもv2.00以降ではうまく行ってないそうだが。

ZOOM G3のパッチとMIDIプログラムチェンジ : 31103.com - BLOG
http://31103.ldblog.jp/archives/51984396.html

などでCCによりプログラムチェンジを行っている。
v2.00以降については、おそらくこれは正常に動作せず、後述するスタートパケットの送信により、動作するようになるのではないかと推測される。これは需要があれば検証したいが筆者は特に興味が無いため、ここでは希望的観測に留めたい。

*3:コレは嘘である可能性が高い。適当にビット演算してみたが、どうも07にはならなそうである。

*4:詳しくはMIDI規格の仕様書を読んでほしい。私は読みたくない。

*5:https://www.bome.com/products/mtclassic

*6:本当はこのようなメッセージはCCに割り当てるべきなんだろうが、CCの命名規則をよく知らず面倒だったので。B0 00 FFとかで良いのだろうか。それともプログラムチェンジの一種なのでC0 00とでも書くべきなのだろうか。