Change song position via binding?

Tags: #<Tag:0x00007f97859fc350>

I need to jump the song position to a certain spot (e.g., beat 1.2 of measure 3) when I press a particular key. How do I create a binding for that?

(Master Transport is controlled by Metronome in my song, in case that matters.)

Hi Kevin,

When you say jump to a position does that mean you have an audio or MIDI file playing back in a media player?

If so you need to open the media file in the Timeline view and add markers. Once you do you can jump to a marker using a binding like shown below.


When you say jump to a position does that mean you have an audio or MIDI file playing back in a media player?

No, there’s no file playback involved. My Master Transport is controlled by the Metronome. (Its current position is reported at the top of the Cantabile main window as the song progresses.) I have VSTs that react in various ways to the current song position as broadcast by the Master Transport. I need the Master Transport (not a media file) to jump to a certain position so that all my VSTs reset to that position.

For example, in the special case that I want them all to jump to position 0, I could achieve this by sending Stop then Play to the Metronome. But I can’t find a way to jump to any other song position.

OK, that’s not do-able using the Transport only in Cantabile I think. Without out a way to mark the positions you are stuck. That is why I thought of Media files because they have that feature. Is there a way a blank media file of the proper length could be used to give access to those markers? I think it’s the only workaround I know of.

Is there a way a blank media file of the proper length could be used to give access to those markers?

Maybe, but in order to get that position info propagated to my other VSTs, I assume I’d have to change the Master Transport to be controlled by the Media Player instead of the Metronome, right? Since this is for live performance, that seems like it would break my other bindings that send tempo changes and meter changes to the Metronome.

It seems like Cantabile should have a binding target for Metronome position. Its parameter could be a decimal number that indicates the desired beat number. For example, setting the Metronome to position 1.0 would reset the Master Transport to the start of the song, setting it to 5.0 when the meter is 4/4 time would jump it to the first beat of the 2nd measure (5th beat of the song), and setting it to 6.5 would jump it to the 4th eighth note of measure 2 (the 6.5th beat of the song).

I wonder whether @brad would consider such a feature addition?


Is there any way to use a MIDI position pointer to achieve this?
The transport will jump to the issued position, even while in play.

Is there any way to use a MIDI position pointer to achieve this?

When you say “MIDI position pointer”, do you mean a marker in a MIDI file being played by the Media Player? I think that’s what @dave_dore was suggesting, but the only way I see for that to work is to put the Media Player in charge of the Master Transport instead of the Metronome, which breaks binding-initiated tempo and time signature changes to the Metronome.

Oh, I see. It’s a MIDI message. But then I think the question becomes: To what would I send this MIDI message to change Cantabile’s song position? Cantabile’s Metronome doesn’t have a MIDI input.

Hi @Hamlan,

Hrm… I don’t think this is possible atm. The only work around I can think of is to create a dummy MIDI file with nothing in it except timing information (tempo, time signature) and then use the method described by @dave_dore above.

Question to @brad: will Cantabile react to Song Position Pointer (0xF2) messages or MIDI time code (0xF1) (on the ports activated for MIDI clock) and move the position of the master transport accordingly? Or does it just use MIDI clock (0xF8)?

In that case, a MIDI binding could be used to send SPP or MTC either to the loopback of that port or (if Cantabile doesn’t accept time information from itselt) via a software MIDI port connection. A bit fiddly, I admit…

It will. (but probably not well tested).

I tried this but it didn’t seem to work. Steps I took:

  1. Create a blank song with loopback ports enabled.
  2. Create a binding from anything (e.g., keyboard key press) to the loopback port for any midi in-port with SysEx message data 0xF2 00 00.
  3. Turn on MIDI clock receive for the in-port used in step 2.
  4. Start the transport (controlled by Metronome), and then activate the binding.

Result: No effect (transport does not change position).

Activating MIDI Monitor for the in-port used in Step 2 does show that a MTC message is received, but the transport doesn’t seem to react to it. I also tried sending MIDI Clock Stop from the binding, but also saw no effect.

Version tested: Cantabile Performer 4 x64 Build 4064

I had a look at this and there’s two problems:

  1. The loopback ports inject MIDI back into the stream after the MIDI clock hooks - so even if you loop those message back, the MIDI clock code won’t see them
  2. The MIDI clock sync looks for song position messages, but not the metronome - so my statement above is not really correct.

So, the best fix for this will probably be if I add a metronome binding point target to jump to a particular timestamp. Logged it here. In the meantime, you might have to use an empty midi file.


1 Like

That one could be gotten around by sending the command to a software MIDI port (e.g. LoopMidi) and routing that back to Cantabile, but if the global transport doesn’t react to it, this won’t do the trick.