Ableton Live

The de facto standard for techno

January 6, 2015 — October 24, 2019

computers are awful
generative art

Ableton Live is a piece of music software, specifically a Digital Audio Workstation, which has achieved a particular level of ubiquity. I used this a lot, but I have recently gotten annoyed with certain constraints that had been around for a long time and switched to the different constraints provided by Bitwig.

1 UI tips

2 Scripting live

One of few officially supported scripting languages for any DAW is Max for Live, for Ableton Live. It’s a pity, then, that it’s awful. There is an alternative semi-supported “back door” via LiveOSC. Ins and outs of both will be discussed, plus the third option, the handmade backdoor of Gibberwocky.

However, just because it is prominent does not mean Live is unique in having a scripting API. Upstart Ableton competitor Bitwig Studio supports a simple and open javascript API, although its reach is more limited, and it improves most features of Ableton I care about.

Also, you could instead use a non-mainstream DAW. These often have scripting languages as their selling point. Notably, the audio production environment Renoise has embedded scripting using the respectable scripting language lua, although Renoise itself is a freaky non-mainstream sort of tool. csound also comes with some hybrid DAW/IDE options. There are probably other hacks available to the bloody-minded. See audio software.

If you care about nothing but tempo you can use the open Ableton Link to synchronise arbitrary things and skip the friction points.

2.1 Build your own plugins

OK, you have some weird thing you want to do with audio processing. There are many audio frameworks/languages that do this, such as Csound, Faust, Juce/C++, and so on. These lack the ability to control Ableton — they don’t know anything about their host environment. Even synchronizing with the host can be fiddly.

So, let’s say you really want to automate Ableton itself, in some new and exciting way.

2.2 Max for live

Max4live is an API accessed only through a clunky “arty codey” quasi-friendly programming language MaxMSP, whose chief selling points are that

  • the steepness in the learning curve is engineered to occur after you have paid the license fee, and

  • it is Turing complete. Although if Alan Turing’s had modeled his famous Universal Machine off MaxMSP, the paper tape would have been on fire.

Not only can it automate certain features of Ableton, it can also do DSP. While this seems cool, in fact the experience of writing MaxMSP code is horrible and it locks you in to this one expensive, esoteric platform. Why not write your plugins in csound and run them as VSTs anywhere, or in supercollider or indeed any music softrware framework and plug them in using Jack?

2.2.1 Worthy usages

  • sync with supercollider: atk.scsync handles tempo-syncing with supercollider. You can use Jack to plug the two together, and ignore the worst of Ableton.

  • Sebastian Tomczak is a patient saint who creates simple hacks with Max and Live, probably hundreds by now, and they all do elegant and wonderful things that do not involve butting against the limitations of the platform.

  • Tom Cosm’s Leakage and slightly useful plugins provide various workflow improvements and enhancements.

  • Counter is a nice app to trigger MIDI sequences.

2.2.2 Javascript in Max4Live

You can try to access MaxMSP’s patcher interface using javascript. I’m not a fan, because MaxMSP is horrid, and the API design is inconsistent and buggy. It’s a bad API wrapped in a bad language, which kind of removes the labour saving potential of the interface. 1

I use the in-built javascript interpreter for MaxMSP in Live, because having to wire patch-cords is depressing, and because Java has no access to the Live API.

On the plus side, the API is rich — you can do DSP and MIDI inside Ableton. It’s also officially supported by the manufacturer. Moreover, Max for Live does have a lot of (dominant?) market-share and hence a lot of community around it, which makes up for a many evils. 2

Anyway, we push on.

But mark ye; avoid the following mistakes, for I have already made them for you, and shy from the following horrible flaws, lest ye be disappointed.

  • It is slow. Accessing the names and values of 191 parameters on my 2.5Ghz machine takes 116ms. That’s 1.5 million CPU cycles to read each 8 byte float. I know that javascript is not a performant language, but that’s some special awfulness.

  • The version of Javascript (1.6) is elderly beyond belief in computing terms. JS 1.6 shipped in Mozilla 1.5 in 2005. That’s right, the same year that Youtube started. The performance and usability improvements in JS versions since then have been enormous, but MaxMSP sidestepped coyly around them.

  • String values are returned with quotes in the string. Set the value of a LiveAPI path and then get it back again. You’ll find it is still a string has decorative quotes stuck it, which you then have to remove before you do parse it, or even submit it to the same API again. Why? Who will ever be made a happier person by this?

  • Float values are returned as some kind of object which looks like a number, but fails if you do arithmetic. So you have to cast your float return values to floats to use them. Maybe they are strings? Who knows? The docs don’t. And anyway, why would an internal API only return strings? The simplest explanation I have is that it is always returning me strings then sloppily casting them to floats sometimes, but why the hell would a high-performance DSP program handle floats by casting them to strings sporadically when reading values? The mind quails; I will pretend it is not so. I guess the quotes are there to tell you that the API looks typed, but is JSON, merely to rub in how it would have been no harder for them to expose it as an open web service, but they didn’t because they want to shamelessly up-sell you, and are revelling in that fact.

  • There are myriad tiny mistakes to indicate that it’s half-baked, and few enough fixes to indicate that they don’t really care, or don’t have enough staff to be able to care. Pertinent example: The system to attach mouseover help-strings to javascript outlets causes segfaults if you use it at all. Not the most exotic use case for mouseover help strings, mousing over them I mean. I reported it in November, but no fix has been pushed. I wouldn’t mind this if it were an isolated incident, but there are so many segfault-causing bugs that you kind of get bored, so I’ll use that as an example and move one. The most irritating response I’ve got about that is that it’s fixed in the “new version”, which costs 150 bucks. Their mistake, my cost. Cool. I should, I presume, learn from this that other basic functionality I require will be so rudely delivered. (note: I wrote that in 2013, haven’t checked it since then. Based on experience, if this bug is gone, it will have been replaced by others equally dire.)

  • Lots of details are just badly thought out. Such as:

    • the native format of patchers in MaxMSP is JSON, but in an unannounced, undocumented move for unspecified reasons, they disabled “eval”, so you can’t read JSON from Javascript. I mean, you could, if you loaded up a JSON-reading library. But that would require you to be able to eval the contents of the library file.

    • throwing errors doesn’t do anything useful. Try it out.

2.3 Gibberwocky

Nicely done and well-maintained. A Charlie Roberts high point.

gibberwocky is a trio of environments for music programming and live-coding performance. Each of these environments targets a different software package or communication protocol, but share principles and APIs for musical sequencing and musical control signals. All three environments use vanilla JavaScript as the end-user programming language.

Targets Max, MIDI and Ableton Live.

2.4 LiveOSC

An alternative. LiveOSC is poorly documented, but definitely a real thing, and despite being an undocumented hack job is one of the more convenient ways to script live; this is faint but real praise. (NB the equivalent in Bitwig is way easier.)

It doesn’t have DSP access, and it doesn’t have official recognition. It doesn’t even have good documentation or a github repo. However, it is used by cognoscenti-types and is genuinely well-designed, or at least doesn’t actively try to piss you off. LiveOSC is a python based interface using the private “control surface” python API to access Ableton over OpenSoundControl as a server. It is based in turn upon LiveAPI, which avoided the network layer but was more fragile and python-specific. pylive uses LiveOSC to control Ableton from a python client and thereby comes full circle. Thanks Daniel Jones for a tidy bit of work there. (Don’t be confused; there are two separate python thingies with blandly generic names working together, but they are completely different.) You can also use LiveOSC with other interfaces, such as Livecontrol 2.

LiveOSC source is here, and livecontrol2 source is here, although I can’t find an actual download link for either. pylive is, by the way, dependent upon pyliblo, although they haven’t gotten around to documenting that yet.

3 File format

Ableton sets are gzipped XML. A couple of people have made scripts to parse them.


  1. An oft-made comparison for accessing things with APIs is that it similar to barrier contraceptives for sex. In this metaphor, the Live API would be would be not so much a condom as a chicken carcass in terms of effectiveness and user experience.↩︎

  2. Then again, there are other fetishes for putting weird things on a penis that likely have an even larger community, and lots of those have more entertaining failure modes if you do them on stage.↩︎