Hey @danielkoppang and @calebstephen,
Please excuse my late reply!
I wanted to take the time to properly explain this because it’s not something that can be covered in a few lines. So this is going to be quite a long read, but bear with me!
If you follow these steps, you’ll be able to get this working.
It’s totally doable using AbleSet’s Canvas combined with AbletonOSC, a free third-party Control Surface Script that exposes almost every parameter in your Live session via OSC.
Let me walk you through the full setup, and then I’ll cover each of your specific use cases.
Setting Up AbletonOSC
AbletonOSC is a Remote Script that lets you read and control any device parameter in your Live session from AbleSet.
1. Install the script:
- Download and unzip from AbletonOSC’s GitHub page
- Rename the folder to
AbletonOSC
- Copy it to your Remote Scripts folder:
- macOS:
/Users/[username]/Music/Ableton/User Library/Remote Scripts
- Windows:
\Users\[username]\Documents\Ableton\User Library\Remote Scripts
- Restart Live
- Go to Preferences → Link / Tempo / MIDI and select “AbletonOSC” from the Control Surface dropdown
- You should see: “AbletonOSC: Listening for OSC on port 11000”
2. Create the OSC Connection in AbleSet:
- Go to Settings → MIDI Mapping, OSC & Scripting → OSC Settings
- Click Add New Connection
- Set:
- Name:
AbletonOSC (no spaces)
- Send Address:
127.0.0.1:11000
- Listen Port:
11001
3. Find your device and parameter index:
AbletonOSC uses 0-based indexing, so your track numbers start at 0 (track 1 in Live = index 0, track 2 = index 1, and so on).
To confirm you’re targeting the right device, go to the OSC Command Tester at the bottom of the OSC Settings page and send:
:AbletonOSC/live/device/get/name TRACK_INDEX 0
Replace TRACK_INDEX with your track number minus 1. The 0 is the device index (first device on that track). If your filter isn’t the first device, try 1, 2, etc.
Once you’ve confirmed the device, get the list of all its parameter names:
:AbletonOSC/live/device/get/parameters/name TRACK_INDEX DEVICE_INDEX
This returns all parameter names in order. You can see the response in the OSC values list at the bottom of your AbletonOSC connection settings. Count from 0 to find the index of “Frequency” (for example, for Ableton’s Auto Filter, it’s index 1).
You can verify it works by sending:
:AbletonOSC/live/device/set/parameter/value TRACK_INDEX DEVICE_INDEX PARAM_INDEX 0.5
Remember, track index is the track number you see in Ableton Live, minus 1.
If the Frequency knob, or your targeted parameter moves in Live, then you’re all set.
Controlling a Filter from Canvas — with Volume Fades (@danielkoppang)
Since you’re looking to replicate the fadeTo behavior but with a filter sweep happening alongside the volume fade, here’s how to do it with a Canvas button.
The idea is: press the button once, and it simultaneously sweeps the filter down and fades out your mixer groups. Press it again, and it sweeps the filter back up and restores the volumes.
1. Enable real-time updates:
In your AbletonOSC connection settings, add this to the OSC on Create field under Event Commands (no :AbletonOSC prefix needed here):
/live/device/start_listen/parameter/value TRACK_INDEX DEVICE_INDEX PARAM_INDEX
This tells AbletonOSC to send updates to AbleSet whenever the Frequency value changes — including when it’s moved from Live’s UI or by automation.
2. Create a Button in Canvas:
Open your Canvas, press ⌘K (or the + button), and add a Button element. Set the Button Type to Script, and configure it like this:
Label (Dynamic):
${shared("filterClosed") ? "Fade In" : "Fade Out"}
Background Color (Dynamic):
${shared("filterClosed") ? "indigo-400" : "indigo-900"}
Script on Press:
const track = TRACK_INDEX;
const device = DEVICE_INDEX;
const param = PARAM_INDEX;
const fadeDuration = 8000; // ms — total duration of the filter sweep
const steps = 300;
const stepTime = fadeDuration / steps;
const volFadeTime = 8; // seconds — duration of the volume fade (same as filter)
const isClosed = shared("filterClosed", false);
if (isClosed) {
// Fade in: restore volumes + sweep filter up
sendOsc("/mixer/gtrs/fadeTo", "previous", volFadeTime);
sendOsc("/mixer/keys/fadeTo", "previous", volFadeTime);
sendOsc("/mixer/trax/fadeTo", "previous", volFadeTime);
sendOsc("/mixer/bgvs/fadeTo", "previous", volFadeTime);
const prev = shared("filterPrev", 1.0);
for (let i = 1; i <= steps; i++) {
const v = (i / steps) * prev;
sendOsc(":AbletonOSC/live/device/set/parameter/value", int(track), int(device), int(param), v);
await sleep(stepTime);
}
setShared("filterClosed", false);
} else {
// Fade out: kill volumes + sweep filter down
const current = osc(":AbletonOSC/live/device/TRACK_INDEX/DEVICE_INDEX/get/parameter/value", 1) ?? 1.0;
setShared("filterPrev", current);
sendOsc("/mixer/gtrs/fadeTo", 0, volFadeTime);
sendOsc("/mixer/keys/fadeTo", 0, volFadeTime);
sendOsc("/mixer/trax/fadeTo", 0, volFadeTime);
sendOsc("/mixer/bgvs/fadeTo", 0, volFadeTime);
for (let i = 1; i <= steps; i++) {
const v = current * (1 - i / steps);
sendOsc(":AbletonOSC/live/device/set/parameter/value", int(track), int(device), int(param), v);
await sleep(stepTime);
}
setShared("filterClosed", true);
}
Here’s what this does:
- First press (Fade Out): Saves the current filter frequency, then simultaneously starts fading your mixer groups to 0 and sweeping the filter down — both over 8 seconds. The volume fades use AbleSet’s native
fadeTo (which is smooth by nature), while the filter sweep runs in 300 steps.
- Second press (Fade In): Restores your mixer groups to their previous volume and sweeps the filter back up to where it was — again, both over 8 seconds.
- The label and background color update dynamically so you always know the current state.
Here’s the actual button:
Fades & Freq Sweep.json (1.8 KB)
Just adapt the code to match your actual track/device indices and replace the mixer group names (gtrs, keys, trax, bgvs) with whatever groups you’re using in your session.
You can also adjust fadeDuration and steps to taste. Longer duration with more steps = slower, smoother sweep. For example, fadeDuration = 10000 with steps = 400 would give you a 10-second sweep. Play around with it until it feels musical for your setting.
You can apply the same approach to Resonance, Drive, Dry/Wet or any other parameter — just use its parameter index instead.
Controlling Filters on 4 Return Tracks with One Slider (@calebstephen)
Since you have 4 return tracks with Instrument Racks containing filters, the approach is similar but the Script on Change sends to all 4 tracks at once.
EDIT:
Important note on return track indexing: After testing this extensively, I found that AbletonOSC’s Device API unfortunately does not support return tracks. Return tracks are not included in the regular /live/track/ index range, and there is no dedicated namespace for accessing devices on them. The only return track commands that exist in AbletonOSC are create_return_track and delete_return_track — but no device control.
Workaround: Instead of placing your filters on return tracks, you can create 4 regular audio tracks dedicated to filtering, route your audio through them instead of the returns, and place your Instrument Racks there. Since they’d be regular tracks, AbletonOSC can fully access their devices and you’d be able to control them from a Canvas slider.
Once you have your filters on regular tracks, the setup is exactly the same as above. Find each track’s index, then:
1. Enable real-time updates:
In your AbletonOSC connection’s OSC on Create field, add a start_listen for at least one of the 4 tracks (to drive the visual feedback):
/live/device/start_listen/parameter/value TRACK_A_INDEX DEVICE_INDEX PARAM_INDEX
2. Create the Slider:
Open your Canvas, press ⌘K (or the + button), and add a Slider element. Configure it:
- Minimum Value:
0
- Maximum Value:
1
- Value Step:
0.01
- Value:
${osc(":AbletonOSC/live/device/TRACK_A_INDEX/DEVICE_INDEX/get/parameter/value", 1) ?? 0.5}
js
// Replace these with your actual track indices
const tracks = [TRACK_A, TRACK_B, TRACK_C, TRACK_D];
const device = DEVICE_INDEX;
const param = PARAM_INDEX;
for (const t of tracks) {
sendOsc(":AbletonOSC/live/device/set/parameter/value", int(t), int(device), int(param), value);
}
This gives you a single slider that controls all 4 filters simultaneously with visual feedback in Canvas.
I’d also suggest opening a feature request on the AbletonOSC GitHub repo asking for device access on return tracks — it would be a great addition for the community.
Hope this helps!