MIDI Pod-Pal


Introduction: MIDI Pod-Pal

About: Electronics tech, musician, frustrated computer user!

I won't go into a ridiculous amount of depth here on the build part, my intention was to show another example of building an Arduino based MIDI controller if you are researching the topic or thinking about building something and gathering ideas. My application is fairly specific for the Line 6 Pod 2.0, but with some code tweaking can be made more broadly applicable.
There are several guitar effects processors with MIDI capability that arrange their presets in banks of 4. I play guitar in a contemporary worship service. The church owns a Line 6 Pod 2.0 modelling processor that sits on the floor and has no foot switches to change presets or pedal to control volume. There are several existing controllers on the market. The Behringer FCB1010 is a great solution for about $150 but takes up more stage floor space than I would prefer. And besides, what fun is that? I knew I had to try and build one. And... I managed to succeed!

Step 1: Basic Hardware Info

Chassis: I "re-purposed" a "ZvBox 160" HDMI modulator that was shot. Nice sturdy steel construction, should survive the zombie apocalypse. Gutted it, laid out the parts, made measurements. I then created a combination drill template/front panel label in Photoshop. I printed the label on a full page adhesive sheet and added an adhesive laminated sheet overlay. See the midi_con_faceplate.psd. Box dimensions are 1.7" H x 10.5" W x 4.75" D (4.32 cm H x 26.67 cm W x 12.07 cm D)

Controller: Arduino Mega 2560 clone made by Sainsmart.

Display: Kingbright model DC08-11SRWA.

Foot Switches: what I had laying around. SPST momentary, normally open. guitarpedalparts.com has 'em for $3.

LEDs: two color, common cathode. Green and Blinking Red.

Assign switches: small SPDT, action is ON-OFF-(ON). Mouser part # 611-7107-001.

Output jack: Rean NYS2122 TS 1/4".

Pedal: passive 10k linear taper pot type. I used the Line 6 EX 1; M Audio EX-P and Roland EV-5 supposedly will also work. See the image for the pedal circuit schematic detail.

Resistors: 10K for pull-up on switches(QTY: 8); 220 Ohm for MIDI jack (I used 2, one may suffice); 220 Ohm for LEDs(QTY 8); 2.2K for expression pedal jack (QTY: 1).

Chassis mount DC jack. Mouser part # 502-712A.

Step 2: ​Features/behavior:

Foot switches labelled "A" through "D" select the 4 presets within a bank. The other 2 foot switches increase and decrease the Bank number. When changing banks, the last used preset button's corresponding LED flashes until you either select a preset on the new bank, or return to the original bank.

2 momentary toggle switches allow user to assign MIDI channel and continuous controller (CC) numbers. Only CC 1, 2, 4 and 7 can be selected (setup in the Arduino code, but can be expanded) but they are the most commonly used ones. There are 9 banks on the POD 2.0, the controller accesses all 9 but also include a special bank 10. 10-A toggles the tuner on and off, 10-B selects wah mode for the pedal. Either 10-C or10-D will turn off wah and revert back to the user assigned CC number.

The default is CC7 for volume. The LED display shows current bank number, and momentarily show MIDI channel and CC numbers when assigned.

Step 3: The Code:

Here's the code. I've attempted to keep it organized and included plenty of comments. Please use, reuse, abuse or confuse as needed.

You will need to include the MIDI library from FortySevenEffects at github.com.

Step 4: That's It!

Please feel free to contact me if you have any questions. I'm no code guru, but I'd be glad to offer suggestions or ideas.



    • Water Contest

      Water Contest
    • Oil Contest

      Oil Contest
    • Clocks Contest

      Clocks Contest

    4 Discussions

    ArtieJ my code is quite simple, I make using Att85/Digispark AT85, here my code, I'm going back to desk to add the new code. Thanks

    //Arduino IDE Code for sending up/down MIDI signals to a Line 6 POD 2.0 with an ATTiny85

    //tested but offered 'as is' without support

    //SoftSerial instead SoftwareSerial only if using Digispark

    #include <SoftSerial.h> //Microcontroller is an ATiny85 so using the SoftwareSerial library

    SoftSerial mySerial(2,3); //RX =2, TX = ATTiny85 pin 2, PB3; MIDI transmit pin

    byte status_byte = B11000000; //Status number 192 for program\bank change, hex = C0

    byte count_val = 38; // Set a start variable at 38 to avoid 'rollover' error when moving down\up patches

    // MIDI send function

    void send_byte(byte value) {

    byte patch_value = value % 37; // Set patch_value= 0 to 36 (0 is manual)

    // Re: Rollover, Byte type is unsigned, Binary 0 minus 1 is B11111111(255), and 255 mod 37 is 33. Hence the following count value reset

    if(patch_value == 1) count_val = 38; //reset count_val to avoid rollover error

    mySerial.write(status_byte); //send status byte

    mySerial.write(patch_value); //send patch value byte

    delay(500); //wait (simple debounce and pause)


    void setup() {

    DDRB = B00001000; //Set PortB direction, in on PB0 and PB1 out on PB3

    PORTB = B00000011; //Switch on internal pull up resistors

    mySerial.begin(31250); //set MIDI baud rate (NB: Microcontroller fuses set to 8Mhz internal clock)

    send_byte(count_val); //Send an initial start value, = Patch A1


    void loop() {

    byte readpins = PINB | B11111100; //read pins once per loop, unpressed switch with pullups = 1 so bitmask applied to unused bits will always TRUE

    if (~readpins){ //Switches have pull-ups, ~readpins will return TRUE when one is pushed

    byte switch_val=~readpins; //inverse of inputs

    switch (switch_val) {

    case B01: //Switch PB0 on

    {count_val-- ;



    case B10: //Switch PB1 on

    {count_val++ ;




    One doubt, how I can map the button TAP code in MIDI, I make one simple version of your MIDI, for up/down buttons starting in A1 <-> A2... and I 'd like add other controls like TAP and tunner. Thanks

    1 more answer

    The Line 6 MIDI CC reference chart says Tap button is CC 64, with values 64 - 127 = a Tap.
    So you could just add a new momentary switch and define an input for button use, call it btnTAP, then send a MIDI CC message for the tap command. So to my sketch you would add something like:

    if (digitalRead(btnTAP) == HIGH{
    // check button state
    delay(10); // software de-bounce
    if (digitalRead(btnTAP) == HIGH{
    midiOut.sendControlChange(64, 127, midiChan);

    You can do similar for the tuner, use CC 69 with 0 for off and 127 for on.

    The PC (Program Change, not Control Change) number 37 will also enable tuner mode, something I discovered by accident.