Program Change, MSB Bank and LSB Bank

I currently use Mainstage 3 and I’m considering switching to Cantabile on Windows.
I downloaded a few days Cantabile Performer Trial. I understand how it works and I like a lot, but I want to know how can I send from Cantabile the Program Change, MSB Bank and LSB Bank to an external expander.

Thanks every one.

Hi Fabio,

For external program changes using MIDI here is one way to go:

  • make sure external device is present and checked in midi ports list in options ( the example uses “oxy88” out )

  • use trigger to carry out command ( the options are many so check each drop-down on the trigger slot )
    I chose to use a song start event to send program change in this example. You can choose other method from list of “Events”.


Just to add to Dave’s comment… I’ve been doing this with my external synthesiser. Very easy!

As shown in his screenshot above, you can type in the program change number as MSB.LSB.ProgramNum (in the Value column).

I’ve been routing MIDI to the synthesiser, generating audio on the synthesiser which is then brought back to Cantabile, applying effects which then go back through the main audio out, back to the synthesiser and out to the speakers.

Do VSTi instrument banks also respond to MSB.LSB.ProgramNum?

I have several Linplug instruments that always revert to the first bank if I send MIDI patch changes from my keyboard.
I suppose there is a filter in there I haven’t found yet that can convert them to a different bank?

I’m very new to VSTi stuff - always been a hardware guy in the past!


As far as I know, yes they do.

As far as I know, I think it depends entirely on the VSTi plugin - some do, some don’t. Many plugins don’t even have “banks” in the normal sense of the word. Some have one bank - in which case you need to copy all the sounds you use into the one active bank and select the required program. In other cases, such as Omnisphere, there isn’t even really the concept of a single bank, only a single patch and a patch “browser” built in that allows you to select sounds - in this case you can use Cantabile’s “Entire bank” feature that restores the full state of the plugin from a Cantabile song/rack state. Note that to send bank/program changes to VST plugins hosted in Cantabile you don’t need to use triggers as Dave describes - you simply select the patch you want, store it in a song/rack state, those states recall the sounds as required. You only need to use triggers when sending bank/program changes to external gear.

Neil, what I was hoping for was that I could create a custom bank in my VSTi and reliably switch patches within that one from my controller keyboard. It always sends me to bank one currently, and since it sorts alphabetically, that means the “Ambient patches” bank. I could likely get around this by naming my custom bank alphabetically “lower” so it appears first, I suppose.

Being able to map patch changes directly to any bank/patch I liked in a VSTi would be far better, of course.


Terry, the way I would do it in Cantabile would be for your controller keyboard to send bank/program changes to Cantabile to switch Cantabile song states (for different parts of songs), and these song states will store and recall the selected VSTi patches for you, to get the various sounds you require.

The other cool thing you can do with Cantabile 3 is to make a “rack” containing your VSTi, and store all the sounds you care about as separate rack states. Then, whenever you want to use that VSTi, just use the rack and select the sound you want from the drop-down (which will only list the sounds you ever care about actually using). These rack states can also be selected either remotely via MIDI from your controller keyboard, or recalled as song states. The great thing about this is that the complexity of the VSTi, and whatever random patch layout it has, can be hidden away in the rack.

However if you did want direct access to changing patches via program changes from the controller, you’ll be relying on whatever support the VSTi has for bank/program changes.

1 Like

That is an awesome approach! I’ll be fiddling with that and implementing it as a solution for sure. Totally cool that Cantabile has that ability! I clearly was thinking too “old school” to grasp that concept without some clarification! :smile:

Thanks, Neil!



Just to clarify, Dave’s explanation and screen shots above are for Cantabile 3.

I think you’re using the Cantabile 2 trial in which case everything is conceptually the same, just the screen shots won’t match exactly.

Regarding VSTi support for program and bank changes - it’s completely depends on the plugin in question.



I have for my Yamaha Montage banks a bank calculator.
The result is given as e.g.

MSB 063
PC 54

How I have to input that in the value field under bindings “program change bank”?

try 63.2.54 - depending on your formatting options, it may be displayed differently (8066.54) after you enter it:




@Torsten thanks!
I tried so far all combinations in the “Formatting” settings.
I get via bindings program changes, but always the wrong performances are loaded/opened in the Yamaha Montage.
Also, if I press in the bindings sections on the “triangle”/play button always other wrong performances loaded/opened in the Montage. The opened performances are various instead fixed.
The John Melas tools show the banks as e.g. 064/003:105.
In Performer I tried e.g. 064; 003; 105.
My settings actual in Performer under “Formatting”
Program Numbers: Zero Based
Program Banks: Zero Padded >>> here I tried so far all other settings…same result

My Bindings are made =
Source = Rack State
On Load
Event 0ms
Target = Output Port - Montage Out 1
Ch: 1
Program Change Banked >>> tried also Program Change
Value: e.g. 062; 005; 080

What is wrong in my settings?

Hi @Bladerunner

Try this:

  1. Go to Options -> Diagnostics and turn on Console Logger and Log MIDI Out Events. That’ll let you see exactly what Cantabile is sending.
  2. Setup a simple binding like what you’ve described.
  3. Press the “Play” button on the binding to send it.

Post back a screen shot of the binding and what the console logger shows and I’ll see if I can spot the problem.


The formatting is not the problem - it only affects how Cantabile displays the values after you have entered them. The issue is in how you entered the values: Do NOT use semicolons to separate msb, lsb and pc. You MUST use periods!

When you use semicolons, Cantabile will rotate through the three values as program changes, i.e. it will send the first value as PC on the first trigger, the second value the next time, then the third one, and then start over with the first.



1 Like

What are periods?
How is it look like?

A “period” aka full-stop is the character “.” (dot)

As I originally wrote, use the notation 63.2.54 - don’t use 63; 2; 54


Well spotted @Torsten.

A few people have been caught out by this now so I’ve updated the dialog to make it clearer:


1 Like

Good idea, @brad!

Just make sure that the dialog will respect the localization settings (decimal comma vs. decimal point; semicolon vs. comma) - I believe the current one does, right?



For these values, it’s hard coded to , for value separator and . for bank separator.