ZOOM G1on自動制御実験 – PythonによるMIDI信号処理Programming

ZOOMのマルチエフェクター(アンプシミュレーター)G1onをPythonを使ってWindows PCからMIDI制御してみました。
1つめの仕掛けは、手動による単純なパラメータ制御です。
ジョイスティックのBボタンでアンプのGainとコーラスのDepthを段階的に上昇させ、Aボタンで段階的に減少させます。
大掛かりなMIDIフットコントローラを足元に置かなくても、プログラミング環境さえあれば身近なコントローラ類を利用して簡単にMIDI制御装置を構築することが可能です。Bluetooth対応のゲームコントローラがあれば、MIDI機器の遠隔制御装置も低コストで実現できますね。
2つめの仕掛けは、演奏によるパラメータの自動制御です。
MIDI変換器SONUUS G2MをギターとG1onの間に挟むことにより、ギターから流れてくる音の高さをMIDI入力信号から検出することができます。これを制御信号として用い、低い音域のEb以下の音・高い音域のEb以上の音がそれぞれトリガとなり、コーラスとディレイとリバーブを自動的にON/OFFさせます。低音域ではコーラスOFF・ディレイOFF・リバーブON、高音域ではコーラスON・ディレイON・リバーブOFFとなります。
コントローラに一切触れることなく、ギターのどのポジションを弾くかによって自動的にエフェクトを切り替えることができます。このような演奏とコンピュータプログラミングの融合は、無限の可能性を秘めているのではないでしょうか。
最後に、本実験動画に使用したコードを示します(見やすいように若干整形しました)。
なお、MIDI制御ライブラリには弊社開発のpymidiate(ベータ版)を利用しています。
https://github.com/PGkids/pymidiate
ライブラリの簡単な解説が以下にあります。
https://qiita.com/pgkids/items/77819a…

### 本実験に使ったコードです ###
from midiate.zoom.g1on import *
from midiate import *
import pygame

pygame.init()
pygame.joystick.init()
try:
js = pygame.joystick.Joystick(0)
js.init()
except pygame.error:
raise Exception(‘Joystick not found’)

mid = Midiator()
mid.start_process()

g1 = G1on(midiator=mid)
g1.connect()

amp,chorus,delay,reverb,_ = g1.make_patch(‘MSDRIVE’,’Chorus’,’Delay’,’Arena’)
amp[‘OUT’] = ‘ComboFront’
delay[‘Tail’] = ‘ON’

mode = None
def turn_mode_if_needed(m):
global mode
if m != mode:
mode = m
if mode == 1:
chorus.off(); delay.off(); reverb.on()
print(‘mode 1’)
elif mode == 2:
chorus.on(); delay.on(); reverb.off()
print(‘mode 2’)

turn_mode_if_needed(1)

def operate(dev, msg, raw):
note = raw[1]
if note <= 51:
turn_mode_if_needed(1)
elif note >= 63:
turn_mode_if_needed(2)

# open Roland UM-1 USB MIDI Interface that connected to SONUUS G2M
ctrl_in = mid.open_input(name=’UM-1′,translate=8)
mid.register_callback(ctrl_in, b’9′, operate)
mid.listen(ctrl_in)

param = 100
def setparam():
chorus[‘Depth’] = param
amp[‘Gain’] = param
print(f’パラメータ変更: amp.Gain = chorus.Depth = {param}’)

while True:
e = pygame.event.wait()
if e.type==pygame.JOYBUTTONDOWN:
btn = e.button
# press SELECT or START button to quit
if btn in (6,7):
break
# when button A pressed, decrease Gain and Depth
elif btn==0:
if param > 10:
param -= 10
setparam()
# when button B pressed, increase Gain and Depth
elif btn==1:
if param < 100:
param += 10
setparam()

g1.disconnect()
mid.stop_process()

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください