Saturday, September 30, 2017

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:

The values highlighted in red is what I call a SysEx "Function".
71 is the manufacturer ID (Akai Electric Co. Ltd.)
127 is the device ID (default it 127 - All Devices)
21 is the product ID (Push)
The Device ID can be sent as 0 as well.
Identity request240,126,0,6,1,247
Set pad color (RGB)240,71,127,21,4,0,8,<Pad(0-71)>,0,<r1>,<r2>,<g1>,<g2>,<b1>,<b2>,247
Write text to display240,71,127,21,<24+line(0-3)>,0,<Nchars+1>,<Offset>,<Chars>,247
Clear display line240,71,127,21,<28+line(0-3)>,0,0,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 version240,71,127,21,96,0,4,65,<major>,<minor>,<bugfix>,247
Set Live mode240,71,127,21,98,0,1,0,247
Set User mode240,71,127,21,98,0,1,1,247
Set touch strip mode240,71,127,21,99,0,1,<Mode>,247
Request white calibration information240,71,127,21,107,0,0,247
Contrast request240,71,127,21,122,0,0,247
Contrast set240,71,127,21,122,0,1,<contrast 0-127>, 247
Brightness request240,71,127,21,124,0,0,247
Brightness set240,71,127,21,124,0,1,<brightness 0-127>,247

SysEx messages pending analysis:

Pad parameter240,71,127,21,71...,247
Device enquiry240,71,127,21,80...,247
Set calibration240,71,127,21,87...,247
Pad sesitivity240,71,127,21,90...,247
All pads sensitivity240,71,127,21,93...,247
Set leds on the touch strip240,71,127,21,100...,247

Invalid SysEx messages
By looking at the Push firmware code I have found that the following SysEx messages are invalid:
94-97,101-103,112,113,115-117,119

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 Touch Strip modes
Touch strip modes are:
  1. Custom PitchBend
  2. Custom Volume
  3. Custom Pan
  4. Custom Discrete
  5. Custom Free
  6. PitchBend
  7. Volume
  8. Pan
  9. Discrete
  10. Modwheel
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).

Firmware Update
240,71,0,21,<firmware in DOS-Mode Intel HEX format>,247
No, don't do it, no no no no no ... no ... told ya ... no!!!



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.


Projects


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.


Videos


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.