OSC Track for Sending Outbound Messages

A while back, I modified an existing MaxForLive device to send OSC messages out of Ableton Live, with the OSC address being the name of the clip. I wondered if AbleSet could be used for the same purpose?

For example, any number of tracks tagged with +OSC that would “read” the name of clips and send that message out to an OSC server. There would have to be a way to input the port number and IP address (preferably multiple destinations for different tracks).

This would allow for creative automation of OSC responding hardware and software natively through AbleSet. Possibly even an additional way to automate AbleSet itself on the localhost?

This feature is now available in AbleSet 2.7.0-beta.5. I’d love to hear what you think!

2 Likes

Oh man! I can’t wait to give it a try. Out of town until next week but I will love to report back. Thanks for keeping a bead on this feature.

1 Like

Leo! Next level stuff. Ever since I discovered Ableset I have dreamed of timeline synced outbound OSC. This is a fantastic implementation! Every time you come through with something like this I can eliminate a layer of complexity from my setup, which makes me very happy!

Thank you so much for this brilliant tool and for continuing to make me fall in love with Ableset all over again! I hope I don’t fall too far down the rabbit hole this week figuring out new and awesome ways to use this :crazy_face:

footnote: I can’t tell you how long I battled with a Max For Live implementation to do what you’ve done so elegantly. It almost drove me mad!

Hey @mrdrennan,

I’m glad to hear that you’re happy with this feature and would love to hear what use cases you come up with! I’m planning to add some examples to the documentation as inspiration for others who might be interested in this feature.

Here’s what I have so far in terms of documentation: Sending Timed OSC Commands with OSC Tracks – AbleSet

1 Like

I know I’m obviously doing something wrong here.
What I was trying to do was display “MBP” on the MacBook, and “iPhone” on the iPhone :smiling_face_with_tear:
I’ve gone through the documentation but I can’t find information on the ports I should set this to.

Hey @agustinvolpe,

For OSC commands to AbleSet, you can omit the host and port entirely. Then, to target a specific device for the notifications, change the “all” parameter to the name or IP of the device. You can change the name of a device on AbleSet’s settings page.

E.g. /notify/big 127.0.0.1 MBP or /notify/big phone iPhone given that you’ve named your iPhone “phone” in AbleSet’s settings.

I hope this helps! Let me know if the documentation can be more specific for this. It’s still fairly rough and a work in progress :slight_smile:

1 Like

I think it might help to be a bit more specific for those who aren’t as tech-savvy.
For example, I discovered through trial and error that if a device has spaces in its name, you can target it by typing single dashes instead of spaces. So, ‘Device 2’ would be ‘Device-2’.

Hey @agustinvolpe,

Hmm, that’s interesting. There’s no code that converts spaces to dashes, so I don’t know why this works :thinking:

If you’d like to supply parameters with spaces, you can also wrap them in quotes, e.g. /notify big "Device 2" "Test Message". Does this work for you as well?

Is it possible/could it be possible to send use the OSC track to send commands that control the show/hide toggles for Performance view?

Absolutely love the remaining song duration setting and its clutch when we’re in a full song, but in most cases we’ll transition out of a full song into a click loop at the same tempo of the previous song to play behind an emcee giving announcements. I mark these as their own “songs” so our band members remember its coming up. But I would love to be able to disable the song duration in these quick loop sections. Since it is only a 1 second loop (and I added the flashing loop indicator) the added animation of watching the duration count down one second, disappear, and then loop over and over again is a lot of on screen action.

But I thought this might be something the new OSC track commands could handle, send a “hide remaining song duration” a beat before that locator is reached and then send a “show remaining song duration” the next spot in the set, etc. I looked in the documentation and don’t think I saw anything about the view settings but it’s very possible its there and I just did not realize. :sweat_smile:

Hey @calebstephen,

Thank you for your suggestion and the video!

The behavior you’re seeing looks like a bug – the remaining time shouldn’t disappear at the end of a song. I’ll release a fix for this with the next update soon.

That said, the idea of controlling the visible elements on the performance page via OSC is still interesting. I’ve added it to my todo list :slight_smile:

Hey @calebstephen,

I just released AbleSet 2.7.1 which adds support for changing per-device settings via OSC.

Let me know if this works for your use case! :slight_smile:

1 Like

Hey Leo!

I’d love a tag that lets OSC fire based on playhead position instead of playback, so scrubbing through the set would trigger OSC just like parameter automation. This would solve two workflow issues:

  1. Rehearsal scene updates without starting playback
    When we use parameter automation via M4L, we can jump anywhere in the set and scenes update correctly without disturbing the band. Since OSC currently only fires on playback, jumping around can create invalid automation states. On my last tour rehearsals, this caused some issues when making arrangement changes, for example, jumping to Verse 2 without playback left a vocal distorted (triggered by CC automation) without the console scene compensating, which led to feedback.

  2. Auto-firing the next song’s console scene
    I like having the next song’s console scene fire as soon as the current song stops, so the desk is already in the right state if the band vamps to transition into the next song. Parameter automation already handles this perfectly with Auto-Jump to Next Song enabled. But since OSC tracks only fires on playback, I’d have to manage end-of-song clips manually, which became a hassle since the set order kept changing.

I know this is a bit niche but would really love this option. Thank you for all the work you put into this and making such a dope platform!

With AbleSet 2, just removing the “[playing]” attribute from the OSC track’s name should be enough for your use case. This makes AbleSet send OSC commands as soon as the playhead reaches the OSC clip, regardless of whether Live is playing or not, similar to how CC automation works in Live.

I hope this helps! :slight_smile:

Adding to this, just as an extra option if you’re using AbleSet 3 beta:
You can also automate console scene changes directly from the Project Script.
This lets AbleSet send the correct MIDI message automatically whenever the active song changes.

You’ll find this under:
Settings → MIDI Mapping, OSC & Scripting → Project Script

Here are two examples you can paste into the Project Script editor and adapt to your setup — one using Program Change, and one using Control Change:

Program Change example

// MIDI output that goes to your console
const midiOutput = "Console MIDI"; // must match the output name in AbleSet

// Song → Program Change mapping
const pcBySong = {
  "Song 1": { program: 10, channel: 1 },
  "Song 2": { program: 20, channel: 1 },
  "Song 3": { program: 30, channel: 2 },
  // And so on.. Add all the songs you need here
};

log("Project Script started (PC mode)");

onOscChange(
  "/setlist/activeSongName",
  ([newSong]) => {
    log("Song changed to:", newSong);

    const data = pcBySong[newSong];

    if (!data) {
      log("No Program Change mapped for song:", newSong);
      return;
    }

    const channel = data.channel ?? 1;
    const program = data.program;

    sendOsc("/midi/send/pc", midiOutput, channel, program);

    log(
      `Sent PC ${program} on channel ${channel} to "${midiOutput}" for song "${newSong}"`
    );
  },
  true // fire immediately with current value
);

Control Change example

// MIDI output that goes to your console
const midiOutput = "Console MIDI"; // must match the output name in AbleSet

// Song → CC mapping
const ccBySong = {
  "Song 1": { controller: 20, value: 1, channel: 1 },
  "Song 2": { controller: 20, value: 2, channel: 1 },
  "Song 3": { controller: 21, value: 10, channel: 2 },
  // Same deal, add all your songs here
};

log("Project Script started (CC mode)");

onOscChange(
  "/setlist/activeSongName",
  ([newSong]) => {
    log("Song changed to:", newSong);

    const data = ccBySong[newSong];

    if (!data) {
      log("No CC mapped for song:", newSong);
      return;
    }

    const channel    = data.channel ?? 1;
    const controller = data.controller;
    const value      = data.value;

    sendOsc("/midi/send/cc", midiOutput, channel, controller, value);

    log(
      `Sent CC ${controller} = ${value} on channel ${channel} to "${midiOutput}" for song "${newSong}"`
    );
  },
  true // fire immediately with current value
);

Let me know if this helps!