Korg Pandora STOMP MIDI reverse engineering

7 Flares Twitter 6 Facebook 1 Google+ 0 LinkedIn 0 Email -- Filament.io 7 Flares ×

I am a lucky owner of a cheap but powerful Korg Pandora STOMP multieffect for guitar. This is an awesome one-footswitch with great effect chain modeling software.

This device is a low cost solution for house productions, but Korg provides it with a great MIDI interface (mini USB standard MIDI) and WIN/MACOS drivers and tools for desktop modeling and program writing.

That’s the intro of this article. The subsequent part is what Korg doesn’t provide with the device and what I would like to do…

Korg doesn’t provide any MIDI reference table and nothing is said in official forums about MIDI System Exclusive commands that are mainly used by Pandora speaking with the desktop tool. So I am going to do some reverse engineering based on:

The purpose of this work is to have a map of MIDI commands for the stomp so to can build a custom pandora editor or maybe a homebrew stage pedal footswitch based on Raspberry Pi 2
Who knows?

At the moment I’ve just started with some sniffed data.

Device Identity

I sent the following midi system exclusive data to the device, based on the great work of Frédéric Jaume for the Pandora PX5D:

F0 7E 7F 06 01 F7

This 6 bytes file asks Pandora to identify itself. The device answers with a standard 15 bytes file that contains every informations about it:

F0 7E 00 06 02 42 0F 01 08 00 00 00 01 00 F7

It can be segmented by the schema:

F0 7E cc 06 02 id fc1 fc2 fn1 fn2 v1 v2 v3 v4 F7
cc: channel
id: device's ID
fc1 fc2 - device's family code
fn1 fn2 - device's family number
v1 v2 v3 v4 - device software version

So my Pandora STOMP has the following identity:

channel = 00
device Id = 42
family code = 0F 01
device number = 08 00
software version: 0.0.1.0

Moreover I sniffed the simple memory bank loop switch (from A to D) obtaining the following triplets of bytes:

Memory Banks from A a D:
 TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT
 0069D1E5   1  --     B0    00    00    1  ---  CC: Bank MSB
 0069D1E5   1  --     B0    20    00    1  ---  CC: Bank LSB
 0069D1E5   1  --     C0    02    --    1  ---  PC: Elec Grand Piano

 0069D5C5   1  --     B0    00    00    1  ---  CC: Bank MSB
 0069D5C5   1  --     B0    20    00    1  ---  CC: Bank LSB
 0069D5C5   1  --     C0    01    --    1  ---  PC: Brite Acc. Piano

 0069D90D   1  --     B0    00    00    1  ---  CC: Bank MSB
 0069D90D   1  --     B0    20    00    1  ---  CC: Bank LSB
 0069D90D   1  --     C0    0B    --    1  ---  PC: Vibraphone

 0069DB9E   1  --     B0    00    00    1  ---  CC: Bank MSB
 0069DB9E   1  --     B0    20    00    1  ---  CC: Bank LSB
 0069DB9E   1  --     C0    10    --    1  ---  PC: Drawbar Organ

And from 0 to 9 memory banks (my preferred memory loop):

Memory Banks from 0 a 9:
 TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT
 00791EC3   1  --     B0    00    00    1  ---  CC: Bank MSB
 00791EC3   1  --     B0    20    00    1  ---  CC: Bank LSB
 00791EC3   1  --     C0    0A    --    1  ---  PC: Music Box         

 007921F4   1  --     B0    00    00    1  ---  CC: Bank MSB
 007921F4   1  --     B0    20    00    1  ---  CC: Bank LSB
 007921F4   1  --     C0    0B    --    1  ---  PC: Vibraphone        

 00792466   1  --     B0    00    00    1  ---  CC: Bank MSB
 00792466   1  --     B0    20    00    1  ---  CC: Bank LSB
 00792466   1  --     C0    0C    --    1  ---  PC: Marimba           

 007928F1   1  --     B0    00    00    1  ---  CC: Bank MSB
 007928F1   1  --     B0    20    00    1  ---  CC: Bank LSB
 007928F1   1  --     C0    0D    --    1  ---  PC: Xylophone         

 00792D4F   1  --     B0    00    00    1  ---  CC: Bank MSB
 00792D4F   1  --     B0    20    00    1  ---  CC: Bank LSB
 00792D4F   1  --     C0    0E    --    1  ---  PC: Tubular Bells     

 00792FD3   1  --     B0    00    00    1  ---  CC: Bank MSB
 00792FD3   1  --     B0    20    00    1  ---  CC: Bank LSB
 00792FD3   1  --     C0    0F    --    1  ---  PC: Dulcimer          

 00793298   1  --     B0    00    00    1  ---  CC: Bank MSB
 00793298   1  --     B0    20    00    1  ---  CC: Bank LSB
 00793298   1  --     C0    10    --    1  ---  PC: Drawbar Organ     

 007936AF   1  --     B0    00    00    1  ---  CC: Bank MSB
 007936AF   1  --     B0    20    00    1  ---  CC: Bank LSB
 007936AF   1  --     C0    11    --    1  ---  PC: Percussive Organ  

 00793B5E   1  --     B0    00    00    1  ---  CC: Bank MSB
 00793B5E   1  --     B0    20    00    1  ---  CC: Bank LSB
 00793B5E   1  --     C0    12    --    1  ---  PC: Rock Organ        

 0079407A   1  --     B0    00    00    1  ---  CC: Bank MSB
 0079407A   1  --     B0    20    00    1  ---  CC: Bank LSB
 0079407A   1  --     C0    13    --    1  ---  PC: Church Organ

You can use theese informations for creating a MIDI controller mapping file (basically an XML config file) for many programs like MIXXX, etc., but I don’t think it can be useful for me.
I will use them later when I will create my own software midi controller.

 

What’s next…

After the 15 bytes standard recognition file, Pandora continues to answer the identity request with a serie of 16 more files, for a total of 432 bytes that I really don’t know and that are the purpose of my next investigation…
I will periodically update this document with news on it.

update 2015-05-07

Still learning MIDI protocol: MSB and LSB and triplets. Now I have the complete MIDI map of Pandora programs, and can send MIDI commands to the device for changing the program from 000 to 399. Stay tuned!

update 2015-05-09

Korg Pandora Stomp and Raspberry Pi 2
Korg Pandora Stomp and Raspberry Pi 2

It’s time to connect them (Pandora and Raspberry Pi) and to see what happens. I hope the midi connection would work. Next steps are:

  • to test MIDI connection between Pandora and Raspberry
  • to receive MIDI data from Pandora and print them on screen
  • to send MIDI data to the Pandora for changing memory programs (simple midi triplets)

If everything will work, I’m going to write a simple python program which read and write MIDI data fron/to the Pandora. After that I will try to send midi data from the switch connected on the GPIO on the Raspberry (just a predefined midi triplet at switch ON). Then… stay tuned!

update 2015-05-10

Pandora and Raspberry finally connected!
Pandora and Raspberry finally connected!

Ok, now I think to have everything I need for the prototype: a simple ONE button switch for selecting a predefined memory bank (016). I have made my first connection between Python, Raspi2 and Pandora, via USB-rtmidi-GPIO.
The following is the python program to send bank change (program 016) command to the Pandora when a switch is ON:


#! /usr/bin/python

#libraries for MIDI and for the GPIO unit
import time
import rtmidi
import RPi.GPIO as gpio

# using the BCM number set
gpio.setmode(gpio.BCM)
# switching off the warnings
gpio.setwarnings(False)
# GPIO3 (led port) initial OUTPUT status OFF (1)
gpio.setup(3, gpio.OUT, initial=1)
# GPIO4 (switch port) listening to the INPUT pull up/down status
gpio.setup(4, gpio.IN, pull_up_down=gpio.PUD_DOWN)
# led initial blinking: off
blinkingled = False
# midi out setup
midiout = rtmidi.MidiOut()
# retrieving midi ports (0 is the default system midi, 1 is Pandora)
available_ports = midiout.get_ports()

# opening up the midi port if available
if available_ports:
	midiout.open_port(1)
else:
	midiout.open_virtual_port("My virtual midi")

# main function
def state_change(pin):
    global blinkingled
    global midiout
    if blinkingled:
        blinkingled = False
        gpio.output(3, 1)
    else:
        # turning off the led blinking
				blinkingled = True
        gpio.output(3, 0)
				
				# changing memory bank to the Pandora
        control1 = [0xb0, 0x00, 0x00] #MSB
        control2 = [0xb0, 0x20, 0x00] #LSB
        control3 = [0xc0, 0x10] #PC (Program Change)
        midiout.send_message(control1)
        midiout.send_message(control2)
        midiout.send_message(control3)

# Interrupt - VERY IMPORTANT! - binding the GPIO4 events to the state_change function
# bouncetime is useful for avoiding sending not correct switch values
gpio.add_event_detect(4, gpio.RISING, callback=state_change, bouncetime=200)

# just an echo out
print("Ready!")

# infinite loop!
while 1:
    # if blinkingled is TRUE
		if blinkingled:
        # if GPIO3 Input is 1 (led off)
				if gpio.input(3):
            # turn on the led!
						gpio.output(3, 0)
        else:
            # turn off the led
						gpio.output(3, 1)
    # wait 500 milliseconds (that makes the led blinking!)
		time.sleep(0.5)


You can see how this program works in this small video:

Stay tuned!

update 2015-05-13

Today I received the 10 footswitches (3PDTs). It’s time to build the prototype.

3DPT footswitches
3DPT footswitches

update 2015-06-16

Had not much time for the project and components are delaying their delivery (something from China is taking over 1 month for shipping). But I finally built the prototype (8 command switches + 1 switch for the Raspi shut off).

prototype with 9 push buttons
prototype with 9 push buttons

In this picture you can see some free cables at the bottom ready for the 16×2 LCD screen. Next time I will post the logics.

7 Flares Twitter 6 Facebook 1 Google+ 0 LinkedIn 0 Email -- Filament.io 7 Flares ×

5 Replies to “Korg Pandora STOMP MIDI reverse engineering”

  1. Hi friend,
    I have a Kenton midi USB host and an fcb 1010 midi foot controller.
    Plugin in Pandora stomp i will GO change the presets?

    1. Hi Francisco,
      I think I have not understood your question: you would know if plugging in the Pandora to your foot controller by the USB host you will have to change the presets on your midi foot controller. Is it?
      If so, I don’t know the answer, because I don’t know your controller, but I think that the Pandora Stomp will work with your set without many changes. I am not sure about this because I base my opinion just on the specs of the Pandora and on experiences of users that could successfully plug it in many midi controllers without problems.
      Let me know if I wrong the sense of your question, and apologize me!

    2. Hi gianpa,
      Tranks for your reply.
      Some peoples use the Kenton midi USB host for translate original midi messages into USB, thank sent to zoom g3, B3, MS 50 g or MS 70 cdr without any customization is fully plug and play.
      My doubt is if the Pandora stomp run only with custom code or any translated midi can chance the presets.
      Thank you man,
      Regards from brazil

      Congrats for your site 😉

    3. One more question, Pandora is a class compilant device?

  2. Hi Gianpa!

    Im working on very similar project with my pandora px5d. i fund a very useful control library for it at github (https://github.com/soulfish/px5deditor). Maybe it is will be helpful to you too.

    Im using raspberry pi and arduino leonardo to make a “real” hardware to control effects.

    Good luck!

    Janos

Leave a Reply

Your email address will not be published. Required fields are marked *