(Solved) Programme change vs Hex Data problem


I use an HX3 Hammond module (an amazing piece of kit but I won’t dwell on that right now!) and control it and other sounds through Cantabile with my Hammond-Suzuki XK3 set up. Everything works as it should except for one thing - changing presets in the HX3 module. The inverse keys on the XK3 change ‘voices’ without issue but apparently a full preset change (voice + generator type, pre-amp bypass and so on) expects a message in Hex Data Format, so my question is can this be done in some way using Cantabile filters?

I received this reply from the HX3 guys:

All codes are HEX Data Format !
After the command $ C follows n = the Midi channel
Upper manual is 00 < > channel 1 ( its binary counting )
Lower manual is 01 < > channel 2

Then follows the preset number :
00 first preset (LIVE)
to 7F

So You have to send two bytes to change the preset in a manual
The HX 3 accepts for each manual 16 presets ( decimal counting 0 - 15 )
Even " 0 " is LIVE chose (real drawbars )

If I look at the Midi Monitor in Cantabile when I press one of the inverse keys it shows a programme change e.g. PC7 PC(banked)7. How can I get this to send the necessary Hex code to the module to change the preset and not just the voice. All the controls on the XK3 send NRPN stuff but the HX3 is programmed to deal with those just fine.

I’m hoping someone much more knowledgeable than me might have a suggestion?



Hmm, looks like they didn’t quite answer your question - fact is that $Cx command is identical to MIDI program change! If you want to send program change 7 on channel 5, this is hex C4 06. So, according to the HX3 team, if you want to call the first preset on manual 1, simply send program change 1 (or 0, depending how you configured Cantabile).

But this does not do what you want (i.e. recall a “full preset”) - these presets are specific to upper and lower manual, so I understand that these are drawbar presets and do exactly the same as the reverse keys. The HX3 team didn’t really tell you how to recall full presets, but how to select drawbar presets.

I had a look at the HX3 wiki - it says:

Bank Select on HX3.5

HX3.5 will handle MIDI Bank Select Commands as “Set Overall Preset” (valid numbers range from 0 to 15). Overall Presets include all Tab settings and additional pots (volume, reverb amount etc) as well as the drawbar voice number. Note that some MIDI keyboards will send a MIDI Bank Select command separately, others will issue a MIDI Bank Select only with a MIDI Program Change. In the latter case, the issued MIDI Program Change command will override the voice setting.

The easiest way to send a bank select in Cantabile is to send a “banked program change” - but that also requires selecting a drawbar preset.

To send a banked program change, create a song–>OnLoad (or SongState–>OnLoad) binding:

This means that on loading this song, Cantabile will send first Bank Select 2, then afterwards Program Change 10, so your HX3 will load overall preset 2, then drawbar preset 10. You’ll have to check which MIDI channel works - the Wiki doesn’t say…

Hope this helps!




Thanks for your detailed reply, Torsten. Sadly, it hasn’t worked. It does select the drawbar settings but not a complete preset. I tried routing from my Mixface midi controller as well in case it’s just a problem from the XK3 but with the same result - voices, but no preset.

The presets do select from Keystrokes (F1, F2 etc.) without issue but there’s no built-in filter in Cantabile for this conversion and Bome Translator midi-to-keystroke is too erratic to be a safe method for preset change.

I’ll contact the HX3 people again because it may be a bug in the latest firmware, of course.

Thanks again and any further ideas will also be welcome!



Have you checked with a Midi Monitor on the route that Cantabile actually sends the bank select? Alternatively, use MIDI-Ox to send bank select commands directly to your HX3 to test what works (work your way through MIDI channels):


Just to make sure it’s not a Cantabile issue - check that your HX3 actually works as reported in the Wiki…


This is what I see in Cantabile’s Midi Monitor (I just pressed the first four reverse keys). I can’t use MidiOX and have the HX3 editor/Cantabile open at the same time. I’ll have to reconnect things to test this properly.


OK, first I only see you making program changes in bank 0 (0 will not be displayed) - this will not change your full preset. To change full presets, you need to send a program change to a different bank. In Cantabile’s syntax, the logic is “bank.program”, so you’ll need to send a program change to 2.1 or 3.1 - this will first send a bank select to bank 2 or bank 3 before sending PC to 1. If your HX3 reacts to bank select, this should do it.

Alternatively, try sending the bank select controller directly instead of using banked PC: bank select is MIDI CC 32 - so if you send CC32 with value 5, this should set your full preset to 5.

Check out if that works - hope it does!





Well, despite your best efforts to help me I still haven’t managed to get the HX3 to see any bank/preset changes. I tried going directly from my Mixface (and setting the HX3 to see the standard NI B4 midi changes in case that was a factor) but the result was the same.

I’ll now go back to the HX3 guys and ask for a specific example of the data that the HX3 expects to see to change presets. Maybe it’s a bug in the current (beta) firmware.

I’ll report back if/when I make any progress but thanks again for your input.



A bit more advice needed now… Here is the reply from the technician at Keyboardpartner:

First in HX 3.5 version You must define what kind of preset You want.
You can chose it as drawbar preset like in Hammond or as "over all preset " which means
that other funktions like reverb or percussion is stored too
This procedure You must define for each preset separatly
For each keyboard has own presets You must do this same way for the other keyboard and it´s
For switching via MIDI You must send for the 1st preset
the code
C0 01 = C the code for programmchange , 0 for Midi Channel 1 = upper manual , 01 for first preset

C1 01 = C the code for programmchange , 1 for MIDI Channel 2 = lower manual , 01 for first preset

Same for upper with preset 3 and lower with preset 5 :

C0 02 upper manual
C1 04 lower manual

If You use preset code " 00 " You will get in this manual the " LIVE " drawbars

If YOu only want to change in upper manual so only use the codes for upper manual ( C0 xx )
If you want to change both presets in the manuals You have to send
C0 xx for upper and C1 yy for lower manual

Please check out if Your Keyboard sends the bank command too
Bank Code is B n followed by two bytes which bank is activated ; n = midi channel see above

If there a bank command exsists be sure that bank 0 is sended, for HX 3 only has 16 presets each manual, so no need for any bank command. The 16 presets of HX3 are located in bank 0. If no bank command is sended bank 0 is automaticly actual.

I’m sure this is all very correct but my problem is how to send the necessary code to the HX3 via my XK3 or Mixface using ‘normal’ midi commands (well, normal to me at least!). Both my controllers are routed through Cantabile and the HX3 receives all the other commands without problem so I’m certain my routing is ok.

I’ll try and figure this out but naturally any help will be very welcome again!



Hi Paul,

again - what tech support is sending you are “normal” commands, just in their hex equivalent. There is no problem in sending out these commands - what is described in your post are simple Program Change commands. C0 02 means Program change 2 (or 3) on channel 1, C1 04 means Program Change 4 (or 5) on channel 2. That’s it!

What is incorrect in their message to you: Bank select isn’t simply Bn and two bytes - hex Bn is Control Change. For Bank Select, there are two Control change commands: CC 32 for LSB (least significant bits) and CC0 for MSB (most significant bits). This is due to the fact that CCs can send only 7 bit messages, and synths may have more than 127 banks. Therefore the MIDI spec allows for bank numbers to be combined: MSB*128+LSB = bank number. As long as bank numbers are lower than 128, sending LSB is usually enough - so sending CC32->5 will select bank 5.

What confuses me is that Keyboardpartner state that bank select should always be 0 - which contradicts the statement from the Wiki above (that states that bank select can choose full presets). Not sure who is right here…

What I read from the message above is that - according to Keyboardpartner - for every preset, you can choose if it is a drawbar preset or a full preset (including percussion, reverb, …). Once you have set it to be a “full preset”, it should (according to KP) be selectable via program change.

Maybe you can find someone else who actually owns a HX3 and can contribute from experience - at this point, I can only speculate…




Finally got this working! After more contact with the HX3 guys it turns out that they had to do a firmware update because the HX3 just wasn’t seeing any midi preset/programme changes. It then worked with my Mixface which can be programmed easily to send msb/lsb midi changes.

The XK3 organ controller sends its own weird NRPN messages and not straightforward banked progamme changes. Cantabile to the rescue! I finally figured out how to use a binding to convert incoming XK3 programme changes from the inverse keys and output the appropriate msb/lsb numbers:

Seemed simple in the end once I’d achieved it! Still, it took a while for the HX3 guys to realise there was a problem with the firmware. Good thing I don’t have any hair left to pull out :slight_smile: