Skip to content

De re MS 70 CDR

shooking edited this page Jun 14, 2022 · 7 revisions

MS-70 CDR Sysex Strings

These are the gratuitous "does useful stuff" strings I have found (either found via R&D but all tested on my MS-70 CDR).

Function Sysex String Returns Comments
Identify f0 7e 00 06 01 f7 f0 7e 00 06 02 52 61 00 00 00 32 2e 31 30 f7 ****Universal String responds with model ID and firmware version. In this case 2.13
NumPatches f0 52 00 61 07 f7 f0 52 00 61 06 32 00 7a 00 f7 0x32 = 50..num patches on pedal 0x7a=122 patch size
EditorOn f0 52 00 61 50 f7 Turn Editor mode on so Zoom pedal spits out some content
EditorOff f0 52 00 61 51 f7 Turn Editor mode off
PCModeOn Not implemented on MS-70 CDR? Let me know if you find it
PCModeOff Not implemented on MS-70 CDR? Let me know if you find it
TunerModeOn B0 4A 40 Dont seem to also need to send EditorOn as per B1On
TunerModeOff B0 4A 00
GetMoreData F0 52 00 61 60 05 00 F7 whats in buffer seems to flush the current buffer. Useful for getting clean data
CurrentBankNumber f0 52 00 61 33 f7 i.e. b0 00 00 b0 20 00 c0 00 Midi CC of the current patch
LoadPatch C0 ${hexLow} i.e. C0 15 hexLow is one less than the physical patch. Patch one is hex 0. Patch 33 is hex 0x20
StorePatch f0 52 00 61 32 01 00 00 ${patch} 00 00 00 00 00 f7 i.e. 15 Store current data into patch. Like a "copy". Patch is hex value for which patch to store
GetCurrentPatch F0 52 00 61 29 F7 F0 52 00 61 28 ... data ... F7 Returns current patch in raw format. More on this later
GetPatch F0 52 00 61 09 00 00 ${hexPatch} F7 f0 52 00 65 08 ... Returns given patch (value -1 as hex) in raw format
FXM_OnOff F0 52 00 61 31 (M-1) 00 (00 or 01) 00 F7 6th byte is FX slot 1 - 5 => 0 - 4, 8th byte is 0 for off, 1 for on.
FXM_PN F0 52 00 61 31 ${hexFX} ${hexParam} ${hexValueLow} ${hexValueHigh} F7 6th byte is FX slot 1 - 5 => 0 - 4, 7th byte is parameter + 1, bytes 8 & 9 are low and high bytes of Parameter values

NOTES

I have not found a patch volume yet - this exists on other Zoom pedals. Maybe I havent looked hard enough or maybe it doesnt have one?

I have found patch tempo - and this is very bizarre. If you watch the pedal with a sniffer you can see the standard (MS-70 variant) sysex is sent. However, if you replay this the pedal does not accept the input. It is possible to patch the patch to do this. To fully explain this will require some text - and likely I will make a YouTube video about it.

Basically, all of the current patch reversing engineering efforts miss the "8 midi bytes encode 7 x 8 bit values" trick. So if you look at g200kg's excellent write up the model used is way to complex. If you unpack the sysex stream from the pedal then the tempo is spread over bytes 109 and 110. Where are these bytes? Well you ignore the first 5 (they are 'hi there - I am a Zoom patch dump', unpack and there they are. I will be writing a program to create Zoom patches.

FX format is ZDL

This appears to be Zoom's first generation FX format. The G1XFour et all use ZD2 (Zoom Device version 2.00). I have written Python programs that can pull out the ZDLs from firmware, create JSON format for the parameters in MIDI format ... ie 0, 1, ... mmax rather than what the pedal displays. Some bugs to iron out. Alas I have not found yet how to get the data from the pedal (as Mungewell discovered for the Zooom G1Four class of pedals).

MS-70 CDR On Probe Sysex Strings

Here I used a command to probe if I get a response from the B1On 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.

pi@raspberrypi:~/Software/ZoomPedalMS70CDR $ more probeSysexCmd.sh 
#!/bin/bash -x

export MIDI_DEV=`amidi -l | grep ZOOM | awk '{print $2}'`
./EditorOn.sh
# no PC mode on a MS-70 CDR?
# ./PCModeOn.sh
for i in {0..127}
do
	fs=`printf "%03d" $i`
	hexSlot=`printf "%02x" $i`
     	probeString="F0 52 00 61 ${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 MS-70 CDR.

pi@raspberrypi:~/Software/ZoomPedalMS70CDR $ ls -1 p_*
p_01_001.bin
p_04_004.bin
p_05_005.bin
p_07_007.bin
p_0e_014.bin
p_16_022.bin
p_29_041.bin
p_2b_043.bin
p_33_051.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.

Unpacking Zoom Sysex

Here is an example of the input (raw from the file and as handled by g200kg and sixeight). Nothing wrong with playing with the raw bits - we have to do it anyhow in unpacked space - but I think the parameter patterns are easier to see in unpacked space.

Infile: currentPatch.bin
INPUT
f0 52 00 61 28 
08 49 00 00 64 00 04 00 08 0a 50 52 00 42 09 00 
00 00 00 00 00 11 00 00 40 50 03 78 00 23 50 10 
00 60 19 00 00 00 00 00 00 00 75 00 00 4c 01 1c 
00 00 33 00 00 00 00 00 00 00 00 00 00 00 01 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 08 00 00 00 40 0c 05 45 
00 6d 70 74 79 20 20 20 00 20 20 00 f7 
Empty     


FXID[1] (ON) =  73 (49), GROUPID = 2 (02)

	P1 =    7 (07)	P2 =    1 (01)	P3 =   20 (14)	P4 =   37 (25)	P5 =    5 (05)	P6 =   40 (28)	P7 =  148 (94)	P8 =    0 (00)	P9 =    0 (00)

FXID[2] (ON) =  17 (11), GROUPID = 0 (00)

	P1 =   30 (1e)	P2 =   30 (1e)	P3 =   70 (46)	P4 =    5 (05)	P5 =    1 (01)	P6 =  150 (96)	P7 =    1 (01)	P8 =    0 (00)	P9 =    0 (00)

FXID[3] (ON) = 117 (75), GROUPID = 6 (06)

	P1 =   10 (0a)	P2 =    7 (07)	P3 =  102 (66)	P4 =    0 (00)	P5 =    0 (00)	P6 =    0 (00)	P7 =    0 (00)	P8 =    0 (00)	P9 =    0 (00)

FXID[4] (ON) =   1 (01), GROUPID = 0 (00)

	P1 =    0 (00)	P2 =    0 (00)	P3 =    0 (00)	P4 =    0 (00)	P5 =    0 (00)	P6 =    0 (00)	P7 =    0 (00)	P8 =    0 (00)	P9 =    0 (00)

FXID[5] (ON) =   1 (01), GROUPID = 0 (00)

	P1 =    0 (00)	P2 =    0 (00)	P3 =    0 (00)	P4 =    0 (00)	P5 =    0 (00)	P6 =    0 (00)	P7 =    0 (00)	P8 =    0 (00)	P9 =    0 (00)
NumFX =  0 (00)

Volume =  0 (00)

TapTempo = 40 (28)
0c 05

OUTPUT

49 00 00 e4 00 04 00 0a 50 52 80 42 09 00 00 00 00 00 
11 00 00 d0 03 78 00 23 50 10 60 19 00 00 00 00 00 00 
75 00 00 4c 01 1c 00 33 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
c0 0c 05 45 6d 70 74 79 20 20 20 20 20 00 

To Do

Allow patching of tempo, FXID etc. NOTE: if you just want to change a parameters value then you can do this directly with Sysex. I havent found yet if it is possible to set the FXID/GID - this is possible on the more modern pedals. On a B1On you can set the FXID but these leads to errors because I havent found how to set the GID. So far I have not found the MS-70 to respond. I will be correlating the "on pedal" patches with the ZDLs I have extracted from Zoom firmware NOTE: my pedals is some 2.x version with added FX. However, the official firmware updater is for a MS-50 pedal! And doesnt have as many FX. BUT I do have the Zoom Effects Manager and will be comparing values there.

I know how to set the tempo in unpacked space. Need to repack and send that. FXID/GID - I can derive what is changing (and hence how the repacked raw sysex) but I would like to see if the IDs I derive from the ZDLs is encoded some how.