It’s finally here!
I’ve just put up Cantabile build 4100 which includes the new bindings implementation. I started work on this almost a year ago thinking it would take a couple of weeks - turns out it was a much bigger job than anticipated (and there were some distractions along the way). In any case a first experimental build is now available!
So what’s changed?
The biggest difference you’ll notice is the UI has changed. Rather than bindings being edited in a single slot, with various popups for settings, everything is now nicely contained to a single popup window and there’s a big text area where you can enter notes and comments.
Back in the main window bindings table, the number of columns has been significantly reduced and some of the less frequently used settings have been removed:
The schedule and retrigger settings have moved to a single dialog accessed from the “Timing” button:
Once nice side effect of having binding settings in a separate window is you can switch away from the bindings tab to control other parts of Cantabile while having the selected binding visible/editable at the same time.
The biggest conceptual change is the idea that a binding is comprised of three distinct objects, each with their own set of properties: the source, the target and a mapper. Previously these concepts existed but each object couldn’t maintain an arbitrary set of settings.
Practically this means that some previous bindings had to be separate (eg: Load bindings with Instant vs Delayed versions) but can now be combined to a single binding point with settings:
- Rather than separate binding points for each MIDI port, there’s now a general “MIDI Ports” binding object under which you choose the port.
- MIDI Ports on Plugins, Racks and Media Players are now binding points on those objects, rather than separate bindable objects.
- All the PC Keyboard binding points (both listening for key events and sending key events) have now been combined into a single “PC Keyboard” bindable object.
- Various other tweaks and consistency fixes to binding point names.
(TL;DR: everything from before is still there, but it might have moved and/or changed name)
The functionality of the new bindings is basically on-par with the old system. There’s a couple of new binding points - but they’re mostly for testing. (eg: write log target and the manual invoke source, improved functionality on the “Test” button etc…)
Internally, the binding framework has been completely rewritten. Currently the functionality is on-par with the previous version, but the ground work is there for improvements to bindings in the future.
For example, previously (and currently) only MIDI to MIDI bindings ran on the audio thread, but the framework now supports any binding point running on the audio thread. This opens the possibility for real-time bindings to audio mixer settings and plugin parameters.
When you load a song or rack file from an older build, Cantabile will automatically upgrade and convert all existing bindings to the new system. Your old song and rack files should continue to work in the new build as before.
IMPORTANT: Any song or rack files saved by this build, either by explicitly saving or automatic saving of racks will not load in previous builds. Before using this build, please back up your current song and rack files.
If you need to go back to an earlier build, you’ll need your old song and rack files.
(Actually, Cantabile will automatically save a backup copy of any song/rack before it overwrites it with a .pre4100 extension appended… but don’t rely on this and it’s better to be safe than sorry).
This update is available now to anyone with a update current subscription. It’s being released as build 4100 to reflect such a big update and to leave room for updates to earlier builds if necessary.
Get it here:
Note: it’s not currently in the release notes feed as I want to limit availability to this community for the moment.
This build should be considered very experimental and definitely don’t use it live.
- Initial release of new bindings
- Fix an object reference exception loading background rack
- Fixed - crash/hang/stack overflow on some binding mapping modes
- Fixed - rackHost.gain binding point not upgrading correrctly
- Improved binding logging (quotes to delimit binding point names, include rack name, include binding unique id)
- Show binding unique logging id in Binding Editor.
- Fixed - crash when deleting routes
- Fixed - mapper properties not upgraded when converting binding points to rack host.
- Improved - better handling of multiple mappers - explicit automatic mode, smarter selection of which mapper to use
- Improved - better formatting of mapper settings in table view
- Improved - improved switch/condition to command modes, including always, on true/false edge, if true/false, while true/false repeat.
- Fixed - MIDI source binding point crash on second manual invoke
- Fixed - various upgrades of old bindings
- Note - recommend re-upgrading song files from pre-4100 to incorporate fixes to binding upgrades.
- Fixed - unable to choose “mapped” for program number in MIDI target binding point for program change events.
- Fixes to default ranges to use “(max)” instead of “+30dB”
- Bindable Object and Binding Point drop down pickers are now sorted
- Fixed missing spaces in “OutputGain” and “InputGain”
- Fixed bindings with exported state not updated and/or causing crash
- Improvements to load error handling (sometimes causing app to be left in an unresponsive state)
- Removed some excessive debug logging
- Fixed control curves
- Fixed options dialog initial size
- Fixed Song On Load binding not firing
- Fixed a couple of rack binding points not upgrading correctly
- Fixed plugin.suspend binding point not upgrading
- Fixed bindings shown as missing when containing rack is unloaded
- Fixed jump prevention incorrect set on some upgraded bindings
- A number of improvements to audio engine event dispatching and route manager integration.
- Fixed MIDI port names not correctly reversed (in <-> out) for bidi bindings
- Fixed empty binding point selector for some rack instances
- Fixed crash unloading plugins
- Fixed some rack MIDI source/target bindings not upgraded correctly
- Fixed an issue with some delayed bindings hanging
- Fixed crash closing Banked Program Change selector dialog
- Added Unload patch file button to Banked Program Change selector dialog
- Show banked program names from patch file in binding list
- Fixed internal assertion error when firing on load bindings
- Fixed - incorrectly allowing selecting wildcard CC number in MIDI source binding point
- Fixed - blank program numbers not working in set list and state list
- Fixed - Upgraded MMC bindings not using wildcard device number
- Fixed - toggle and relative bindings for MIDI CC targets now working.
- Reverted - put binding schedule/delay button and indicator back in main binding table list
- Fixed stack overflow cancelling pending actions when engine stopped
- Better error message when renaming a set list song with invalid characters
- Fix metronome bindable crash when scale value out of range
- Fixed various language translation issues
- Removed exception when translated variable not found
- Fixed crash when using Learn Binding when learn dialog already shown
- Fixed blank song name in “Create Binding In” drop down
- Fix for enumerating modified collection
- Fixed delayed block state unload bindings not triggering
- Fixed right click on Enable route button crashing
- Fixed missing language translation strings
- Fixed - performance hit when playing media file and timeline open
- Fixed - main menu bar not rendered correctly when OpenGL enabled
- Fixed crash when selecting “Adjust Transpose” binding point
- Fixed Learn button not updating all source binding point fields
- Fixed bindings not enabling/disabling correctly when parent group enabled/disabled by states
- Fixed network API endpoint for invoking UI command not working
- Fixed missing channel 16 in channel selector field
Feedback, Bugs and Suggestions
As always, I’m keen for any feedback on your experience including suggestions and bugs. Please let me know of anything that doesn’t work as before - either because the binding didn’t upgrade correctly or simply if the binding is working differently to before.
I’ve done extensive testing including testing every single one of the hundreds of source and target binding points as well as all the mapping modes, but something is sure to have slipped through the cracks - so let me know.