Hey @JasonBentch,
The MIDI CC path is one-way from Canvas’s perspective — it can send CC out via the IAC bus, but Canvas can’t receive incoming MIDI CC to update a slider. The way to close that feedback loop is AbletonOSC, which lets AbleSet read your plugin parameters directly. This requires the latest beta, which includes improvements to how AbleSet handles AbletonOSC device parameter values — make sure you’re on 3.1.0-beta-7 before setting this up.
1. Set up the AbletonOSC connection
If you haven’t already, install AbletonOSC as a Control Surface in Live, then in AbleSet go to Settings → MIDI Mapping, OSC & Scripting → OSC Settings and add a new connection:
- Name:
AbletonOSC
- Send Address:
127.0.0.1:11000
- Listen Port:
11001
2. Find your parameter indices
All indexing in AbletonOSC is zero-based (first track = 0, first device = 0, etc.). To find the right parameter index for your flextune plugin, use the OSC Command Tester at the bottom of the OSC Settings page and send:
:AbletonOSC/live/device/get/parameters/name [track_index] [device_index]
This returns a list of all parameter names — find where flextune falls in that list and note its index.
3. Subscribe to the parameter
In your AbletonOSC connection settings, add this to the OSC on Create field:
/live/device/start_listen/parameter/value [track_index] [device_index] [param_index]
This tells AbletonOSC to push updates to AbleSet whenever that parameter changes — including from automation.
4. Update the slider’s Value template
With the connection set up, you can read the parameter value directly in your slider’s Value field:
${Math.round(osc(":AbletonOSC/live/device/[T]/[D]/get/parameter/[P]/value") * 127)}
AbletonOSC sends parameter values as 0.0–1.0, so multiplying by 127 maps it to your slider’s range. You can verify the exact path by checking the OSC Values list at the bottom of your AbletonOSC connection settings after triggering a parameter change.
5. One small thing in your current setup
Your Label template uses local("flextune") but your script writes to shared("flextune") — those are separate variable spaces, so the label won’t update correctly. Change it to:
Flextune ${Math.round(shared("flextune") / 127 * 100)}
Your Script on Change is already correct for the send direction — manual drags will still fire the CC out and update the shared variable.
Would that work for your setup?