Arduino Based ZOOM MS70-cdr Midi Program Changer

Published

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. 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

2. USBHOST2 from Hobby Tronic

3. two momentary spst footswitches

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 (tested with boss GP-10 but doesn't work!)

tools:

1. soldering device

2. iron

3. drilling tools if you want to fix all in the box

4. some hot glue always help!

.

Step 1:

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.

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 2:

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 3:

connect it all again and enjoy!

You normally do have 1 switch to add plus one preset, and 1 other to minus . 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, by ex: 1 to 4 / 5 to 8. Just adapt code to hardware (pin numbers etc...)

------------------------------------------------------------------------------------

Step 2: Personal Links of Interest

check out some outstanding bands I play with

Cosmic Rain

ZeK

Share

    Recommendations

    • Creative Misuse Contest

      Creative Misuse Contest
    • Clocks Contest

      Clocks Contest
    • Water Contest

      Water Contest

    7 Discussions

    Hi CarraN, I've used the first code and it works great!

    So I've tried to do another step using the second code (4 patches 2 banks) but it doesn't work: I've uploaded the code on my arduino board as it is, using the same connection scheme you've posted for the original instructable, simply adding another three buttons connected to pins A2, A3, A4.

    Every button just let you increase the patches up in number. I've checked connection many times and everything seems to be right, if I swap back to the "first version" of the code it works.

    Maybe I have to change something in the code?
    Many thanks!

    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.

    3 more answers

    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

    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!

    Schematic-Patch-Switcher.jpg

    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