Introduction: Arduino Based ZOOM MS70-cdr Midi Program Changer
This project is based on Lawrence Doss 's one. The only difference is on the choice of the usb host device (in this case a USBHOST2 from Hobby Tronic with Midi firmware on. If you haven't or cannot afford this device, please see my other instructable to try other shield. Here is an exemple of what you can generally make with an Arduino bord, here a Uno one and 2 switches. The number of presets depending of how many switches you need and the capacity of the Arduino board obviously.
Step 1: MS70 Arduino Midi Program Change
material:
1. arduino UNO - chinese one they're cheaper
3. two momentary spst footswitches (or more than two depending on which example you'll take)
4. spare electrical cable
5. a box to fit all
6. a usb cable between usb shield and Zoom pedal + another one to program the arduino (different type)
7. spare arduino's male pins
8. nine to twelve volts transformator (positive center pin) for the Arduino
9. ZOOM MS70-cdr obviously / with its own power supply (negative center 9V.)
tools:
1. soldering device
2. iron
3. drilling tools if you want to fix all in the box
4. some hot glue always help!
5. Arduino simulator free @ https://www.tinkercad.com (optional)
.
Step 2:
Solder cables with the male pins and the instant switches (see schematic), the choice of the pins is yours just adapt the code and send it thru your Arduino ide (mine is version 1.8.5). Pay attention that these chinese Arduinos need a proper driver.
Connect the usb host to your Zoom pedal, it doesn't need proper power when connected to USB but it's less noisy .
Plug your Arduino board to power transformer (wait a moment)
Test all the thing, it must do work! If not, check out all cables and wiring.
.
Step 3:
if it works disconnect it all, fix it all in your case (some drill work needed here)
drill a hole for power plug and another for the usb host, ensuring that it all fits in your box before.
Don't forget to drill holes for your switches, except if you plan to make'em externals...
I suggest to put a little hot glue on the soldered males pin and to NOT solder anything directly on your Arduino board.
.
Step 4:
Upload the exemple code here below but pay attention that they are two different schematics as two different projects like exemples... Connect it all again and enjoy!
You normally do have in the exemple 1 below, one switch to increase preset and another to decrease . For any other kind of controls just adapt your ino sketch. If you need help just ask.
------------------------------------------------------------------------------------
Arduino example code (see below):
added: the sketch named MS70_4patches_2banks is an example suggested by a follower that involved 4 switches (4 patches) and 1 switch to select bank A or B, by ex: 1 to 4 = A / 5 to 8 = B.
Just adapt code to hardware (pin numbers etc...)
------------------------------------------------------------------------------------
Step 2: Personal Links of Interest
check out the most outstanding band I actually play on !

Participated in the
Microcontroller Contest 2017
46 Comments
Question 5 months ago
I want to adapt your code to do a project using Arduino to send MIDI over USB to a Boss GT-1. I just want to turn effects on and off, stomp box style. That would normally be MIDI continuous controller (CC) messages.
I don't know if standard MIDI messages in some library will do the job, it may be that every control action for the GT-1 has to be accomplished using MIDI System Exclusive messages which are 15 bytes long.
I have accomplished the control I want using Bome's SendSX program in Windows sending the 15 byte Sysex messages to the GT-1 over a USB connection, but have had no luck using standard 4 byte MIDI messages.
Do you know if the libraries and methods you used here would support 15 byte messages?
Thanks in advance for any info or project guidance you can provide!
Answer 5 months ago
Sure, Artie !
Firstly, there 's no need to add any library in the sketch above. It is suited to work without! The only thing to do is add some bytes that can be interpreted as sysex by your gt-1( fifteen in your case)...
The first one is for starting sysex message and the last one for ending.
The structure would be like:
void midiProg(byte byte var1, byte var2, etc...)
//pay attention that it maybe needs less & more variables...
{
Serial.write(0xF0 1st byte); //sysex start message
Serial.write(0x second byte);
Serial.write(0x third byte);
Serial.write(0x etc...);
...
//--> until the last byte wich normally is sysex end of message
Serial.write(0xF7 last byte); //end of message
}
I don't know particulary about the sysex of your device but it's normally all indicated in the manual or its midi map.
I hope it will help you, if not, feel free to ask.
Cheers! CarraN
Reply 5 months ago
Thanks for the quick response! This is great, and I can't wait to get started with this project.
Do you know if there are any US domestic sellers for that or some other USB host module using the 24FJ64GB002 microcontroller that would work? Just looking for closest/cheapest, but if Hobby Tronics is the best option I'll go for that.
Reply 5 months ago
I'm going to order the Hobby Tronics host module. I select the "MIDI Device" as the preinstalled software option, correct?
Also going to try this with a Nano, the enclosure I want to use is fairly small, only 3 momentary switches will be used.
Reply 5 months ago
Exactly! Actually I'm not living in the US so the only ones I know they deal it are the english Hobbytronic.
Reply 4 months ago
Just a followup, I completed the project and it works great!
I'm thinking of expanding it to receive messages from the GT-1 and update the LEDs status. If I succeed I'm thinking about making an Instructable for it.
3 years ago
Can you control boss me 25?
Reply 3 years ago
Hi !
not tested but probably yes...
Question 3 years ago
Hi! So which code am I going to upload to my UNO? Sorry, I'm a bit Slow.
Question 5 years ago on Step 1
Hi, I've realized your arduino based controller for Zoom ms70cdr, and it works great!
I was wandering if it could be "expanded" with more functions. Unfortunately I'm not a programmer, and I don't know how to modify Arduino code to add more switches.
Is it possible to recall a specific patch instead of slide one step up/down?
I've seen a project where you got 4 stomp - like the two in your project - to recall 4 different specific patches, and another stomp (3pdt?) to switch between bank A/B, so you can have 8 patches to recall.
Answer 5 years ago
Hi!
yes it could be used as an example but more important it sould be used to expand it, depending on the kind of arduino you choose and the final project you want ! In your case it's very simple to do, the key of the code are the program change numbers and which switch act to change 'em. If you own a Uno you can built until 17 switches and choose what you want they do. Theorically you can even built an arduino based programmer but I don't recommend you to do it at this stage, more skills are needed!
Feel free to ask for more if it's too general...
edit:
your code->
int presetSwitch[] = {14,15,16,17}; // presets 1 to 4
const int rangeSwitch = 18; // add or disminish +4 (range)
int range = 0;
int programChangeValue = 0; // if you want to begin from preset 1
int dlay = 100; // adjust this to taste
/******************************************************/
void setup()
{
for(int i=0; i<5; i++)
{
pinMode(presetSwitch[i], INPUT_PULLUP);
}
pinMode(rangeSwitch, INPUT_PULLUP);
Serial.begin(31250); /* for midi communication - pin 1 TX */
}
/*********************************************************/
void midiProg(byte pcNum)
{
Serial.write(0xC0); //midi program change status
Serial.write(pcNum);
}
/*********************************************************/
void rangeValue() //select presets 1 to 4 or 5 to 8
{
if (digitalRead(rangeSwitch)!= HIGH)
{
range = range +4; // add 4
if(range >4)
{
range = 0; // minus 4
delay(dlay);
}
}
}
/*********************************************************/
void loop()
{
rangeValue();
for(int i=0; i<5; i++)
{
if(digitalRead(presetSwitch[i])!= HIGH)
{
programChangeValue = programChangeValue + i + range;
midiProg(programChangeValue);
delay(dlay);
}
}
}//end
cheers
Answer 5 years ago
Great! Thank you so much!
The board I'm using is the one you linked into your instructable, with the usb shield from hobbytronics.
In order to "miniaturize" it all I was wandering if this board can be used instead of the UNO:
https://www.aliexpress.com/item/MINI-USB-Nano-V3-0...
About the code you sent me:
I have to copy/paste this code into Arduino IDE and Load to the board, right?
Just a question: this setup will let me select between 1,2,3,4 patches WITH bank a/b switching?
so it will be: BANK A - Patch 1,2,3,4 / BANK B - Patch 1,2,3,4
I'll attach an incomplete image of PIN Usage: is it necessary to use a 3pdt (or 2pdt) for bank switching, or a soft touch 1spst like the other 4 can be mounted using only pin 4?
I was thinking about 3pdt or 2pdt to insert a led that gives you visual feedback about the bank you are using, but maybe this can be done from the arduino board...
Thank you so much!
Answer 5 years ago
Hi!
sure you can use other Arduino boards including the nano one and it's simple as with the UNO to upload the sketch. Pay attention to select the right board in your IDE. The banks are disposed as 1 2 3 4 and 5 6 7 8 depending on how many times you push down your "soft touch switch" like you say. By default, there are 1 2 3 4 selected but it's up to you by changing the value of
int programChangeValue = 0;
You can also add leds, here is the sketch:
/******************************************************/
int presetSwitch[] = {14,15,16,17}; // presets 1 to 4
const int rangeSwitch = 18; // add or disminish +4 (range)
const int patchLed[] = {2,3,4,5}; //led per patch
const int bankLed = 6; // led for bank on/off
int range = 0;
int programChangeValue = 0; // if you want to begin from preset 1
int dlay = 100; // adjust this to taste
/******************************************************/
void setup()
{
for(int i=0; i<4; i++)
{
pinMode(presetSwitch[i], INPUT_PULLUP);
pinMode(patchLed[i], OUTPUT);
digitalWrite(patchLed[i], LOW);
}
digitalWrite(bankLed, LOW);
pinMode(rangeSwitch, INPUT_PULLUP);
Serial.begin(31250); /* for midi communication - pin 1 TX */
}
/*********************************************************/
void midiProg(byte pcNum)
{
Serial.write(0xC0); //midi program change status
Serial.write(pcNum);
}
/*********************************************************/
void rangeValue() //select presets 1 to 4 or 5 to 8
{
if (digitalRead(rangeSwitch)!= HIGH)
{
range = range +4; // add 4
digitalWrite(bankLed, HIGH);
if(range >4)
{
range = 0; // minus 4
digitalWrite(bankLed, LOW);
delay(dlay);
}
}
}
/*********************************************************/
void clearAllLeds(int except)
{
for(int j=0; j<4; j++)
{
digitalWrite(patchLed[j], LOW);
digitalWrite(patchLed[except], HIGH);
}
}
/*********************************************************/
void loop()
{
rangeValue();
for(int i=0; i<4; i++)
{
if(digitalRead(presetSwitch[i])!= HIGH)
{
programChangeValue = programChangeValue + i + range;
midiProg(programChangeValue);
clearAllLeds(i);
delay(dlay);
}
}
} //end
/******************************************************/
cheers
Reply 3 years ago
Oi CarraN, è possivel usar esse codigo como base para um loop de 8 pedais com display como ha em outro post seu?
gostaria de em vez de 8 botoes para selecionar usar somente esses 4, e alternalos atraves do botao bank.
desde ja agradeço
3 years ago
Hi, Nice work and thanks for sharing.
a couple of questions...
I've bought a USB host shield and I assume there's no need to connect 5V/GND but no idea how to deal with the TX (I have zero arduino knowledge)
Do you have any photo of your project before any assembly? so I can take a look at the connections.
Thank you
PD> I'm starting with the increase/decrease example
Reply 3 years ago
Hi, please see my new instructable
https://www.instructables.com/id/USB-Arduino-Midi-...
Hope it will help. cheers
Reply 3 years ago
ok. It seems you don't use the hobbytronic USB field in this instructable. It seems that's field's discontinued too...
Try to contact Laurence @ http://arduino-midi-control.boards.net/board/4/zoo...
He'll give you all the information required. Cheers.
Reply 3 years ago
Hi Carranen,
Went there at Lawrence's forum but seems like a dead thread. What happened to your project?
Reply 3 years ago
My project involves a shield that is (apparently) not available anymore, sorry. I let it for those who already own it. Just in case it seems that Kenton done it to sell :
cheers
Reply 3 years ago
https://www.hobbytronics.co.uk/usb-host-board-v24