Monday, May 12, 2014

The Ableton Push

Half instrument, half midi controller surface, the Ableton Push is definitely some impressive piece of German engineering, but minds like mine and yours (after all you are reading this) do believe that nothing is so cool than can't be bent into becoming even cooler.
I have created this page to share some of my experience playing around with, customizing and modding my Ableton Push.

The Disclaimer

Be aware that by "modding" here I mean "soft modding", like changing pad colors or using the device in different environments than Ableton Live, more like "repurposing", so I am not going to give (don't ask) any information that would allow someone to open and mess with the internals of their devices, or mess with the firmware/software, which are intellectual properties of Ableton.

Also, if you decide to read from this point on, be aware that you may void your warranty, especially if you don't know 100% what you're doing. Some SysEx messages can, for example, put your device into "firmware upgrade" mode, erase or overwrite the processor's flash, and turn your beloved device into an expensive paper weight. You've been warned.

Now enough with scary warnings and let's read on and have some fun.

The Push initialization messages

These are some of the messages sent to Push by Ableton Live 9.1.2 when initializing the device. There are SysEx messages, notes and control changes, which will set the various visual and operational parameters of the device.

The Push SysEx messages

SysEx Messages I have identified so far:

Identity request240,126,0,6,1,247
Brightness request240,71,127,21,124,0,0,247
Brightness set240,71,127,21,124,0,1,<brightness 0-127>,247
Contrast request240,71,127,21,122,0,0,247
Contrast set240,71,127,21,122,0,1,<contrast 0-127>, 247
Clear display line240,71,127,21,<28+line(0-3)>,0,0,247
Write text to display240,71,127,21,<24+line(0-3)>,0,<Nchars+1>,<Offset>,<Chars>,247
Set key aftertouch240,71,127,21,92,0,1,0,247
Set channel aftertouch240,71,127,21,92,0,1,1,247
Set Live mode240,71,127,21,98,0,1,0,247
Set User mode240,71,127,21,98,0,1,1,247
Request white calibration information240,71,127,21,107,0,0,247
Set pad color (RGB)240,71,127,21,4,0,8,<Pad(0-71)>,0,<r1>,<r2>,<g1>,<g2>,<b1>,<b2>,247

SysEx messages pending:

Set led strip operation mode240,71,127,21,99...
Set leds on the led strip240,71,127,21,100...

Setting Contrast and Brightness
Only values from 0-63 seem to have some effect

Setting LCD text
Each display line is divided into 4 groups of 17 characters, the offset (column) is then form 0 to 67.
To write a string to a part of the line, an offset(column) and size needs to be passed (see "Write Text" SysEx message above).
So, to write "Hello World!" to the fifth column of the second line, just send:
240,71,127,21,25,0,13,4,"Hello World",247

Setting Pad colors
To set a pad color to a RGB(0-255) value, the RGB values need to be set into "Push" format, for example:
r1 = r /(integer division) 16 
r2 = r %(modulo) 16
So a value of R132 would become: r1=8 r2=4.
The pad index if from 0 to 71, zero being the bottom left pad, all the way up to the second row button to the right (second row of buttons is RGB).

I will update this list as I find out the purpose of the other SysEx messages (and make sure they are not going to kill the device).

Setting the pads/buttons colors

All the pads colors are set by sending their corresponding notes with specific speeds. A speed of 0 will turn off the pad, a speed of 3 will set it white, but there's no mathematical calculation for obtaining a specific color. The colors are in fact based on a lookup table (Palette).

To address a pad in the 8x8 array, determining which midi note to use and (0,0) being the left,bottom one, the calculation would be:  NoteNumber=y*8+36+x. The application must take care of keeping x and y values between 0 and 7.

The first row of buttons under the display (cc20 to cc27) is colored by red/green LEDs, and they can be set to those two colors and also orange/yellow by combining them, also with some other combinations of dimmed/blinking. Which are based on a lookup table.

The second row of buttons (cc102 to cc109) is colored by RGB LEDSs and will follow the same lookup table as the pads.

The time resolution buttons to the right of the pads (cc36 to cc43) are also colored by red/green LEDs, and follow the same coloring principle.

All other buttons are monochromatic, but will follow this table for CC values:
 0 - Off
 1 - Dim
 2 - Dim Blink
 3 - Dim Blink Fast
 4 - Lit
 5 - Lit Blink
 6 - Lit Blink Fast
 7 -> 127 - Lit

To set the color of one specific button, the corresponding CC is sent to that button with a value from 0 to 127, which will set its color or blinking behavior.
This is very cool when designing an user interface application, because all the blinking code is "offloaded" into the Push, leaving to the application only the task to concentrate into the results. Very wise of Ableton to design it like this.

The pads will send note-on/note-off messages when pressed. They can be set to send key-aftertouch or channel-aftertouch using the SysEx messages above.

The pad notes and the CCs for each of the buttons are documented here.

The touch ribbon

The touch ribbon to the left of the pads sends out pitch bend, but it also has a column of 24 LEDs which can be individually addressable.
The type 99 SysEx message sets the behavior of the LED strip, I am still checking what are the options there, but option 4 seems to set the LED strip to "addressable" mode.
Each 3 LEDs, from the bottom up, are addressed by one of the 8 bytes of the type 100 SysEx message.
There are 3 possible values for each LED, off, dim and lit, and setting each byte of that SysEx message from 0 to 63 will allow to obtain all the combinations. Setting from 64 to 127 will just repeat the same sequences.

The encoders

The encoders will send control changes with a value of 1 or more when turned right (clockwise) and 127 (-1) or less when turned left (counter-clockwise).
Sending 1 or more and -1 or less means they are sending different values when turned faster, so you can write an application which reacts differently when the encoder is turned faster. Very cool!

The encoders will also send note-on messages with speed 127 when touched and note-off messages with speed 0 when released. This helps writing applications which can change the display contents based on a context.


I have a few projects in mind right now related to the Push:

. Create an "Ableton Push Emulator" in Flowstone, which would be capable to emulate the user mode and facilitate the integration of Push into other applications. (Partially completed)
. Create a "push message filter/redirector" module which could serve as a translator between the Push's user mode and any other instrument/DAW, more or less like PXT-General does, but with some improvements/differences. (In the way)
. Use this "push message filter/redirector" to make the Push available as a programmer/controller for the synths I have, like the Korg Radias, Roland D-50 and others. (In the way)
. Create a Lua language interface to allow programming the Push by using Lua scripts.

So stay tuned and visit often. Make comments, send requests and share your creations too.


Some youtube videos that I like featuring the Push, just for fun:
  • Review by Mad Zack here.
  • Chilled - 110BPM: here.
  • Recording and improvising with loops: here.
  • A track in 10 minutes: here.

Proudly pushing the Push for more than 3 years now.

All images here were taken from the Internet. If you don't like to see your image here just let me know and I will remove it.


  1. Thanks It was helpful , I also need your opinion about this package
    Is it worth my penny or u can recommend me smth else?

  2. Hi Gustav,

    To be honest I have not touched the Push for music for a long time now. I have just been playing with reverse engineering its messages and using it as a controlling device/dashboard for applications.
    This being said, I am not sure if I am qualified to recommend a sample kit. In fact, it all depends on what you are working on.
    It is your sound style and your inspiration which would define if they are worth the money or not.
    What I would do is:
    . figure out the tune you are writing, make it happen with a kick sample you already have.
    . Maybe layer two (or three) kick samples together to make it sound different.
    . Run the two kick samples through two different pass filters, so you bring in the bass range from one and the high range from the other.
    . Play with effects, eq.
    And if after all this you still think you need a different sound, and the sounds on that demo are talking to you more than the one you have, the it is indeed worth the money.