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 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
Set display line240,71,127,21,<24+line(0-3)>,0,<Nchars+1>,<Offset>,<68xChars>,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

SysEx messages pending:

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

Each display line is divided into 4 groups of 17 characters and must be always be sent 68 bytes long, there seems to be no option to change one specific character of the display. You can update only one line, but it has to be updated entirely, so the application has to maintain a local "frame buffer" in order to keep track of the changes.

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.

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 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.

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

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 same 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 application, because all the blinking code is "offloaded" into the Push, leaving to the application only the task to concentrate into the result. Very wise of Ableton to design it like this.

The pad notes and the CCs for each of the buttons are documented here.
The pads send note-on/note-off and key after-touch. I am not sure if they can be set into sending channel after-touch.

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 or less when turned left (counter-clockwise).
1 or more and 127 or less means they will send different values when turned faster, so if you want to write an application which reacts differently when the encoder is turned faster it can be done. 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 create applications which can contextually change the display contents.


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.
. 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.
. 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.

My plan is to develop these in Flowstone/Ruby, just because I have more experience with it than with Max/MSP. And because I don't have Max/MSP myself.

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


Some youtube videos featuring thw 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 Push for about a week 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.

No comments:

Post a Comment