these are notes from a project zero and i did to control the Zoom G1Xon guitar multi-effects pedal in real-time over USB.

there are various pieces of software to edit and store patches for Zoom pedals, but they’re not so great for real-time control. nonetheless, they contain lots of useful information. we got most of ours from this wonderful project page and some of the code linked from the home page of that wiki. the B1on is moooooostly the same as the G1Xon.

the pedal communicates with a USB host using MIDI SysEx and CC messages. as documented on that wiki page, most of the SysEx commands require a model ID specific to the pedal; while the B1on’s is 0x65, the G1Xon’s is 0x64. (you can find this out with the “Identify” command.) oddly, we found that some commands work with the incorrect model ID in the command, while others do not, so if you are having trouble with inconsistency, make sure you’re using the right model ID everywhere.

when trying to receive data back from the pedal (whether for the Identify command, the Get(Current)Patch commands, or when receiving patch fragments when making changes on-device), make sure that you have enabled receiving SysEx messages with whatever midi driver you are using; rtmidi, for example, filters them out by default. (zero brought up this possibility when i was stumped.)

you need to turn on edit mode before doing much stuff, including before the pedal will send values back when edited on-device.

for our purposes, the most useful commands are those labeled FXM_OnOff and FXM_PN. the former enables/disables pedals and the latter changes pedals’ parameters. stripped of the SysEx header/footer, the latter message looks like this:

52 00 64 31 ${pedalIndex} ${paramIndex} ${paramValueLow} ${paramValueHigh}

here, pedalIndex is the 0-indexed index of the pedal within the effects chain, paramIndex is the… 2(?)-indexed index of the parameter within the specific pedal, paramValueLow is the low 7 bits of the value, and paramValueHigh is the high 7 bits of the value. we found that the paramValue maps exactly onto the value shown on the device—there’s no hidden extra precision—so if a value is 0-100 on the device, you send 0-100.

the values/sliders/dials on the device’s display update in real-time when sending new parameter values, even for effects that normally can’t be edited on-device. it’s cute to see some of the little dials spin!