I’m about to dive back into the OS X port of Cantabile for probably a month or so. But…
In parallel I’ve started thinking about a couple of long standing bigger tasks that I’d like to attack after this next sprint. Since these things need to simmer in the back of my mind for a while I thought I’d write up what I’m thinking and open it to discussion.
These are the Trello cards for the tasks at hand:
- User Control Panels - ability to configure a control panel user interface for a rack
- User Parameters - ability to define parameters on a rack that can be bound to items within the rack.
- Mixer Panel - exactly what it sounds like
- Dynamic Global Bindings - ability to define global bindings to a MIDI control surface that dynamically change what they control based on the current song/state.
- Ability to display MIDI values on screen - visual feedback on the state of received MIDI data and/or the target of the binding of MIDI controller
The point of this post is to try to bring all of the above into a very high-level abstract design (albeit with many details still unresolved).
The Problem with Free Form User Control Panels
The ability to design a custom control panel surface for a rack was originally raised a long time ago and while I like the idea, the problem is that by allowing the user to design an arbitrarily shaped control surface it’s difficult to integrate that with the main window in a consistent and space efficient manner.
Such a design could work well as a separate popup window (like a plugin editor) but I think the more important goal here is to lift important controls from inside the rack to the main window where they’re at the finger tips.
Also, a generically editable “form” is a tedious thing for the user to setup, and difficult to design well. So…
A Deliberately Limited UI Builder
Rather than provide a completely free form UI designer I’m thinking a better approach might be the ability to design custom “Mixer Slots”. Each slot would be a tall UI area divided into say 6 sections. Within each section you could choose the kinds of controls you want.
Something like this:
The Mixer Panel would then be a horizontal stack of mixer slots.
Standard Mixer Slots
Besides custom mixer slots, there would also be standard mixer slots for:
- Media Players
Creating a Custom Mixer Slot
Each rack and song will be able to define a set of Mixer Slots. These slots would be stored in the rack and shared across any song that uses the rack. Each slot would have a name which is used to reference it.
Each control in a mixer slot would be bound directly to any of the currently available binding targets. Configuration would be done on the control itself - not in the bindings panel and in most cases would be automatically a two way binding - ie: moving the control updates the setting, updating the setting elsewhere updates the control in the mixer slot.
Possibly the configuration of the slot could be state-controllable, but that might be overly complex.
User parameters are intended as a way to define a set of named parameters on a rack or song. Each named parameter would be bound either directly to a rack setting, or available as a binding point for use in bindings (both as a source and/or a target).
The primary purpose of user parameters are:
- to provide a single edit point for connected parameters
- to provide a way to provide formatting (via an attached format string/expression on the property) for incoming MIDI data. ie: by binding a MIDI CC to a user parameter the value can be converted into a human friendly display value.
Any setting in a custom mixer slot can be bound to a rack’s user parameter.
Setting up the Mixer Panel
The mixer panel would be a new panel near the bottom of Cantabile’s main window. In would consist of a horizontal stack of slots where the content of each slot can be selected - either the built-in slot for a plugin, rack etc… or any of the custom mixer slots defined by the rack.
It would also be feasible to have multiple mixer panels that can be cycled through.
Dyamic Global Bindings
The final piece to all this is that the controls in each mixer slot would be available as binding points for the background rack, but rather than binding to a specific mixer panel the bindings would be to mixer panel currently in particular slot position.
eg: you could bind 4 sliders on your MIDI control surface to main slider of mixer slots 1 through 4. Now whatever the song loads into those mixer slots would:
- be controllable from the MIDI control surface
- automatically reconfigure the MIDI control surface as different songs are loaded (eg: update motorized faders, update the text label on an OLED display on the slider, LED ring updates etc…)
Bringing It All Together
So this is how you’d generally use all this:
- You’d create global bindings in the background racks to/from the mixer slots. These would be setup once and then used across all songs
- In each rack you define whatever custom mixer slots you need. These would be available to all songs that use that rack.
- In each song you’d drop the required mixer slots into whichever slot you like.
- As you switch songs the mixer slots would be replaced with those for that song, outgoing MIDI bindings from those mixer slots would immediately fire (thereby reflecting the state o the Mixer Panel onto the external MIDI control surface) and any incoming MIDI for those mixer slots would be automatically mapped to whatever is loaded into the slot.
So that’s roughtly what I’m thinking. Obviously there are holes in the design and details to be fleshed out, but curious what everyone thinks.