Korg Pandora STOMP MIDI reverse engineering

0 Flares Twitter 0 Facebook 0 Google+ 0 LinkedIn 0 Email -- Filament.io 0 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:

[code lang=”plain” padlinenumbers=”false”]
F0 7E 7F 06 01 F7
[/code]

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

[code lang=”plain” padlinenumbers=”false”]
F0 7E 00 06 02 42 0F 01 08 00 00 00 01 00 F7
[/code]

It can be segmented by the schema:

[code lang=”plain” padlinenumbers=”false”]
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
[/code]

So my Pandora STOMP has the following identity:

[code lang=”plain” padlinenumbers=”false”]
channel = 00
device Id = 42
family code = 0F 01
device number = 08 00
software version: 0.0.1.0
[/code]

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

[code lang=”plain” padlinenumbers=”false”]
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
[/code]

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

[code lang=”plain” padlinenumbers=”false”]
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
[/code]

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:

[code lang=”python” padlinenumbers=”false”]

#! /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)

[/code]

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.

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