Skip to content

De re B1XFour

shooking edited this page Sep 27, 2023 · 15 revisions

B1XFour Sysex Strings

These are the gratuitous "does useful stuff" strings others and I have found (either found via R&D but all tested on my B1XFour).

Majority work on B1X - you just cannot use the Pedal parameters. Similarly for the G1XFour and the G1X - the Device ID is the major difference.

NOTE: The FX on these pedals is in ZD2 format. Similar to the G3 etc. They are NOT compatible with the ZDL format FX (as on the B1On, MS50 etc).

As ever, proceed with caution - you are doing this to your pedal. I have checked the B1XFour / G1XFour but I cannot know how you apply these. I take no responsibility - as per the Creative Commons licence.

Function Sysex String Returns Comments
Identify f0 7e 00 06 01 f7 f0 7e 00 06 02 52 6e 00 00 00 32 2e 30 30 f7 ****Universal String responds with model ID and firmware version
NumPatches/size f0 52 00 6E 07 f7 f0 52 00 6e 06 32 00 78 05 f7 0x32 = 50 patches, 0x7805 =0x578 = patch size
EditorOn f0 52 00 6E 50 f7 Turn Editor mode on so Zoom pedal spits out some content
EditorOff f0 52 00 6E 51 f7 Turn Editor mode off
PCModeOn f0 52 00 6E 52 f7 Turn PC mode on - allows USB file transfer etc
PCModeOff f0 52 00 6E 53 f7 Turn PC mode off
BypassModeOn f0 52 00 6e 64 0b f7 B0 62 0C B0 63 00 In effect you are pressing pedals. Doesnt seem to need additional EditorOn.sh like B1On
BypassModeOff f0 52 00 6e 64 0c f7
TunerModeToggle f0 52 00 6e 64 0b f7 Hit it again and again for on / off.
SetTempo f0 52 00 6e 64 03 00 0a 02 $hexTempoLow $hexTempoHigh 00 00 00 f7 Sets tempo 40 - 240.
SetVolume f0 52 00 6e 64 03 00 0a 00 $hexVol 00 00 00 00 f7 Current patch volume 0 - 120
SetPatchChar f0 52 00 6e 64 03 00 09 $hexCharPos $hexCharVal 00 00 00 00 f7 Example ./SetPatchChar.sh 1 65 set name's first parameter to A (ASCII 65)
GetMoreData f0 52 00 6e 60 05 00 f7 whats in buffer seems to flush the current buffer. Useful for getting clean data
CurrentBankNumber f0 52 00 6e 33 f7 i.e. b0 00 00 b0 20 00 c0 00 Midi CC of the current patch
patch 10 b0 00 00 b0 20 00 c0 00 load patch 10
patch 11 b0 00 00 b0 20 00 c0 01 load patch 11
patch 21 b0 00 00 b0 20 01 c0 01 load patch 21 etc
LoadPatch B0 00 00 B0 20 ${hexHigh} 00 C0 ${hexLow} i.e. B0 00 00 B0 20 ${hexHigh} 00 C0 ${hexLow} hexLow is low byte of Patch - 10. hexHigh is (Patch - 10)/10. Patches on B1XFour are 10 .. 59 on display
GetCurrentPatch F0 52 00 6e 29 F7 F0 52 00 6e 28 ... data ... F7 Returns current patch in raw format. More on this later. NOTE: You need to have EditorModeOn to see the data!
GetPatch F0 52 00 6E 46 00 00 00 00 ${hexPatch} 00 F7 f0 52 00 6e 45 ... Returns given patch (value -1 as hex) in raw format
GetPatchBankPgm F0 52 00 6E 09 00 00 00 00 ${hexPatch} 00 f7 f0 52 00 6e 08 ... Will revisit the difference between the current, 09 and 46 formats.
FXM_OnOff F0 52 00 6E 64 03 00 ${hexFX} 00 ${OnOff} 00 00 00 00 F7 7th byte is FX slot 1 - 5 => 0 - 4, 9th byte is 0 for off, 1 for on.
FXM_PN F0 52 00 6E 64 03 00 ${hexFX} ${hexParam} ${hexValueLow} ${hexValueHigh} 00 00 00 F7 8th byte is FX slot 1 - 5 => 0 - 4, 9th byte is parameter + 1, bytes 10 & 11 are low and high bytes of Parameter values. NOTE the parameter value is biased by 1. If you notice above parameter 00 controls the FX on/off state.
FX_M1_M2_Values F0 52 00 6E 64 02 ${hexFXStart} ${hexFXEnd} 00 F7 Returns an ASCII representation of FX params from Start to End. Best to call GetMoreData before hand to flush buffer.
PatchVol f0 52 00 6e 64 03 00 0a 00 vv 00 00 00 00 f7 vv is volume in hex
FXM_Delete F0 52 00 6E 64 03 00 ${hexFX} 01 00 00 00 00 00 F7 Deletes FX at slot.
FXM_ID F0 52 00 6E 64 03 00 ${hexSlot} ${OnOff} ${hexFXValueLow} ${hexFXValueHigh} 00 ${hexGroupValLow} ${hexGroupValHigh} F7 Example (current) ./FXM_ID.sh 3 64 384 sets FX3 to Dual Comp. NOTE I am likely to change the definitions here. Look at the code for more details.
GetAllFX See Below Raw dump of FX's and their parameters on pedal.
CaptureFXCycle.sh See Below Iterates around the FX params. Quite neat.
Initiate F0 52 00 6E 64 04 F7 Initiate - must be in PC mode
GetNext F0 52 00 6E 64 05 F7 Get next FX, keep going
End F0 52 00 6E 64 07 F7 note keep calling GetNext until you RECEIVE End End iteration
GetScaleFactor F0 52 00 6E 64 11 F7 f0 52 00 6e 64 10 +7a +01 04 04 00 f7 Return DSP Scale factor in bytes 7 and 8. b8*128 + b7
Get_Current_PTCF F0 52 00 6E 64 13 F7 Return current patch in PTCF format
FXM_DelAndShiftLeft F0 52 00 6E 64 03 00 0A 08 nn 00 00 00 00 F7 deletes FX in SLOT nn and left shifts remaining FX
FX Display Window F0 52 00 6E 64 03 00 0A 01 PP 00 00 00 00 F7 Move FX windows to PP + 1

Derived List of FX

see LIST OF FX

B1XFour Probe Sysex Strings

Here I used a command to probe if I get a response from the B1XFour for a given pattern.

probeSysex.cmd

Now this is my approach for probing for single PCMode command Sysex strings from the pedal. I have subsequently learnt that often the Zoom doesnt respond BUT you are changing the patch. More on that as I write it up - only just found how to detect this myself.

more probeSysexCmd.sh 
#!/bin/bash -x

export MIDI_DEV=`amidi -l | grep ZOOM | awk '{print $2}'`
./EditorOn.sh
./PCModeOn.sh
for i in {0..127}
do
	fs=`printf "%03d" $i`
	hexSlot=`printf "%02x" $i`
     	probeString="F0 52 00 6e ${hexSlot} F7"
	theFile=p_${hexSlot}_${fs}.bin
       	amidi -p ${MIDI_DEV} -S ${probeString} -r ${theFile} -t 1
	let x=`ls -l ${theFile} | grep -c " 0 "`
       	if [ $x -eq 1 ]
	then
		echo $x
		rm ${theFile}
	fi
	./EditorOn.sh
done
./PCModeOff.sh

The above writes out files of the form p_dec_hex.bin. Here's the listing from a B1XFour.

pi@raspberrypi:~/Software/ZoomPedal $ ls -1 p_*
p_01_001.bin
p_04_004.bin
p_05_005.bin
p_07_007.bin
p_0e_014.bin
p_29_041.bin
p_33_051.bin
p_44_068.bin
p_48_072.bin
p_50_080.bin
p_51_081.bin
p_52_082.bin
p_53_083.bin
p_55_085.bin
p_56_086.bin
p_57_087.bin
p_60_096.bin

You could trial, at your own risk, on your Zoom pedal. Change the Device ID. I have done this on my Zoom B1XFour and G1XFour. Clearly Zoom is adding more commands with the new pedals. This is positive - better functionality BUT since they do not open it up it is also a little frustrating.

Three ways to get patch data

GetCurrentPatch

 ./GetCurrentPatch.sh 
F0 52 00 6E 29 F7

876 bytes read NOTE some 00 skipped
00000000  00 f0 52 00 6e **28** 04 50  54 43 46 24 01 00 00 00  |.ðR.n(.PTCF$....|
00000010  01 00 00 00 05 00 10 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 45 6d 00 70  74 79 20 20 20 20 00 20  |....Em.pty    . |
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 54  58 4a 31 00 00 00 02 00  |.......TXJ1.....|
00000050  54 58 45 31 48 00 00 00  00 00 00 00 00 00 00 00  |TXE1H...........|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000130  00 00 00 00 00 00 00 00  00 00 00 00 00 45 00 44  |.............E.D|
00000140  54 42 78 00 00 00 00 01  00 00 00 00 00 00 00 00  |TBx.............|
00000150  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000160  00 00 01 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000170  00 00 00 00 00 00 00 00  00 00 00 00 00 01 00 00  |................|
00000180  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000190  00 00 00 00 00 00 00 00  00 01 00 00 00 00 00 00  |................|
000001a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001b0  00 00 00 00 01 00 00 00  00 00 00 00 00 00 00 00  |................|
000001c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001d0  50 50 52 4d 0c 00 00 00  00 00 00 00 00 00 04 00  |PPRM............|
000001e0  00 00 32 04 0c 00 00 00  00 00 00 00 00 00 00 00  |..2.............|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000360  00 00 00 00 00 00 00 00  00 00 00 f7              |...........÷|
0000036c


pi@raspberrypi:~/Software/ZoomPedal $ probeString="F0 52 00 6E 09 00 00 00 00 10 00 f7"
pi@raspberrypi:~/Software/ZoomPedal $ !ami                         
amidi -p ${MIDI_DEV} -S ${probeString} -r pp.bin -t 1; hexdump -C pp.bin

885 bytes read
00000000  f0 52 00 6e 08 00 00 00  78 05 00 50 54 43 46 38  |ðR.n....x..PTCF8|
00000010  01 00 00 00 01 00 00 00  05 00 10 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  53 61 00 6e 73 20 43 6c  |........Sa.ns Cl|
00000030  65 61 08 6e 10 00 00 01  70 00 44 00 02 11 00 00  |ea.n....p.D.....|
00000040  03 10 00 00 00 0b 00 00  00 00 00 54 58 4a 31 28  |...........TXJ1(|
00000050  00 00 00 00 42 61 73 73  20 44 1d 52 56 02 70 0e  |....Bass D.RV.p.|
00000060  67 17 3f 70 02 35 02 3d  11 3e 77 02 22 03 4e 03  |g.?p.5.=.>w.".N.|
00000070  0a 01 3a 5b 03 13 03 54  03 45 74 03 13 03 68 01  |..:[...T.Et...h.|
00000080  42 54 00 58 45 31 34 00  00 00 00 54 68 69 73 20  |BT.XE14....This |
00000090  69 73 00 20 61 20 66 61  74 20 00 62 75 74 20 63  |is. a fat .but c|
000000a0  6c 65 00 61 6e 20 73 6f  75 6e 00 64 20 74 68 61  |le.an soun.d tha|
000000b0  74 20 00 75 73 65 73 20  42 61 00 73 73 20 44 52  |t .uses Ba.ss DR|
000000c0  56 2e 00 00 00 00 45 44  54 42 00 78 00 00 00 21  |V.....EDTB.x...!|
000000d0  00 00 58 03 0c 48 00 0c  30 01 00 00 00 00 00 00  |..X..H..0.......|
000000e0  00 00 00 00 00 00 00 00  00 00 40 61 00 00 05 02  |..........@a....|
000000f0  14 00 00 0a 40 01 00 00  00 00 00 00 00 00 00 00  |....@...........|
00000100  00 00 00 00 00 00 23 00  00 07 04 0a 78 00 0a 48  |......#.....x..H|
00000110  00 0f 10 10 05 48 00 00  00 00 00 00 00 00 00 00  |.....H..........|
00000120  00 21 00 00 00 16 19 00  00 19 00 00 00 00 00 00  |.!..............|
00000130  00 00 00 00 00 00 00 00  00 00 00 00 00 01 00 00  |................|
00000140  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000150  00 00 00 00 00 00 00 00  50 50 00 52 4d 0c 00 00  |........PP.RM...|
00000160  00 00 01 00 00 40 00 00  00 00 00 67 00 00 00 00  |.....@.....g....|
00000170  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000360  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 7e  |...............~|
00000370  00 5f 06 04 f7                                    |._..÷|
00000375

This is the one I have been mostly decoding until now.

GetPatch value

./GetPatch.sh 1

I have not decoded these yet BUT if you look at Mungewell's Python code he has.

GetAllFX

#!/bin/bash
./PCModeOff.sh
for i in {10..60}
do
	./EditorOff.sh
	# change to current patch
	./LoadPatch.sh ${i}
	# get FX
	./EditorOn.sh
	./GetCurrentFX.sh ${i}
done

CaptureFXCycle

#!/bin/bash
theFileBase=CycledFXData
./PCModeOn.sh
./EditorOn.sh
./InitiateFXCycle.sh
todo=0
counter=0
while [ ${todo} -ne 1 ] ; do
	tcString=`printf "%03d" ${counter}`
	export theFile=${theFileBase}_${tcString}.bin
	./FXCycle.sh
	todo=`hexdump -C ${theFile} | grep -ic "52 00 6E 64 07"`
	counter=$(($counter+1))
done
./PCModeOff.sh
./EditorOff.sh