Sending a delayed Program Change in Cantabile 4

My apologies if this has been asked before, but I couldn’t find it.

When I change programs on my Nord Stage, Cantabile tracks the change and calls up a new song. The Stage can also send a Program Change on any active External MIDI channel, which I use to set up synths and other VSTs. The problem is, this PC is sent right after the global program. Sometimes the VST is ready to receive it, other times not so much. What I’d like to do is pass the external PC now, wait 2-3 sec., then send it again for good measure. Otherwise, I have to resend it through the Nord, which is not especially user-friendly to do.

I can’t seem to find a binding to specifically repeat a previous MIDI event after a time delay. Does anyone know how to do this?

Regards,
-BW

Hi Bruce,

I’m not sure but I think this article might help. It sounds like it was made to help with issues like this.

Dave

@dave_dore No, I want to go the other way. I don’t want anything blocked: I want the first PC (on the Extern MIDI channel) to come through; and I want another copy to show up 2 sec. later. I figure that if the first one doesn’t ‘take,’ the second one will. And I don’t mind holding off on playing notes for 2 sec. at the start. It’s completely benign to the other VSTs I use.

I could even live with the first PC being delayed for 2 sec. The problem is, when Cantabile loads a new song, if it contains a lead (VST) guitar part, RealStrat, RealLPC, etc. may need to load 1-2GB of samples, if this is the first actual instance of its use since Cantabile started up. The files come from a RAM drive, but even so they take 700-1200mS to load. During that time, other VSTs like AmpliTube don’t seem to get their messages. So, I end up with the right guitar – and the wrong amp. This is easy to fix by sending another Extern PC, except that Clavia in their infinite wisdom have made accessing the Extern MIDI elements difficult, unless I want to dedicate the Data knob to PCs. (I have better uses for it.) So, it would just be handy if Cantabile would send a ‘reminder’ PC after the initial load has completed.

Regards,
-BW

Hi Bruce,

Sorry I didn’t have the right thing but I did think of this solution. You make a copy of each binding in the song that sets PG for the VSTs. e.g.

and on the copy binding you put a set delay. Example is 2 seconds. You can bring the delays setting box up by clicking on the stopwatch on the left of the binding. When delays have been set the stopwatch turns green.

You might have to mess with the delay time.

Is this more like it?

Regards,

Dave

Yes, that it what I am trying to do. I figured out how to set the delay, too. My problem is that I would really like to do this in the Background Rack, not each song – because there are 30-40 Songs that each choose a guitar+amp combination in one of three shared Racks, using Real{some_guitar} and AmpliTube.

What I am trying to set up is, “If the current Song uses CH8, then send any Program Change on CH8 to the guitar+amp Rack (which I can call by name, if necessary) when received; and also send it 2 sec. later.” It doesn’t look like it is possible to set a general-purpose action in the Background Rack that works on all songs in general. Unless I am missing something?

When I go to the Background Rack, I can choose the Input Port, channel, Event, and Target, but Program Change is not in the option list. I even named the route at the Rack MIDI In to “rLPC MIDI In” but this did not change the situation. What is the action that I am looking for?

Regards,
-BW

Hi Bruce,

Good, at least we are in the same page.

To do from the background rack in a generic way it can be done but it is a bit complex. I did some test designing on a solution for your question and came up with this:

  • Create an embedded rack in the BG rack ( it’s renamed it to PG Delay in the example). Set it’s input route to Main Keyboard in and the MIDI output of the rack to Loopback - Main Keyboard.

  • open the rack to the bindings area and add these bindings. On the first 2 bindings that are looking for a PG change input set the delay on them the same. ( I went with 2000 mS). Also set the States Behavior’s “Enable” checkbox for those first two bindings so they will react to state changes.

The first binding sends the PG change after the set delay, the second binding changes the rack to the second state after the same set delay. The third binding resets the rack to state one on the Song Unload so it’s ready for the next time around. The first state which I called “Armed” is the ready and wait state and looks like this.

After it is triggered by the PG change it waits 2000mS and then sends the PG change and then changes to state 2 so we can block further PG inputs to the Delayed PG rack until the start of a new song. This is done by disabling the first 2 bindings on the second state. The third binding is at the ready and will reset the rack to state one on the Song unload. If you needed it to react to Song State changes you could set that on that binding as well with a small edit. Basically it is a One-Shot delayed PG change using the rack this way. One last note is that this method does not block further PG changes from the Keyboard to the song level bindings just the embedded rack that was made in the BG rack.

I hope this helps but realize it is out of the box a bit. :slight_smile:

Cheers,

Dave

1 Like

@dave_dore It works like a charm! I had to make a couple of adjustments to work with my setup (mainly, because I oversimplified my conditions in my explanation), but it’s all working and doing exactly what I hoped. These files probably won’t help you, but they might be useful to someone else sometime:

It’s funny: I’ve been programming since the early '70s (my High School math department taught BASIC and FORTRAN from 1970, thanks to a very forward thinking teacher), and I’ve spent years working with Cakewalk CAL files and MIDI-Ox scripts, so I basically know how to do these things. But I’m a total newbie at Cantabile. I’ve always said that, generally speaking, software programming in one language is just like the next; but you have to learn the style, syntax, and idiosyncracies of each language. Thank you for ‘translating’ Cantabile bindings for me. :grin:

Regards,
-BW

2 Likes

To anyone who is looking at my work and scratching their head …

Why am I sending two Program Changes?

  • The first one is sent immediately. RealStrat (or RealLPC, etc.) catches this one and starts downloading a lot of samples. But doing this seems to cause AmpliTube to miss the message.

  • The second message is sent 2 sec. later. By that time, RealStrat, etc. is done, and AmpliTube has already been loaded – although probably with the last-used program. The second PC syncs AmpliTube to the proper patch.

  • If I only send the delayed message, there is a chance that RealStrat, etc. will still need to process the samples, creating the same problem – just 2 sec. later.

Regards,
-BW

1 Like