New Feature - Bi-directional bindings!

Hey Guys,

Something new for anyone with controllers with motorized faders and/or controllers with LED rings…

Cantabile Performer now supports bi-directional bindings.

Set it up like this:

  1. Go to Options → MIDI Ports
  2. Make sure there is both a MIDI Input and MIDI Output port for the target device with the exact same name (this is important)
  3. Create a binding from the controllers CC number to the target value to be controlled
  4. Set the bi-directional mode - half for motorized faders, or full for LED rings by clicking on the bi-directional binding button (or by right clicking):

There are limitations on the kind of bindings where this is supported and there are two modes (half and full). See here for some more details.

I’ll do a full blog post next week.

This should be considered experimental for now and interested in feedback.

Brad

6 Likes

I have a feeling my current swathes of back’n’forth bindings could now be much simpler - brilliant idea!

Thanks, Brad.

1 Like

Hi @The_Elf,

Hopefully it works well for you… let me know what works and what doesn’t.

Brad

I gave them a go on my older iPad TouchOSC controller rack and they worked great and cut the size by roughly half! They also worked perfectly with the BCR2000 rotary controller. Way easier to set up feedback routes or “bidi” as Brad coined it to me IMO.

Dave

1 Like

There’s something basic I’m clearly not understanding.

I have my iPad controlling a few faders, and my two bindings keep them locked together both ways. I thought I would just make the first binding bi-di. When I try I get the error that there isn’t a port with the same name.

Hi The_Elf,

You have to name the ports explicitly in options and have an input port and and output port with the same exact name. Generic “Rack MIDI In” won’t do it, you have to have environment ports checked on in options and give names to the ports. Another point to remember is that the environment ports only appear in linked racks and not in embedded racks. So, for example I just did the iPad rack I made a while back with these new features and like yours I had “Rack MIDI In” on almost all my bindings. I had to create explicit MIDI ports in and out with the name “TouchOSC”

SnapShot 3840k

Then the targets in the bindings could be changed in my rack from the “Rack MIDI In” to “TouchOSC” and presto I could then configure the ‘bidi’ part of the binding from there no error messages.

these examples all used to require 2 bindings for each control …

Dave

2 Likes

:fearful:
Looks like it’s not going to be flexible enough for me then. I can’t be tying port names to Linked Racks.

Hi @The_Elf

Thanks for the feedback. Use inside a rack with bindings to Rack Midi In/Rack Midi Out is something I didn’t account for. Let me think about this for a bit… perhaps I can special case it, or come up with some other solution.

Brad

Thanks, Brad. Sorry for being the child who breaks his new toy straight out of the box!

In my example here (my MCU-compatible mixer Linked Rack) I have control coming in from both my iPad and from my Behringer X-Touch (and any other MCU-compatible controller), and my bindings keep everything in step between Cantabile and the controllers.

1 Like

Don’t be sorry - this is exactly the kind of feedback and issues I was looking for.

I’m going to change it so that instead of the device names needing to be the “same”, they can instead be “similar” - such that “In” will match with “Out” and “Input” will match with “Output”.

This should allow a binding from “Rack Midi In” be reversible to “Rack Midi Out”.

I think that’ll cover your needs here?

Brad

1 Like

Hi @The_Elf,

Give build 3682 a go… it includes the changes to match similar port names as described here.

Brad

2 Likes

Yeehah!! I’ll give it a run out later today!

Thanks very much, Brad.

Yep, that’s working. :clap:

Only the faders are being allowed. It’s blocking my attempts to add bi-di to toggles and note bindings (which are part of the MCU spec, e.g. mute and solo), which means it’s only a partial solution for my specific main use. It also forced me to set an incoming MIDI Channel for the bi-di rows, which means a little bit of re-work to some Songs, but no big deal.

It works great, though - thank you!

(As an aside… making the swathing changes to my Racks reminded me of one feature I have been meaning to raise - being able to select/edit multiple rows)

A pic in use:

Yeah, +1 for the multiple rows editing!

I have no use for the bi-directional bindings but it’s yet another indication of what a fantastic piece of software Brad is producing!

P

2 Likes

Can you post screen shots of the particular bindings that arean’t working and I’ll see if I can special case them or otherwise make them work.

Yep, that’s required because it needs to know which channel to send the reverse event on and I don’t have a way to easily pass that through the current binding mechanism. I might add it at some point but didn’t want to hold up releasing what I had for something that I didn’t think was too big a deal.

You can multiple select already but all it’s really useful for is deleting multiple bindings in one hit. Multiple binding editing is actually a pretty tricky thing to implement because there a columns across a binding that are dependent on each other so the available choices for one binding might not be there for another - so how do you multiple edit that.

I’m curious exactly which fields you want to multiple edit at once.

Brad

Here’s an example of the bindings that aren’t being allowed - MCU mutes:

@brad

I tried bidirectional binding with relative mode. X-touch mini allows configuring encoders in all relative modes, I chose Relative1 (2 complement).

I do remember that this binding worked a couple of versions ago but now I see that direct binding (MIDI->plugin) is not working anymore. After enabling logs I see the following:

MidiDeviceIn - Ch:12 Controller:  32 =   1      
00179913        0   [04668:2]: MidiInjector - Ch:12 Controller:  32 =   1      
00179924       11   [10060:2]: Binding Input Port - X-TOUCH MINI - Ch: 12 - Controller - 32 (in Grandeur) => Kontakt 1 - 6: Distance - The Gr - source triggered with value 7.874016E-05 for time (now)
00179924        0   [10060:2]:   - invoking immediately
00179924        0   [10060:2]: Binding Input Port - X-TOUCH MINI - Ch: 12 - Controller - 32 (in Grandeur) => Kontakt 1 - 6: Distance - The Gr - invoking target with value 0.7125787
00179924        0   [10060:2]: Binding Kontakt 1 - 6: Distance - The Gr (in Grandeur) => Output Port - X-TOUCH MINI - Ch: 12 - Controller - 32 - source triggered with value 0.7125 for time (now)
00179924        0   [10060:2]:   - injecting midi: Controller param: 32 value: 90, for time: 4196939424
00179924        0   [10060:2]: MidiInjector - Ch:12 Controller:  32 =  90      
00179926        2   [12512:2]: MidiDeviceOut (X-TOUCH MINI) - Ch:12 Controller:  32 =  90      
00180066      140   [04668:2]: MidiDeviceIn - Ch:12 Controller:  32 =   1      
00180066        0   [04668:2]: MidiInjector - Ch:12 Controller:  32 =   1      
00180073        7   [10060:2]: Binding Input Port - X-TOUCH MINI - Ch: 12 - Controller - 32 (in Grandeur) => Kontakt 1 - 6: Distance - The Gr - source triggered with value 7.874016E-05 for time (now)
00180073        0   [10060:2]:   - invoking immediately
00180073        0   [10060:2]: Binding Input Port - X-TOUCH MINI - Ch: 12 - Controller - 32 (in Grandeur) => Kontakt 1 - 6: Distance - The Gr - invoking target with value 0.7126575
00180073        0   [10060:2]: Binding Kontakt 1 - 6: Distance - The Gr (in Grandeur) => Output Port - X-TOUCH MINI - Ch: 12 - Controller - 32 - source triggered with value 0.7125787 for time (now)
00180073        0   [10060:2]:   - injecting midi: Controller param: 32 value: 90, for time: 4196939424
00180073        0   [10060:2]: MidiInjector - Ch:12 Controller:  32 =  90      
00180077        4   [12512:2]: MidiDeviceOut (X-TOUCH MINI) - Ch:12 Controller:  32 =  90      

Sow when receiving 1 from x-touch, plugin parameter is incremented by 0.7125787 - 0.7125 = 0.0000787 instead of 1/127 = 0.00787, as if it’s scaled by 100.

I tried to compensate by setting scaling to 100, but then at some point plugin parameter stops updating at all.

I’m on BUILD 3682 BTW.

Thanks @The_Elf… I’ll take a look at this today.

Not sure how easy it will be to make this work because the binding target for the forward binding (Running/Suspended) is different to the binding source of the reverse binding (IsRunning). Also, notes are more like events than values - so the semantics are a bit weird.

Leave it with me though.

Hi @qyron

Thanks for reporting this. This should work and bi-directional bindings with relative encoders seemed to work fine in my testing so I’ll need to investigate this, But, I’ll need the precise details all the settings for one of the bindings you’re having trouble with. Can you send me a copy of the song or rack with such a binding?

Brad

Hey @brad. It’s all good. If you can open up more bindings to bi-di, that’s great, but it’s not life or death.

I’m damned happy and impressed with what I have already. Anything else is a bonus!