Zoom MS70 - CDR Pedal v2 preset is ready

Hi, recently @1overf mentioned in another thread he wants to build a preset for the Zoom MS70-CDR preset.

This got me fascinated somehow. I have this pedal and never thought about getting it controlled via MIDI, let alone the E1. After a bit of research yesterday, as well as with what @1overf mentioned, it looks like this is really possible to achieve.

If anyone is out there wanting to help or having made progress on the topic so far, be happy to join in.

The MS70-CDR is a very popular pedal amongst synth players, so it’s an effects pedal that might be to use for a lot of us.


If you search for “Zoom MS70 Sysex” you’ll quickly find like at least 2 attempts with unofficial sysEx explanations, enough to get one started.

this blog is my attempt to describe the proceedings.

Here is what I plan to do:

The challenges:

  • the documentation is incomplete
  • the meaning of a parameter differs per effect type
  • the range of a parameter differs per effect type
  • there are up to 6 simultaneous effects, so approach should be made generically to avoid having to repeat everything 6 times.
  • not all parameters found in the sysex string can be controlled one by one (on/off on fx 3, 4 and 5, and tempo)

I will start with

  1. establishing comms : can I have the E1 send a sysex and the MS70-CDR respond, while monitoring that communication via MIDI-Ox ?
  2. Can I get the MS70-CDR to send each separate parameter value, when I tweak knobs on the pedal itself , and see them in MIDI-Ox?
  3. Can I draw a matrix explaining how each parameter for each effect type is identifiable, what name to give to the parameter and what range it has (within each effect type). In case the parameter acts as an option list, what options are there? Is there a source of info already having this data (partially)?
  4. Can I test sending the following from E1 to pedal : change program, change effect type, change a value for a parameter? So I can validate the paramter change SysEx would be working bidirectionally ?
  5. Can I define a range of virtual parameters so I can craft each parameter change SysEx when the parameter changes, so I do not have to type them all in?
  6. Can I define an algoritm capable of reading each single received parameter change SysEx from the pedal and setting the right value in the ParameterMap?

When all this is positive, we’ll first check the patch parsing capabilities, before building anything. Reason: ensure we know if and how the values in the memory dump SysEx correspond to the ones on the parameter change SysEx .
7. Can I request a current program (buffer) memory dump SysEx , or only a dump of a specific program, in which case I need to know what program is current
8. Can I identify how the Zoom SysEx uses the 8th bit (AFAIK this should be similar to how Sequential deals with their 8th bit)?
9. Can I easily identify the corresponding changes in the SysEx info, when a value in the program has been altered?
10. Are the values, as found in the memory dump SysEx , the same values and range as the ones in the individual parameter changes ?

If all of the above gets positive answers, we can build our preset. The task ahead is then:

  • draw the matrix in a structured way (in excel) by reverse engineering each single parameter
  • create a preset with 4 pages : one general (program change, unit select and parameters, effects on/off, tempo), and one page for naming, then 2 more, each with 3 effects units.
    • create an algo that will compose each parameter change SysEx when a knob is turned
    • create an algo that will decompose each received parameter change SysEx and set the appropiate parameter without retransmitting (avoid creating a MIDI loop)
    • take inspiration from previous presets (like the 03R/W) where one also had to deal with effects parameters that change meaning, color and range , depending on the chosen effect type, and apply the documented matrix to it

Once all of this is tested sufficiently and working well, we can go about requesting full dumps and reverse engineer those. But the road is long and winding :slight_smile: Let’s start with Question 1.

1 Like

establishing comms

YES :slight_smile:

And fairly easy: I connected the MS70 with an old fashioned USB cable (the ones used on older photo camera’s) onto my MioXL. Lo and behold, my MIOXL even provided the pedal with power ! No need for the external adapter. That IS brilliant.

I downloaded the Zoom MS70-CDR MIDI specification, made by C. Feddema aka sixeight (www.vguitarforums.com). You should be able to find it on the internet. I’ll use it as a reference.

First step: I created a sysEx button on an empty preset and send the identity request to the MS70 (be aware the 00 in bold is a variable and stands for a sysEx Device ID. I’ll will make this a variable later on in my sysEx strings):

F0 7E 00 06 01 F7

When sending it, the MS70 replied with

F0 7E 00 06 02 52 61 00 00 00 32 2E 31 30 F7

which is as expected.
image

The communications have been established :partying_face:

Next thing I did, was create my standard interface for program changes, this time keeping the programs between 0 and 49 (= 1 to 50), without bank numbers. If you want to know the ins and outs, go check some of my presets, I’m doing this more or less identical in all of my presets.

image

Last task of the day: have the MS70 send out parameter changes?

For this I made a toggle pad that transmits

F0 52 00 61 50 F7 (go into editor mode)

when On and

F0 52 00 61 51 F7 (leave editor mode)

when Off.

And indeed I now see the pedal transmitting sysEx messages of 10 bytes in total, when I control an effect parameter on the pedal (see below in the screenshot, the ones sent as “A01 --” are the ones coming from the MS70)

image

That’s all for today!

2 Likes

Following, super interested if this comes to fruition. Though I am not sure I’d be able to assist, I thank you for your efforts.

1 Like

A bit of patience will be needed : there are more than 130 separate effects to document, and the documentation is neither correct, nor complete.

Here’s a draft version of the conversion work being done
Zoom MS70 FX Matrix draft.zip (73.1 KB)

1 Like

Good news :effect type address logic more or less found.

I may have resolved how the various effect types are addressed. It is a combination of a Category, a main ID and a variant ID. If I order the effect types with those 3 ID’s I get exactly the same order as the pedal itself uses.

Below are the address components for the First effect as found in the 146 bytes Current Patch dump.

The category is a 4 bit ID, but only 7 values are used.


with the following values:

  • 0 - Thru
  • 1 - Dynamics
  • 2 - EQ/Filter
  • 6 - Chorus
  • 7 - Various
  • 8 - Delay
  • 9 - Reverb

The main ID is made from 6 bits, mostly used sequentially, and ranges from 0 to 32.

The variant ID is made of 4 bits, but only 6 values are used: 0, 4, 5, 8 ,10, 12 which I labeled:

  • blank (no variant)
  • 4
  • 5
  • B
  • B2
  • B4

The logic in the variant ID is probably more meaningful to the effect designers than to users.

The general look and feel of the preset could be as follows (no logic yet!)

1 Like

And by now, all effects should have been identified. For each effect type, a name has been given, knob setting (name, min, max, option list/overlay and color). There are 57 overlays to dynamically allocate to various parameters.
The details per effect type and per parameters are found in the zipped excel.

The foreseen colour coding:

  • White : levels or Left Channel
  • Blue : speed and times
  • Green : tone , filter
  • Red: pitch, or Right Channel
  • Purple : all others

Zoom MS70 FX Matrix.zip (100.4 KB)

On to the next step.

The first usable version of the MS70 CDR pedal is out.
https://app.electra.one/preset/XQIdiLos9vCzBs4lk8fO

It should be usable for some other Zoom models, but I haven’t got them so I can’t test them.
Loading might take a while: there are almost 60 overlays to be constructed, 2 of which are created while loading and together they contain more than 6000 values. Let it run :slight_smile:

A few things can’t be controlled yet from the E1: on/off of FX units 4-6, changing the effect type of a unit, setting the number of units and setting the tempo. For this to work I can’t use the more straightforward sysEx parameter Change, but I need to reconstruct the full 146 bytes of a preset and send these back to the pedal.
That work still needs to be done.

In the meantime, enjoy, and provide me some feedback.

This looks really useful! Out of interest will it work with the hacked pedal with all the Zoom effects, or does it need the stock ones only? I’ll try it out on my Mk1 anyway but that might be my first stumbling block…

Actually ? Yes, I could make it work :grin:. By accident I learned about that hack today, seeing Florian Pilz’s youtube on it. I think it is possible, but I’ll need your assistance .

I guess currently when you reach one of your hacked preset types, it will either show the incorrect parameters of the previous unit slot you looked at, or it would show a big undefined parameter range. I did not really took measures on this, so it will not look nice, but it won’t lock up your pedal. I should always show the undefined parameters, in such case. Will work on it for the next version.

Word of advice: if you scroll very quickly through effect types in a slot on the Zoom, disable edit mode on the E1 while doing that: the Zoom transmits the full patch every time you click, and there is a lot of processing going on on the E1 to get it all straightened out. If you move very fast, communications may get clogged. By disabling edit mode, there is no MIDI traffic to get clogged !

You’ll need to provide me info on each of these additional zoom effects.
The data needed are:

  • name of the effects
  • category it belongs to
  • name of each parameter
  • range (starting at 0) for each parameter when sent out by the MS70 (check this with Midi-Ox, be aware each parameter change can use two bytes to go beyond 127: the first is the LSB, then the MSB)
  • overlay needed for the range (per parameter) What labels do you get to see on the MS70?
  • dump of the received sysEx(via MID-Ox ) of the first 25 Bytes from the 146 byte dump the Zoom sends out when in edit mode, whereby you assure your new effect Type is in slot 1…

It would be interesting you reserve engineer at least one that way, so we may try it out

1 Like

Version 2 is ready.
https://app.electra.one/preset/xpbhZBNb37MseUMvYWuu

Do read the description before using. All parameters are now controllable, but some are not supported by sysEx parameter changes:

  • tempo
  • number of effect units used
  • on/off of units 4-6
  • the patch name
    I resolved it by turning them red. You need to transmit the sysEx then to the pedal using the red “XMit => Pedal” pad. That worked better than continuously sending 144 byte sysex for each value you encounter while turning a control.

Yellow/ orange parameters indicate an unknown effect (in case you loaded one yourself) or a parameter with a value outside its range (in which case the pedal and the E1 may be temporarily out of sync for that parameter).

Other than that, its lua is packed with effect related characteristics and overlays.
A kind of Zoom CDR series FX library :slight_smile:

Enjoy !
Ignace

2 Likes

Still haven’t had time to try this but looking forward to it! I recently got an NTS-3 Kaoss Pad which is kind of a similar setup (4 chainable fx). There’s an excellent editor app but I thought it would be cool to try and implement an Electra version. Anyway, I digress! I’ll check out your CDR preset and eventually I’ll help with the hacked version data, promise!

2 Likes

@NewIgnis I just saw this post. I actually started working on one a few months back and then I got stuck on pulling out the names of the fx. I did manage to extract the name of the preset and I have it reading as well as setting the tempo. My solution is pretty messy since this is one of the first things I tried when I got the electra one and to be honest it was rather challenging. I can’t wait to see how you did it. Here is a link to my preset which is a work in progress. my zoom preset

Well… it was one of the reasons why I waited so long wit hthe MS 70 CDR. Like @oldgearguy with his PCM 80, effect devices are much harder to disect than regular synths.

The best devices to start with are the smaller synths that use CC and/ or NRPN for all of its parameters, and have a documented SysEx Buffer Memory Dump you can request.

@NewIgnis I still want to finish it. I actually use the preset I put together all the time and it’s fun. The last thing I wanted to implement was the names of the 6 effects in a patch. I was excited I was able to extract the patch name but the names of the 6 slots looks more complex. Can you tell me is your preset for ms70cdr or ms70cdr+. I tried your preset with the ms70cdr but wasn’t getting it to work for some reason. Thanks for sharing

It ‘s made and tested with the ms70 cdr, so not the + version. There are no names for the 6 effect units to extract. There are only 10 values per effect. One is the effects type, the 9 others are its paramaters. What needs to be done is resolve the effect type against a table where per effects type you define:

  • effects name (and category)
  • parameter names
  • Parameter minimum range
  • Parameter maximum range
  • Control color
  • The overlay to use

Making that table was the hardest work, it meant going into every single parameters of every single effect, and write down how it was used.

The preset should work. Can you get it to select another patch via program change? Can you see the preset then go in ‘sync’ mode? Can you monitor if the pedal transmits a response?

1 Like

I will check again tonight. I am running the cdr hack that enables you to load patches from all zoom pedals but I don’t think it interfered with any stock sysex. Yes you are correct it’s category but there is also a name of sorts for each fx. I got stuck on this step but I have the full table commented out in my code in the preset I shared… Here is an example
CDR
{0, 0, “—”, FX_TYPE_OFF}, – 01
{12, 195, “CoronaCho”, FX_MODULATE_TYPE}, – 02
{12, 224, “Chorus”, FX_MODULATE_TYPE}, – 03
{12, 33, “VintageCE”, FX_MODULATE_TYPE}, – 04
{12, 227, “ANA 234Cho”, FX_MODULATE_TYPE}, – 05
{12, 3, “CE-Cho5”, FX_MODULATE_TYPE}, – 06
{12, 35, “Clone Chorus”, FX_MODULATE_TYPE}, – 07

And this is the way I did it. Just as in your case the "name of the effects are things like “CoronaCho” (which I called “Corona Chorus”) or “ANA 234Cho” (which I called “ANA 234 Chorus”).

But I 've made a concatenation of the fxType Id in my own way. What I call 6624 , you call 12/195. What I call 6640, you call 12/227.

Out of that fxTypeID I do extract what I’ve called a category name, a Main ID and a Variant Code. You won’t find the same definitions elsewhere on the internet.

Below part of the codes that show how the fxTypeID is split back in those 3 parts, do the Category is retrievable.
In the preset itself you’ll find how I parsed the fxTypeID out of the SysEx dump.

  local fxCat= {{0,"THRU"},{1,"DYNAMICS"},{2,"EQ / FILTER"},{6,"CHORUS"},{7,"VARIOUS"},{8,"DELAY"},{9,"REVERB"}}
  for _, pair in ipairs(fxCat) do
    if pair[1] == fxTypeID>>10  then
      controls.get (136):setName (pair[2]) -- Cat Name
    end 
  end
...
  controls.get (138):setName (string.format("Variant %d",fxTypeID%16)) -- Variant Code
    controls.get (137):setName (string.format("Main ID = %d",(fxTypeID>>4)%64)) -- Main ID
  local fxTypeChar= {{6608,"Mirage Chorus","Depth",PURPLE,0,100,x,"Rate",BLUE,0,100,x,"Mix",WHITE,0,100,x,"Pre-Delay",BLUE,1,20,x,"Tone",GREEN,0,100,x,"Level",WHITE,0,150,x},
  {6624,"Corona Chorus","Speed",BLUE,0,100,x,"Depth",PURPLE,0,100,x,"FX Level",WHITE,0,100,x,"Tone",GREEN,0,100,x,"Dry",0x8ABA7A,0,1,1043},
  {6640,"ANA 234 Chorus","Level",WHITE,0,100,x,"Rate",BLUE,0,100,x,"Depth",BLUE,0,100,x,"Low Freq Level",GREEN,0,100,x,"High Freq Lvl",GREEN,0,100,x,"Mode",0x8ABA7A,0,1,1036},
  {6656,"Corona Tri","Speed",BLUE,0,100,x,"Depth",PURPLE,0,100,x,"FX Level",WHITE,0,100,x,"Tone",GREEN,0,100,x,"Dry",0x8ABA7A,0,1,1043},
  {7184,"Bit Crush","Bit depth",PURPLE,4,16,x,"Sample Rate",PURPLE,0,50,x,"Balance",WHITE,0,100,x,"Tone",GREEN,0,10,x,"Level",WHITE,0,150,x},
  {7200,"Bomber","Pattern",PURPLE,0,3,1029,"Decay",BLUE,1,100,x,"Balance",WHITE,0,100,x,"Threshold",PURPLE,0,50,x,"Power",PURPLE,0,30,x,"Tone",GREEN,0,10,x,"Level",WHITE,0,150,x},
  {7216,"Mono Synth","Synth Level",WHITE,0,100,x,"Dry Level",WHITE,0,100,x,"Output Level",WHITE,0,150,x,"Wave",PURPLE,0,3,1049,"Tone",GREEN,0,10,x,"Speed",BLUE,0,100,x},
  {7232,"Z-Organ","Upper freq",WHITE,0,100,x,"Lower freq",WHITE,0,100,x,"Dry",WHITE,0,100,x,"HPF",GREEN,0,10,x,"LPF",GREEN,0,10,x,"Level",WHITE,0,150,x},
  {7248,"Auto Pan","Rate (sync)",BLUE,0,78,10078,"Width",PURPLE,0,100,10100,"Level",WHITE,0,150,x,"Depth",PURPLE,0,10,x,"Clip",PURPLE,0,10,x},
  {7264,"Roto Closet","Balance",WHITE,0,100,x,"Mode",0x8ABA7A,0,1,1051,"Level",WHITE,0,150,x,"Drive",PURPLE,0,100,x}}

If you find other names for each fx Unit within a patch, can you pinpoint where in the pedal you see them? So far I’ve seen no sign of existence of them, not in the pedal itself , nor in the SysEx patch dump.

1 Like

I don’t believe the names get defined anywhere in sysex but rather only in the zdl format for each fx. I am trying to dig through your code. If you don’t mind I would love it if you can take a look at my code at some point. I’ve definitely learned something looking over your solutions and plan to try out your preset on the pedal again tonight. I made a few functions such as sysex_to_list, bin_to_int, replace_bit, get_bits, etc that I plan to use on other presets which are used in my code. It would be cool if some of these sorts of tools were built in functions. Peek is a helpful builtin but it might be cool if others were part of the Electra one lua toolset.

What’s the zdl format you refer to?

Zdl is the code for each fx. Check out the zoom hack if you haven’t already it’s pretty amazing and provides an editor for the pedal https://youtu.be/Ul-BYkV3PSk?si=CQfkDRfbEAuRbHS4. Also this repository has all the info on the various zoom pedals including sysex (which you expertly decoded) info and on the zdl fx code which can actually be modified. [GitHub - shooking/ZoomPedalFun: A collection of tips and tricks for Zoom B1On, B1XFour and G1XFour pedals.]
I tried your preset again last night and the only thing that created a change on the pedal was the tuner. Nothing updated on the pedal and no controllers were updated on either e1 screen or cdr70. I am using v1 Electra One so do you think that might be an issue? Regardless it was still great to comb through your solution and I plan to do some refactoring based on some efficiencies you implemented. Thanks