Ableton Push MIDI Programming Reference

This page is a reference for programming the Ableton Push 1 via MIDI. Everything referenced is sent or received on the Push "User Port", which is separate from the MIDI port used to communicate with Ableton Live.

Push MIDI Output

Below is documentation of the MIDI messages sent FROM the Push.

Pads

The pads on the Push 1 send MIDI notes when tapped, as well as polyphonic aftertouch messages when pressed on (when "held", after the initial tap). The lower-left pad sends MIDI note 36, and the top-right pad sends MIDI note 99. Below is a diagram to illustrate the note numbers sent.


-------------------------------------
92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 
-------------------------------------
84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 
-------------------------------------
76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 
-------------------------------------
68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 
-------------------------------------
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 
-------------------------------------
52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 
-------------------------------------
44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 
-------------------------------------
36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 
-------------------------------------

Knobs

When turned, the Push knobs send CC messages indicating the increment that the knob was turned (so, relative values, not absolute). The controller number (i.e. the identifier of which knob was turned) sent by the knobs are as follows: The top row of nine knobs above the screen are CC#'s 71–79. The smaller "clicky" knob is CC 14, and the "smooth" smaller knob is CC 15.

The increment values sent by each knob will be a number from 0 to 127, but should be interpreted as a signed value, as follows. If the number is less than 64, it is a positive/clockwise turn, e.g a value of 1 is a slow clockwise turn, a value of 2 is faster, etc. A number greater than 64 should have 128 subtracted from it, e.g. a value of 127 -> (127 - 128) = -1, so a slow counter-clockwise turn. 126 maps to -2, so a faster counter-clockwise turn, etc.

When a knob is touched or a knob touch ends, a MIDI note will be sent. The velocity of the note indicates whether it's a touch beginning (127) or ending (0). The note number indicates which knob was touched. The top 9 knobs are note numbers 0–8. The clicky knob is note 10, and the small smooth knob is note 9.

Buttons

All of the buttons (everything you can press that isn't a pad) send CC messages. The value of the CC message is 127 when the button is pressed down, and 0 when it is released.

The CC # of each button is given in this text file. The "rep" buttons are the "repeat" buttons to the right of the pads. The "topRow" and "bottomRow" buttons are the ones above the pads.

Touch Strip

The touch strip to the left of the pads outputs MIDI Pitch Bend values.


Push MIDI Input

The good stuff: here are the MIDI messages to control the colors/text on the Push.

Pads

To illuminate a pad on the Push, there are 2 methods. The first method is to send a MIDI note message on Channel 1 to the Push. The velocity value of that note will determine the color used to light the pad, using a pre-set color palette (thanks to Florian Zand for determining the RGB values of this palette). The RGB values of this palette are here.

The second method of illuminating a pad allows for any RGB color value to be specified. Send a system exclusive message to the Push in the following format:


240 71 127 21 4 0 8 pad 0 rHi rLo gHi gLo bHi bLo 247
    

... where pad is the pad number, starting from 0 for the lower-left pad. The other variables, e.g. rHi, rLo, gHi, etc are the RGB values to use for the color, with the "hi" part being the upper 4 bits of the value and "lo" being the lower 4 bits. Thanks to this PushMod blog for the info on this.

Top Two Button Rows

The two rows of buttons directly above the pads on the Push are similar but not the same.

The lower row of buttons can be illuminated to any RGB color, the same as the pads. Simply use a "pad" value of 64 to address the left-most button, up to a value of 71 for the right-most button, substituted in the sysex message format given above for the pads.

The top row of buttons can be set to 4 different colors (red, amber, green, or yellow), either dim or bright, and with 2 optional blinking speeds. To light one of these buttons, send a CC message where the CC # is the same as what the button sends out (20–27), and the value is calculated as follows:

color + (bright * 3) + blink

color:
  red: 1
  amber: 7
  green: 13
  yellow: 19
  
blink:
  no blink: 0
  slow: 1
  fast: 2

"color" specifies which color you want. "bright" is 1 for bright, or 0 for dim. "blink" specifies the blink speed.

Right-side "Repeat" Buttons

The 8 buttons to the right of the pad grid can be set to the same colors as the top row of buttons, described above. Use the same formula for color, and send a CC message to the CC # corresponding to that button (40–47).

All of the Other Buttons

The rest of the buttons can be set to be off, dim, or bright, and blinking at 2 different speeds. Just send a CC message with the corresponding CC # (refer to the button CC text file linked above), and a value as follows:

off = 0
dim = 1
dimSlow = 2
dimFast = 3
on = 4
onSlow = 5
onFast = 6

Text Display

The screen on the push can show 4 rows of text, each 68 characters long. The catch is that the row is divided into 4 chunks of 17 characters each, with a blank space between each chunk. If you look at the screen from an angle, you can see the blank spaces.

To send a row of text, you send a sysex message to the Push:


240, 71, 127, 21, row + 24, 0, 69, 0, ... 68 character bytes ..., 247

"row" specifies the text row you want to display, with 0 being the top row and 3 the bottom. The "character bytes" are (mostly) ASCII values. If a byte value is 32–127, it's shown as that ASCII character. Values of 0–31 are special characters (note: a few of these aren't exactly what is shown below, but they're the best I can do without making a custom image).

00: ↑
01: ↓
02: ≡
03: ├
04: ┤
05: ║
06: ─
07: ¤
08: ¦
09: °
10: Ä
11: Ç
12: Ö
13: Ü
14: ß
15: à
16: ä
17: ç
18: è
19: é
20: ê
21: î
22: ñ
23: ö
24: ÷
25: ø
26: ü
27: ь
28: …
29: █
30: →
31: ←

I have read that you can also update only a portion of a text row as well (leaving the rest of the row as-is), but haven't tested this yet. The command for doing so is the same as above, except you specify the number of characters you're updating (specified as "X" in the formula), and the column offset to start at:


240, 71, 127, 21, row + 24, 0, X + 1, column_offset, ... X character bytes ..., 247

Touch Strip

There are different modes you can set the display and output of the touch strip to, but I haven't messed with them much yet. I'll refer you to the PushMod blog for that, for now.