LoginSignup
2
0

More than 5 years have passed since last update.

ZOOM G1onをPythonからMIDI制御する

Last updated at Posted at 2019-03-03

ZOOM G1on

G1onとは、言わずと知れたZOOMの超高コスパなギター用マルチエフェクタ(アンプシミュレータ)です。
ZOOMは昔から空間系のクオリティの高さに定評がありますが、アンプシミュレータとしてもなかなか高クオリティな上に、リズムマシンとルーパーまでついて実売価格が五千円台という恐るべきデバイスです。アンプに突っ込んで大きな音で鳴らしてやると気持ちいいですね。
ZOOMの製品には、90年代半ばのZOOM 4040ZOOM 9050の時代からお世話になっていますが、歪み系に難があると言われていた当時のチープな歪みとは隔世の感があります。軽く小さく持ち運びも便利でPCからのUSB給電でもしっかり動くG1onは、後継機が出たとしても長く付き合っていきたい逸品といえます。

MIDIインプリメンテーションチャートが非公開

性能的には優秀なG1onですが、何故か説明書のどこにも(WEBサイトのどこにも)MIDIインプリメンテーションチャートが掲載されていません。
PCに接続すると、MIDI入出力ともにZOOM 1 Seriesという名前のポートが現れます。しかし、このポートに対して色々信号を送ってみても、意図通りに動くのはプログラムチェンジくらいのもので、コントロールチェンジ信号を送ってエフェクトのパラメタを変化させられるわけでもなく、なんともモヤモヤしてしまいます。
昔のZOOM製品の説明書には事細かにMIDIインプリメンテーションチャートが載っていたのに、今になってなぜ非公開にするのかまるで解せません。理解不能です。(USB)MIDIで自在に制御できれば、もっともっと活用され、より多くのギタリストに愛されるデバイスになるのではないでしょうか。

システムエクスクルーシブメッセージで制御可能

とはいえ悲観することはありません。
G1onは、次の特別なSysExを受け取ると、MIDIによってパッチやパラメタを編集可能なモードに遷移します。
F052006350F7
そして、次のメッセージを受け取ると、編集可能なモードを終了します。
F052006351F7

編集可能なモードに移行すると、ツマミをいじってパラメタを変えたり、エフェクトの種類を変えたりする度に、G1onからSysExが送られてきます。この信号を読み解けば、おおよそは解析できようというものです。

パラメタの制御やエフェクトのON/OFFは簡単

パラメタ制御は次のSysExによって可能です。
F052006331 01(エフェクトの位置) 02(パラメタの位置) 0000(値) F7
注意すべきは、エフェクトの位置は0から、パラメタの位置は2から始まることです。たとえば、3番目にアンプがあるとすると、そのアンプのゲインを100にしたければ、F05200633102026400F7を送ってやればいいことになります。
このF052006331で始まるSysExは、エフェクトのON/OFFにも関わっています。
F052006331 01(エフェクトの位置) 00 00(state) 00 F7
stateが00ならOFF、01ならONになります。

パッチデータは固定長134バイト

次のSysExは5つのエフェクトがすべてバイパスで、名前は空白、パッチ全体の音量(Level)が100の状態のパッチデータです。

F0520063280001000000000000000000000000000000000000000100000000000000000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000000000010000000000000000000000000100000000000020006401000000200300000000202020200020202020202000F7
このデータを基準として音量やパッチ名を変えてみると、自明な構造がすぐに2つ見つかります。
1つ目は110バイト目が音量を示していること、2つ目は121バイト目から最後までがパッチ名となっていることです。
ただし、パッチ名は若干複雑な構造で、最初の4文字と後続する6文字が2つのヌル終端アスキー文字列として別れています。例えば、HelloWorldというパッチ名の場合、パッチデータの名前の部分をCの文字列で表せば"Hell\0oWorld"という形式になっているわけです。

肝心のエフェクトデータの部分は、メッセージの先頭から第1エフェクト・第2エフェクトの順に第5エフェクトまで順序だって格納されているようです。
こまかな解析は時間がないため諦め、ただ一つのエフェクトを除き全てバイパスにしておき、エフェクトの種類を順次変えながらパッチデータで変化した部分を収集するという力技で全てのパタンを抽出しました。

pymidiate

パッチデータを収集し、おおよそのデータが揃ったところで、いよいよ制御ライブラリの開発です。
MIDI制御ライブラリとしては、弊社開発のpymidiate(ベータ版)を使用し、このライブラリにG1on制御ライブラリをバンドルする形にしました。
https://github.com/PGkids/pymidiate
上記リポジトリからソースツリーを引っ張ってきて、python setup.py installでOKです。
現在はWindowsでしか動きませんが、MIDIバックエンドのinterMidiatorをALSA対応などに書き換えれば他OSでも動くと思います。

(2019.3.3 23:37) 正しくインストールできない問題をFIXしてリポジトリに反映しました

今夜は時間がないので、とりあえず使い方だけをまとめます。

使い方

from midiate.zoom.g1on import G1on

## G1on制御オブジェクトを生成
g1on = G1on()
## MIDIバックエンドのinterMidiatorを起動し、G1onに接続
g1on.connect()

## パッチデータを生成し、送信。
## 各エフェクト用のコントローラが5つ組で返される
znr,comp,amp,delay,reverb = g1on.make_patch('ZNR','Comp','MS1959','Delay','Hall')

## コントローラを使ってパラメタを変更
comp['Sense'] = 6

## 同一エフェクトなら複数パラメタを一気に変更することも可能
amp['Gain','Level','OUT'] = 40, 120, 'ComboFront'
delay['Time','Mix'] = 1000,40

## エフェクトのOFF
delay.off()
## エフェクトのON
delay.on()

## G1onと接続解除し、MIDIバックエンドのinterMidiatorを終了
g1on.disconnect()

パッチ名やパッチの音量(Level)を指定してパッチデータを送信する場合には、
g1on.make_patch('ZNR','MS1959',name='my patch',level=80)
のようにすればOKです。

パッチデータを生成して送信するのではなく、G1onに保存されている既存のパッチに対してPythonで制御したい場合には、次のようにすればいいでしょう。
例えば、バンクB4番のパッチに、ZNR,TScream,MSDRIVE,ModReverbの順でエフェクトが入っているとするなら、


# パッチの選択
g1on.select_patch('B',4) # 小文字'b'でもOK

# コントローラは5つ組で返されることに注意
znr,stomp,amp,reverb,_ = g1on.make_controllers('ZNR','TScream','MSDRIVE','ModReverb')

# コントローラを使って制御
amp['Trebl','Middl','Bass','Prese'] = 60,45,60,55

のような感じになると思います。

急ごしらえで書きましたので設計面で雑な部分もありバグも取り切れてはいませんが、なかなか直感的に使用できるライブラリになったのではないでしょうか。
コンパクトで持ち運びもラクチン、しかもノートPCのUSB給電でも駆動するG1onを自在にリアルタイム制御できれば、ギター演奏の可能性は飛躍的に高まるものと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0