├── .gitattributes ├── README.md └── doc ├── AbletonPush2MIDIDisplayInterface.asc ├── LED-Animation.png ├── MidiMapping.png ├── Push2-map.json ├── RGB-LED-Processing.png ├── TS-LED-Processing.png ├── USB-Link-Overview.png ├── UserPortInPrefs.png └── White-LED-Processing.png /.gitattributes: -------------------------------------------------------------------------------- 1 | # This is a catch-all fallback entry for anything that's not matched below. 2 | # We need this only so that it's possible to turn on core.autocrlf without 3 | # having to fear accidental corruption of binary files that look like text. 4 | * -text 5 | .gitattributes text 6 | .gitignore text 7 | *.asc text eol=lf 8 | *.cpp text diff=cpp 9 | *.md text 10 | *.png binary 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Push Interface 2 | ============== 3 | 4 | ## What is Push? 5 | 6 | [Push](https://www.ableton.com/en/push/) is a digital instrument to create and perform music. Push is engineered in-house at Ableton. The second iteration of the instrument - Push 2 was announced at [Loop](https://loop.ableton.com/) in November 2015. You can see Push in combination with [Live](https://www.ableton.com/en/live/) in action [here](https://www.youtube.com/watch?v=0CdMvkBOUgs). 7 | 8 | ## Interfacing with Push 9 | 10 | In the [Ableton Push 2 MIDI and Display Interface Manual](doc/AbletonPush2MIDIDisplayInterface.asc) you can read about the instrument's hardware specification. This manual is of use to the people who want to create their own extensions or applications to the existing possible uses of Push. Both the MIDI and Display interfaces are elaboratively explained, and there is a list of commands provided that you can use to modify the default settings. 11 | 12 | ## Questions and comments 13 | 14 | Please add an [issue](https://github.com/Ableton/push-interface/issues) with your question or comment. We will reply as soon as we can. 15 | 16 | ## Maintainers 17 | 18 | * [@rsu-ableton](https://github.com/rsu-ableton) 19 | 20 | ## See also 21 | 22 | * https://github.com/Ableton/push2-display-with-juce 23 | 24 | * https://github.com/Deep-Symmetry/wayang 25 | * https://www.npmjs.com/package/ableton-push2 26 | * https://github.com/net147/Push2Qml 27 | * http://sigabort.co/p2d 28 | * https://github.com/garrensmith/abletonpush 29 | * https://github.com/wookay/PushInterface.jl 30 | * https://github.com/ffont/push2-python 31 | 32 | Please Note: The external links are being provided as a convenience and for informational purposes only. They do not constitute an endorsement or an approval by the Ableton of any of the linked contents. Ableton bears no responsibility for the accuracy, legality or 33 | the content of the referred site or for that of subsequent links. 34 | -------------------------------------------------------------------------------- /doc/AbletonPush2MIDIDisplayInterface.asc: -------------------------------------------------------------------------------- 1 | Ableton Push 2 MIDI and Display Interface Manual 2 | ================================================ 3 | :author: Ableton AG 4 | :date: Jan. 24, 2017 5 | :revision: 1.1 6 | :numbered: 7 | :toc: 8 | :toclevels: 3 9 | :toc-placement!: 10 | :pageunits: mm 11 | :max-width: 55em 12 | 13 | Revision History 14 | 15 | [cols=",,,",options="header"] 16 | |=== 17 | |Document Version |Firmware Version |Date |Changes 18 | |1.0 |1.0.47 |Feb. 26, 2016 |Initial Version 19 | |1.1 |1.0.60 |Jan. 24, 2017 |Pad Settings, 20 | Pedal Configuration, 21 | Dual MIDI mode 22 | |=== 23 | 24 | (C) Copyright 2016-2017 Ableton AG. All rights reserved. Made in Germany. 25 | 26 | The content of this manual is subject to German Law. 27 | A license to use this manual is hereby granted. No other license, 28 | express or implied, is granted or intended hereby. Any further use of 29 | this document, including but not limited to the reproduction and 30 | distribution, requires the prior written consent by Ableton. The content 31 | of this manual serves the purpose of providing non-binding 32 | information only and shall not be construed as a commitment of any 33 | kind by Ableton and can be subject to change at any time without notice. 34 | Despite making every effort to ensure that the information contained in 35 | this manual is accurate, Ableton shall not be liable for 36 | potential errors or inaccuracies, except for intent or gross negligence. 37 | 38 | Ableton intentionally omits certain parts of the described interface. 39 | These omissions are indicated separately within the document. 40 | Ableton shall not be liable under any theory of liability for any direct, 41 | indirect, incidental, special, consequential or exemplary damages that 42 | may be incurred by the user overriding the intentional omissions and their 43 | related warnings. 44 | 45 | "Ableton" and "Push" as well as their respective logos are registered 46 | trademarks of Ableton AG. All other product and company names are trademarks 47 | or registered trademarks of their respective owners. 48 | 49 | toc::[] 50 | 51 | Introduction 52 | ------------ 53 | 54 | The second release of the Push device (called "Push 2" in this document) 55 | was introduced by Ableton in November 2015. This MIDI and Display Interface 56 | Manual describes how Push 2 communicates with the host computer via 57 | the USB link. 58 | 59 | Purpose 60 | ~~~~~~~ 61 | 62 | The most common way to use Push 2 is with Ableton Live. When Live sees the 63 | device, it automatically starts the "Push 2 script", which provides all the 64 | well-known functions of Push 2. Some users don't want to limit their use 65 | of Push 2 to these standard functions, though. They want to develop their own 66 | extensions or applications. These communicate with the Push 2 device either 67 | from within Live (for example, from Max for Live) or from external applications, 68 | which either run in parallel to Live or standalone. 69 | 70 | This document is intended to give the necessary information into the hands 71 | of technically skilled people who want to build such customized applications. 72 | The described interfaces allow to control the Push 2 LEDs and the 73 | display as well as to receive events from the controls like buttons, 74 | pads, encoders etc. Also, commands suitable to modify the default settings 75 | of the device are documented, for example to set color table entries, 76 | pad curves etc. 77 | 78 | Some parts of the interface are not intended for public use and are therefore 79 | not documented. This mainly concerns things that could damage the device, like 80 | hacked firmware updates, or that could destroy calibration data gathered by 81 | measurements in the factory and saved in the Push 2 flash memory. There are 82 | some diagnostic features which are not documented, because they might be changed 83 | by Ableton whenever needed, are not tested as thoroughly as the documented 84 | functions and usually put an extra burden on the device that could 85 | compromise some of the regular functions. Please, don't try to program the 86 | Push 2 MIDI interface yourself if you can't make sure that undocumented 87 | or reserved commands and arguments are avoided. 88 | 89 | Architecture Overview 90 | ~~~~~~~~~~~~~~~~~~~~~ 91 | 92 | Ableton Push 2 is connected to the host computer via USB 2.0. The USB 93 | interface provides two MIDI ports and a display interface, which are 94 | used by Live and other programs to control various aspects of Push 2. 95 | 96 | .Architecture Overview 97 | image::USB-Link-Overview.png[width="100%"] 98 | 99 | MIDI Interface 100 | -------------- 101 | 102 | MIDI Interface Access 103 | ~~~~~~~~~~~~~~~~~~~~~ 104 | 105 | Push 2 is accessed through two MIDI interfaces, each of which has an 106 | input and an output port. Only one application at a time can access a 107 | port. One port is called the *Live port* and is automatically used by 108 | Ableton Live to communicate with the Push 2 to implement the Push 2 109 | Control Surface functions. The other port is called the *User port* and 110 | can be used either by other applications or by Live itself for remote 111 | control (by MIDI-assigning the controls of Push 2 to parameters in Live) 112 | or to send MIDI directly into the tracks. To use the User port in Live, 113 | configure the MIDI preferences so that the necessary Track/Remote switches 114 | of port 2 are *On*: 115 | 116 | .Push 2 User Port Used by Live 117 | image::UserPortInPrefs.png[width=60%] 118 | 119 | To access the User port from an external application running in parallel to 120 | Live, turn all Track/Sync/Remote switches in the MIDI preferences for 121 | port 2 *Off*. Live will then release the User port, allowing 122 | your application to open it. 123 | 124 | The names of the MIDI ports depend on the operating system and may vary. 125 | The following table shows some typical names: 126 | 127 | .MIDI Port Names 128 | [cols="16%,10%,37%,37%",options="header"] 129 | |=== 130 | | OS | Port | Input | Output 131 | .2+|Windows 7 | Live | Ableton Push 2 __nn__ | Ableton Push 2 __nn__ 132 | | User | MIDIIN2 (Ableton Push 2) __nn__ | MIDIOUT2 (Ableton Push 2) __nn__ 133 | .2+|MacOSX | Live | Ableton Push 2 Live Port | Ableton Push 2 Live Port 134 | | User | Ableton Push 2 User Port | Ableton Push 2 User Port 135 | .2+|Linux | Live | Ableton Push 2 __nn__:0 | Ableton Push 2 __nn__:0 136 | | User | Ableton Push 2 __nn__:1 | Ableton Push 2 __nn__:1 137 | |=== 138 | 139 | __nn__ is an arbitrary number or blank 140 | 141 | The MIDI mode selects over which port MIDI is sent or received. See <>. 142 | 143 | [id="MIDI Messages"] 144 | MIDI Messages 145 | ~~~~~~~~~~~~~ 146 | 147 | Standard MIDI messages are used for the basic Push 2 functions. 148 | Details are given in the linked chapters. 149 | 150 | [cols="18%,14%,22%,30%,16%",options="header"] 151 | |=== 152 | | Message | Status Byte | Data Bytes | Function/Event | Chapter 153 | .4+| Note on .4+| ++0x90 ... 0x9F++ .4+| ++0nnnnnnn 0vvvvvvv++ | set LED color | <> 154 | | pad pressed | <> 155 | | encoder touched/released | <> 156 | | touch strip touched/released | <> 157 | | Note off | ++0x80++ | ++0nnnnnnn 00000000++ | pad released | <> 158 | .5+| Control change .5+| ++0xB0 ... 0xBF++ .5+| ++0nnnnnnn 0vvvvvvv++ | set LED color | <> 159 | | button pressed/released | <> 160 | | encoder turned | <> 161 | | pedal position | <> 162 | | touch strip position | <> 163 | | Pitch bend | ++0xE0++ | ++0q000000 0ppppppp++ | touch strip position | <> 164 | | Channel Pressure | ++0xD0++ | ++0vvvvvvv ++ | global pad aftertouch | <> 165 | | Poly Key Pressure | ++0xA0++ | ++0nnnnnnn 0vvvvvvv++ | individual pad aftertouch | <> 166 | |=== 167 | 168 | [id="MIDI Mapping"] 169 | MIDI Mapping 170 | ~~~~~~~~~~~~ 171 | 172 | The figure below shows the note and controller numbers sent by 173 | control elements of Push 2 when pressed or turned. The same numbers are 174 | sent by Live to set the respective LEDs. 175 | 176 | .MIDI Mapping 177 | image::MidiMapping.png[width="100%"] 178 | 179 | [id="Sysex Commands"] 180 | Sysex Commands 181 | ~~~~~~~~~~~~~~ 182 | 183 | The sysex system exclusive ("sysex") commands are vendor-specific MIDI 184 | messages used to configure Push 2 and retrieve device states. 185 | 186 | General Command Format 187 | ^^^^^^^^^^^^^^^^^^^^^^ 188 | 189 | All sysex messages to and from Push 2 - except for device inquiry - have 190 | the format given in the table below. 191 | 192 | Sysex messages sent to Push 2 are called commands, messages sent back to 193 | the host are called replies. Push 2 sends replies only as reaction to commands, 194 | no spontaneous sysex messages are sent. The reply id is always equal to the 195 | corresponding command id, although the argument list usually differs. 196 | 197 | Commands should not be nested. Before sending the next command 198 | the host should wait for the reply, if any is expected, of the previous command. 199 | Otherwise, pending replies might be dropped. 200 | 201 | .General Sysex Format 202 | [cols="20%,80%",options="header"] 203 | |=== 204 | |Message Data|Description 205 | |++0xF0++ | SOX (start of sysex) 206 | |++0x00 0x21 0x1D++ | Ableton sysex ID assigned by the MIDI Manufacturers Association 207 | |++0x01++ | Device ID. Probably not needed for USB devices, 208 | but this is what most manufacturers do. 209 | |++0x01++ | Model ID 210 | |_ID_ | Command or reply ID (7 bits unsigned integer) 211 | |_Arguments_ | A number of 7 bit values depending on command or reply ID + 212 | (the maximum number of arguments is 17) 213 | |++0xF7++ | EOX (end of sysex) 214 | 2+|Example: ++[F0 00 21 1D 01 01 **14 04 03 42** F7]++ = command with ID +0x14+ and arguments ++0x04 0x03 0x42++ 215 | |=== 216 | 217 | Command List 218 | ^^^^^^^^^^^^ 219 | 220 | This is the list of sysex commands. The details are given in the 221 | respective chapters. 222 | 223 | All unused command IDs are reserved. Some commands are undocumented, 224 | as they may destroy calibration data which was gathered by measurements in the 225 | factory and saved in the Push 2 flash memory. Some diagnostic features 226 | are not specified, because they might be changed by Ableton whenever needed, 227 | are not tested as thoroughly as the documented functions, and usually put 228 | an extra burden on the device that could compromise some of the regular 229 | functions. Please, don't try to program the Push 2 MIDI/Display interface 230 | yourself if you can't make sure that reserved commands and 231 | arguments are avoided. 232 | 233 | .Command List 234 | [cols="15%,15%,40%,30%",options="header"] 235 | |=== 236 | |Command ID|Sends Reply|Command Name|Chapter 237 | |+0x03+ | |Set LED Color Palette Entry .3+|<> 238 | |+0x04+ |yes|Get LED Color Palette Entry 239 | |+0x05+ | |Reapply Color Palette 240 | |+0x06+ | |Set LED Brightness .2+|<> 241 | |+0x07+ |yes|Get LED Brightness 242 | |+0x08+ | |Set Display Brightness .2+|<> 243 | |+0x09+ | |Get Display Brightness 244 | |+0x0A+ |yes|Set MIDI Mode |<> 245 | |+0x0B+ | |Set LED PWM Frequency Correction |<> 246 | |+0x13+ |yes|Sample Pedal Data |<> 247 | |+0x14+ | |Set LED White Balance .2+|<> 248 | |+0x15+ |yes|Get LED White Balance 249 | |+0x17+ | |Set Touch Strip Configuration .3+|<> 250 | |+0x18+ |yes|Get Touch Strip Configuration 251 | |+0x19+ | |Set Touch Strip LEDs 252 | |+0x1A+ |yes|Request Statistics |<> 253 | |+0x1B+ | |Set Pad Parameters |<> 254 | |+0x1D+ |yes|Read 400g Pad Values From Flash |<> 255 | |+0x1E+ | |Set Aftertouch Mode .2+|<> 256 | |+0x1F+ |yes|Get Aftertouch Mode 257 | |+0x20+ | |Set Pad Velocity Curve Entry .2+|<> 258 | |+0x21+ |yes|Get Pad Velocity Curve Entry 259 | |+0x22+ | |Set Temporary 400g Pad Values |<> 260 | |+0x23+ |yes|Flash LED White Balance|<> 261 | |+0x28+ | |Select Pad Settings .2+|<> 262 | |+0x29+ |yes|Get Selected Pad Settings 263 | |+0x30+ | |Configure Pedal .3+|<> 264 | |+0x31+ | |Set Pedal Curve Limits 265 | |+0x32+ | |Set Pedal Curve Entries 266 | |=== 267 | 268 | 269 | 270 | [id="MIDI Mode"] 271 | MIDI Mode 272 | ~~~~~~~~~ 273 | 274 | Push 2 works in three MIDI modes that define the behavior of the two MIDI 275 | I/O ports. 276 | 277 | .In Live mode 278 | - Incoming non-sysex MIDI from Port1 is accepted. 279 | - Incoming non-Sysex MIDI from Port2 is ignored. 280 | - All outgoing non-sysex MIDI is sent to Port 1. 281 | 282 | .In User mode 283 | - Incoming non-sysex MIDI from Port1 is ignored. 284 | - Incoming non-Sysex MIDI from Port2 is accepted. 285 | - All outgoing non-sysex MIDI is sent to Port 2. 286 | 287 | .In Dual mode 288 | - Incoming non-sysex MIDI from both ports is accepted. 289 | - All outgoing non-sysex MIDI is sent to both ports. 290 | 291 | .In all three modes 292 | - The "User" button always sends its MIDI note on/off to both Port 1 and 2. 293 | - The MIDI message setting the state of the "User" button LED is 294 | always accepted from both ports. 295 | - Incoming Sysex is accepted from both ports, replies are sent to the 296 | port from which the request was received. 297 | - The reply to the "Set MIDI Mode" sysex command always goes to both 298 | Port 1 and 2. 299 | 300 | Initially, Push 2 is in Live mode. The mode is changed by the host 301 | using the "Set MIDI Mode" sysex command. See the <> 302 | chapter for a description of the general Push 2 sysex command format. 303 | 304 | [cols="25%,10%,20%,35%,5%,5%"] 305 | |=== 306 | 4+|Set MIDI Mode ^|*ID* ^|+0x0A+ 307 | |*Command Arguments* |m 4+|mode (0=Live, 1=User, 2=Dual) 308 | |*Reply Arguments* |m 4+|mode (0=Live, 1=User, 2=Dual) 309 | 6+|Example: ++[F0 00 21 1D 01 01 **0A 01** F7]++ = set MIDI mode to User + 310 | Reply: ++[F0 00 21 1D 01 01 **0A 01** F7]++ = MIDI mode set to User 311 | |=== 312 | 313 | This command is typically sent out by Live or other host applications 314 | to toggle between Live and User mode after receiving the note-on MIDI 315 | message issued when pressing the "User" button. The reply is always sent 316 | to both MIDI ports, even if Push 2 was already in the requested mode. 317 | 318 | The dual mode is used for debugging or special application scenarios. 319 | 320 | [id="LEDs"] 321 | LEDs 322 | ~~~~ 323 | 324 | There are three types of LEDs used in Push 2: white LEDs, RGB-color LEDs 325 | and the LEDs of the touch strip (which are white too, but are managed 326 | differently). 327 | 328 | Setting LED Colors 329 | ^^^^^^^^^^^^^^^^^^ 330 | 331 | The lighting of white and RGB LEDs is controlled by note-on or control 332 | change messages sent to Push 2: 333 | 334 | [listing] 335 | -- 336 | Note On (nn): 1001cccc 0nnnnnnn 0vvvvvvv [10010000 = 0x90 = 144] 337 | Control Change (cc): 1011cccc 0nnnnnnn 0vvvvvvv [10110000 = 0xB0 = 176] 338 | -- 339 | 340 | - The channel (+cccc+, 0…15) controls the LED animation, i.e. blinking, pulsing or 341 | one-shot transitions. Channel 0 means no animation. See <>. 342 | 343 | - The message type +1001+ (for nn) or +1011+ (for cc) and the note 344 | or controller number +nnnnnnn+ (0…127) select which LED 345 | is addressed. See <>. 346 | 347 | - The velocity +vvvvvvv+ (0…127) selects a color index, which 348 | is interpreted differently for white and RGB LEDs. See <>. 349 | 350 | [float] 351 | Examples 352 | ++++++++ 353 | [cols="31%,18%,14%,37%",options="header"] 354 | |=== 355 | |Binary | Hexadecimal | Decimal | Result 356 | |++10010000 01100011 01111111++ | ++0x90 0x63 0x7F++ | ++144 99 127++ | set the top right pad RGB LED to red 357 | |++10010000 00100100 01111110++ | ++0x90 0x24 0x7E++ | ++144 36 126++ | set the bottom left pad RGB LED to green 358 | |++10110000 00111100 00000000++ | ++0xB0 0x3C 0x00++ | ++176 60 0++ | turn the mute button RGB LED off 359 | |++10110000 00011100 01111111++ | ++0xB0 0x1C 0x7F++ | ++176 28 127++ | set the master button white LED to max 360 | |++10110000 00000011 00000000++ | ++0xB0 0x03 0x00++ | ++176 3 0++ | turn the tempo button white LED off 361 | |++10111111 01110111 01111111++ | ++0xBF 0x77 0x7F++ | ++191 119 127++| let the undo button white LED blink slowly 362 | |++10110001 00111100 01111101++ | ++0xB1 0x3C 0x7D++ | ++177 60 125++| fast transition of mute button LED to blue 363 | |=== 364 | 365 | Touch strip LEDs are either controlled by Push 2 itself or by Live, 366 | depending on the touch strip mode. Live controls the touch strip LEDs 367 | using the "Set Touch Strip LEDs" sysex message containing the color 368 | indices for all 31 LEDs. Touch strip LEDs are not animated. 369 | 370 | The touch strip mode and sysex commands controlling the touchstrip 371 | are described in a separate <> chapter. 372 | 373 | For all LEDs, the color index is passed through a color palette, then 374 | white balance and global brightness factors are applied. The palette, 375 | white balance and brightness can be set via sysex commands. 376 | 377 | [id="RGB LED Color Processing"] 378 | RGB LED Color Processing 379 | ^^^^^^^^^^^^^^^^^^^^^^^^ 380 | 381 | The PWM values used to drive the RGB LEDs are calculated as follows: 382 | 383 | . the color index for the addressed LED, as received by MIDI, is saved 384 | for later reapplication of color palette and brightness 385 | . the color index (0...127) is translated into 8 bit red/green/blue 386 | values using the color palette 387 | . the white balance factor (0...1024) for the respective color and 388 | group of LEDs as well as the global brightness are applied: 389 | 390 | if (Brightness == 0) 391 | then PWM(rgb) = 0 392 | else PWM(rgb) = Value(rgb) 393 | * (WB [R/G/B 1/2/3] / 1024) 394 | * (Brightness + 1) / 128 395 | 396 | .RGB LED Color Processing 397 | image::RGB-LED-Processing.png[width="100%"] 398 | 399 | The RGB palette can be modified or retrieved, together with the white 400 | palette, using the sysex commands "Set/Get LED Color Palette Entry". 401 | After modifiying palette entries, the host should send the "Reapply 402 | Color Palette" sysex command to apply the new palette without resending 403 | the MIDI notes/control change messages containing the LED color indices. 404 | 405 | [cols="25%,10%,20%,35%,5%,5%"] 406 | |=== 407 | 4+|Set LED Color Palette Entry ^|*ID* ^|+0x03+ 408 | .9+|*Command Arguments*|i 4+|color index (0..127) 409 | |r (LSB) |lower 7 bits 3.2+| red color 410 | |r (MSB) |higher 1 bit 411 | |g (LSB) |lower 7 bits 3.2+|green color 412 | |g (MSB) |higher 1 bit 413 | |b (LSB) |lower 7 bits 3.2+|blue color 414 | |b (MSB) |higher 1 bit 415 | |w (LSB) |lower 7 bits 3.2+|white color 416 | |w (MSB) |higher 1 bit 417 | 6+|Example: ++[F0 00 21 1D 01 01 **03 7D 00 00 00 00 7F 01 7E 00** F7]++ = set entry 125 to 0/0/255 and 126 418 | |=== 419 | 420 | [cols="25%,10%,20%,35%,5%,5%"] 421 | |=== 422 | 4+|Get LED Color Palette Entry ^|*ID* ^|+0x04+ 423 | |*Command Arguments*|i 4+|color index (0..127) 424 | .9+|*Reply Arguments*|i 4+|color index (0..127) 425 | |r (LSB) |lower 7 bits 3.2+| red color 426 | |r (MSB) |higher 1 bit 427 | |g (LSB) |lower 7 bits 3.2+| green color 428 | |g (MSB) |higher 1 bit 429 | |b (LSB) |lower 7 bits 3.2+| blue color 430 | |b (MSB) |higher 1 bit 431 | |w (LSB) |lower 7 bits 3.2+| white color 432 | |w (MSB) |higher 1 bit 433 | 6+|Example: ++[F0 00 21 1D 01 01 **04 7D** F7]++ = get entry 125 + 434 | Reply: ++[F0 00 21 1D 01 01 **04 7D 00 00 00 00 7F 01 7E 00** F7]++ = entry 125 is 0/0/255 and 126 435 | |=== 436 | 437 | [cols="25%,10%,20%,35%,5%,5%"] 438 | |=== 439 | 4+|Reapply Color Palette ^|*ID* ^|+0x05+ 440 | |*Command Arguments* |_none_ 4+| 441 | 6+|Example: ++[F0 00 21 1D 01 01 **05** F7]++ = trigger palette reapplication 442 | |=== 443 | 444 | White LED Color Processing 445 | ^^^^^^^^^^^^^^^^^^^^^^^^^^ 446 | 447 | The PWM value for white LEDs is calculated similiarly to the RGB LEDs, 448 | but using the white palette and a different white balance factor. 449 | The palette can be modified together with the RGB color palette using the 450 | "Set/Get Palette Entry" sysex command described in the previous chapter. 451 | 452 | .White LED Color Processing 453 | image::White-LED-Processing.png[width="100%"] 454 | 455 | Touch Strip LED Color Processing 456 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 457 | 458 | The PWM values for the touch strip LEDs are calculated very much like 459 | for the RGB LEDs, but using the touch strip palette and a touch strip 460 | white balance factor. Another difference is that the 461 | color index ranges from 0 to 7, allowing to pack all touch strip LEDs 462 | into a short sysex message. If the touch strip is controlled by Push 2 463 | itself, the color index is always 7 (full white). The touch strip 464 | palette is given in the next chapter. 465 | Unlike the other palettes, it cannot be modified. 466 | 467 | .Touchstrip LED Color Processing 468 | image::TS-LED-Processing.png[width="100%"] 469 | 470 | Default Color Palettes 471 | ^^^^^^^^^^^^^^^^^^^^^^ 472 | 473 | The default color palettes for RGB, white and touchstrip LEDs 474 | might change in the future. Here are some prominent values that 475 | will be retained, most likely. 476 | 477 | [id="Default Color Palettes"] 478 | .Default Color Palettes (subset) 479 | [cols="20%,20%,30%,30%",width="60%",options="header"] 480 | |=== 481 | |Palette |Color Index |Value |Color 482 | .8+|RGB |0 |0, 0, 0 |black 483 | |... |... | 484 | |122 |204,204,204 |white 485 | |123 |64, 64, 64 |light gray 486 | |124 |20, 20, 20 |dark gray 487 | |125 |0, 0, 255 |blue 488 | |126 |0, 255, 0 |green 489 | |127 |255, 0, 0 |red 490 | .4+|White |0 |0 |black 491 | |16 |32 |dark gray 492 | |48 |84 |light gray 493 | |127 |128 |white 494 | .8+|Touch Strip |0 |0 |black 495 | |1 |2 | 496 | |2 |4 | 497 | |3 |8 | 498 | |4 |16 | 499 | |5 |32 | 500 | |6 |64 | 501 | |7 |127 |white 502 | |=== 503 | 504 | [id="White Balance"] 505 | White Balance 506 | ^^^^^^^^^^^^^ 507 | 508 | The white balance is necessary for an even white across all LEDs. 509 | The balancing compensates technological differences in color temperature 510 | and brightness between RGB and white LEDs when driven with equal currents. 511 | Also, buttons, pads and the touch strip have a different color of the 512 | translucent material, which influences the color of the light shining 513 | through it. The white balance helps to adapt the LED colors 514 | to the color of the display. And finally, the buttons above and below 515 | the display have relatively small light slots, but carry important 516 | color information, therefore they are made a little brighter. 517 | 518 | As a result, the LEDs are split into 11 color groups, for each of them a 519 | white balance factor is applied. 520 | 521 | .Color Groups 522 | [cols="25%,40%,35%",width="50%",options="header"] 523 | |=== 524 | |Color group | LED group | LED color 525 | |0 .3+|RGB buttons |red 526 | |1 |green 527 | |2 |blue 528 | |3 .3+|RGB pads |red 529 | |4 |green 530 | |5 |blue 531 | |6 .3+|Display buttons |red 532 | |7 |green 533 | |8 |blue 534 | |9 |White buttons |white 535 | |10 |Touch strip |white 536 | |=== 537 | 538 | Each white balance factor ranges from 0 to 1024. 539 | 540 | The default white balance settings can be overwritten or retrieved using 541 | the "Set/Get LED White Balance" sysex commands. Care must be taken that 542 | the white balance does not make the Push 2 exceed the USB power limit of 543 | 500mA with all LEDs fully on, otherwise the host computer might refuse 544 | to work with the device. The settings are temporary, and are reset to default 545 | on reboot. 546 | 547 | [cols="25%,10%,20%,35%,5%,5%"] 548 | |=== 549 | 4+|Set LED White Balance ^|*ID* ^|+0x14+ 550 | .3+|*Command Arguments* |c 4+|color group (0...10) 551 | |b (LSB) 4+|lower 7 bits of white balance factor 552 | |b (MSB) 4+|higher 4 bits of white balance factor 553 | 6+|Example: ++[F0 00 21 1D 01 01 **14 03 2C 02** F7]++ = set WB factor of red pad LEDs to 300 + 554 | |=== 555 | 556 | [cols="25%,10%,20%,35%,5%,5%"] 557 | |=== 558 | 4+|Get LED White Balance ^|*ID* ^|+0x15+ 559 | |*Command Arguments* |c 4+|color group (0...10) 560 | .3+|*Reply Arguments*|c 4+|color group (0...10) 561 | |b (LSB) 4+|lower 7 bits of white balance factor 562 | |b (MSB) 4+|higher 4 bits of white balance factor 563 | 6+|Example: ++[F0 00 21 1D 01 01 **15 09** F7]++ = get white button WB factor + 564 | Reply: ++[F0 00 21 1D 01 01 **15 09 00 04** F7]++ = white button WB factor is 512 565 | |=== 566 | 567 | To modify the default white balance (persistently saved into flash memory 568 | and applied on reboot), use the "Flash LED White Balance" command. Please 569 | don't invoke this function too often to avoid flash wear-out. Instead, use 570 | "Set LED White Balance" to find good values and then flash only once. 571 | Pass ++[0x7F, 0x7F]++ as white balance factor to reset the flash memory, 572 | effectively restoring the firmware default. 573 | 574 | [cols="25%,10%,20%,35%,5%,5%"] 575 | |=== 576 | 4+|Flash LED White Balance ^|*ID* ^|+0x23+ 577 | .3+|*Command Arguments* |c 4+|color group (0...10) 578 | |b (LSB) 4+|lower 7 bits of white balance factor or +0x7F+ 579 | |b (MSB) 4+|higher 4 bits of white balance factor or +0x7F+ 580 | .2+|*Reply Arguments* |c 4+|color group (0...10) 581 | |r 4+|0 for success, +0x7F+ for failure 582 | 6+|Example: ++[F0 00 21 1D 01 01 **23 07 01 02** F7]++ = flash green display button WB factor to be 257 + 583 | Reply: ++[F0 00 21 1D 01 01 **23 07 00** F7]++ = green display button WB factor flashed successfully 584 | |=== 585 | 586 | [id="Global LED Brightness"] 587 | Global LED Brightness 588 | ^^^^^^^^^^^^^^^^^^^^^ 589 | 590 | The global LED brightness, which ranges from 0 to 127, is applied to all 591 | LEDs. It can be set or obtained using the "Set/Get LED Brightness" 592 | sysex. 593 | 594 | [cols="25%,10%,20%,35%,5%,5%"] 595 | |=== 596 | 4+|Set LED Brightness ^|*ID* ^|+0x06+ 597 | |*Command Arguments*|b 4+|brightness (0...127) 598 | 6+|Example: ++[F0 00 21 1D 01 01 **06 40** F7]++ = set LED brightness to 64 599 | |=== 600 | 601 | [cols="25%,10%,20%,35%,5%,5%"] 602 | |=== 603 | 4+|Get LED Brightness ^|*ID* ^|+0x07+ 604 | |*Command Arguments* |_none_ 4+| 605 | |*Reply Arguments* |b 4+|brightness (0..127) 606 | 6+|Example: ++[F0 00 21 1D 01 01 **07** F7]++ = get LED brightness + 607 | Reply: ++[F0 00 21 1D 01 01 **07 10** F7]++ = LED brightness is 16 608 | |=== 609 | 610 | When the Push 2 is USB powered (no external power supply), the global 611 | brightness is automatically limited to 8, to avoid exceeding the USB 612 | current limit. 613 | 614 | [id="LED Animation"] 615 | LED Animation 616 | ^^^^^^^^^^^^^ 617 | 618 | When setting an LED color, except for the touch strip, an animation can 619 | be requested. This changes the LED color over time without the need for 620 | continuous MIDI messages from the host. 621 | 622 | Animations are triggered by using channels 1-15. 623 | 624 | - The starting color of an animation is sent with a note on or 625 | control change message on channel 0. 626 | - The second color, the transition type and duration of the animation are 627 | sent with a note on or control change message on channel 1...15. 628 | - Transitions are stopped by setting a color on channel 0. 629 | - Sending another color on channels 1-15 stops the current transition and 630 | triggers a new one. 631 | 632 | NOTE: In this document, channels are numbered as they are sent 633 | in the MIDI message, i.e. from 0 to 15. 634 | 635 | The encoding of transition type and duration by the channel is given in 636 | the table below. 637 | 638 | .LED Transition Types 639 | [cols="15%,25%,30%,30%",width="70%",options="header"] 640 | |=== 641 | |Channel|Transition|Duration as note|Duration as number of clock messages 642 | |0 |stop transition |- |- 643 | |1 |1-shot |24th |4 644 | |2 |1-shot |16th |6 645 | |3 |1-shot |8th |12 646 | |4 |1-shot |quarter |24 647 | |5 |1-shot |half |48 648 | |6 |pulsing |24th |4 649 | |7 |pulsing |16th |6 650 | |8 |pulsing |8th |12 651 | |9 |pulsing |quarter |24 652 | |10 |pulsing |half |48 653 | |11 |blinking |24th |4 654 | |12 |blinking |16th |6 655 | |13 |blinking |8th |12 656 | |14 |blinking |quarter |24 657 | |15 |blinking |half |48 658 | |=== 659 | 660 | The one-shot transition stops after the given duration, the blinking and 661 | pulsing transitions keep running. 662 | 663 | .LED Transitions 664 | image::LED-Animation.png[width="50%"] 665 | 666 | When a one-shot is finished, the target color is taken over as the 667 | channel 0 value, therefore, to start another one-shot as a transition from the 668 | previous target color to a new target color, it is sufficient to send the new 669 | target color. 670 | 671 | To get a smooth transition when changing otherwise non-animated colors, 672 | instead of sending the new color on channel 0, the host can just send 673 | the new color at channel 1, causing a quick one-shot. 674 | 675 | Animations are timed by MIDI system real time messages sent by the host. 676 | 677 | The MIDI start (+0xFA+) and continue (+0xFB+) messages reset the global 678 | animation phase. This phase is used for blinking and pulsing 679 | animations, which are therefore all synchronized. The MIDI clock message 680 | (+0xF8+) advances the animation phase by 1/24th beat (i.e. a 1/96th note). 681 | 682 | One-shot animations all run with their individual phase, i.e. they start 683 | when the host sends the target color and stop after the number of clock 684 | messages given in the table above. 685 | 686 | After a MIDI stop message (+0xFC+), the animations continue to run at the 687 | last received tempo. If the host never sent a MIDI start message, the animations 688 | run at a tempo of 120 bpm. 689 | 690 | As usual with MIDI-over-USB interfaces, system real time 691 | messages should not be sent in the middle of other MIDI messages. 692 | 693 | [id="PWM Frequency"] 694 | PWM Frequency 695 | ^^^^^^^^^^^^^ 696 | 697 | The PWM frequency can be adjusted to avoid interference with shutter 698 | frequencies of video cameras, which otherwise lead to visual flicker in 699 | the video recordings. This is done by a correction factor. The default 700 | correction corresponds to a 100Hz PWM base frequency, which works with 701 | most video cameras. The maximum possibly frequency is 116 Hz. The usable 702 | range, where the LEDs do not show any flickering for human observers 703 | even in critical light conditions and viewing angles, starts at approx. 704 | 60 Hz. 705 | 706 | The "Set LED PWM Frequency Correction" sysex command adjusts the LED PWM 707 | frequency. 708 | 709 | [cols="25%,10%,20%,35%,5%,5%"] 710 | |=== 711 | 4+|Set LED PWM Frequency Correction ^|*ID* ^|+0x0B+ 712 | .3+|*Command Arguments*|n (LSB) |lowest 7 bits 3.3+| correction factor 713 | |n |middle 7 bits 714 | |n (MSB) |highest 7 bit 715 | 6+|Example: ++[F0 00 21 1D 01 01 **0B 05 3D 02** F7]++ = set LED PWM to 60 Hz 716 | |=== 717 | 718 | The correction factor "n" to be passed to the sysex command is a 719 | non-negative integer in the range 0...2097151. The resulting PWM base 720 | frequency f0 in Hz is calculated as: 721 | 722 | f0 = 5000000 / (42752 + n) 723 | 724 | To calculate the correction factor from the frequency: 725 | 726 | n = (5000000 / f0) – 42752 727 | 728 | For 100 Hz, n=7248, for 60 Hz, n=40581. 729 | 730 | [id="Buttons"] 731 | Buttons 732 | ~~~~~~~ 733 | 734 | The buttons send the following MIDI control change messages: 735 | 736 | [listing] 737 | -- 738 | Button Pressed: 10110000 0nnnnnnn 01111111 [10110000 = 0xB0 = 176] 739 | Button Released: 10110000 0nnnnnnn 00000000 740 | -- 741 | 742 | - The control change number +nnnnnnn+ (0...127) corresponds to 743 | the pressed button. See <>. 744 | 745 | [float] 746 | Examples 747 | ++++++++ 748 | [cols="31%,18%,14%,37%",options="header"] 749 | |=== 750 | |Binary | Hexadecimal | Decimal | Event 751 | |++10110000 00001001 01111111++ | ++0xB0 0x09 0x7F++ | ++176 9 127++ | metronome button pressed 752 | |++10110000 00001001 00000000++ | ++0xB0 0x09 0x00++ | ++176 9 0++ | metronome button released 753 | |=== 754 | 755 | [id="Pads"] 756 | Pads 757 | ~~~~ 758 | 759 | The pads send the following MIDI note-on/off messages: 760 | 761 | [listing] 762 | -- 763 | Pad Pressed: 10010000 0nnnnnnn 0vvvvvvv [10010000 = 0x90 = 144, note on] 764 | Pad Released: 10000000 0nnnnnnn 00000000 [10000000 = 0x80 = 128, note off] 765 | -- 766 | 767 | - The note number +nnnnnnn+ (0...127) corresponds to the pad. See <>. 768 | 769 | - The velocity +vvvvvvv+ (1...127) reflects how hard the pad was hit or pressed. 770 | The velocity is influenced by the velocity curve, the pad parameters and individual 771 | pad calibration. 772 | 773 | [float] 774 | Examples 775 | ++++++++ 776 | [cols="31%,18%,14%,37%",options="header"] 777 | |=== 778 | |Binary | Hexadecimal | Decimal | Event 779 | |++10010000 00100100 01111111++ | ++0x90 0x24 0x7F++ | ++176 36 127++ | left bottom pad hit hard 780 | |++10010000 00101011 00000001++ | ++0x90 0x2B 0x01++ | ++176 43 1++ | right bottom pad pressed softly 781 | |++10000000 01100011 00000000++ | ++0x80 0x63 0x00++ | ++176 99 0++ | right top pad released 782 | |=== 783 | 784 | [id="Velocity Curve"] 785 | Velocity Curve 786 | ^^^^^^^^^^^^^^ 787 | 788 | The pad signal processing algorithm produces notes with a certain 789 | velocity (1...127) derived from the measured weight (0..4095 g). For 790 | this purpose, the firmware does an interpolation using a conversion 791 | table with 128 entries. The entries contain the velocities that 792 | correspond to the weights 0 g, 32 g, 64 g, 96 g, ..., 4064 g. For weights 793 | above that, the velocity for 4064g (index 127) is taken. 794 | 795 | The "Set/Get Pad Velocity Curve Entry" sysex commands allow to read and 796 | modify this table. The velocity range is 1...127. 797 | 798 | [cols="25%,10%,20%,35%,5%,5%"] 799 | |=== 800 | 4+|Set Pad Velocity Curve Entry ^|*ID* ^|+0x20+ 801 | .6+|*Command Arguments* |i 4+|start index (one of 0, 16, 32, 48, 64, 80, 96, 112) 802 | |v0 4+|velocity for index i 803 | |v1 4+|velocity for index i + 1 804 | |v2 4+|velocity for index i + 2 805 | 5+|... 806 | |v15 4+|velocity for index i + 15 807 | 6+|Example: ++[F0 00 21 1D 01 01 **20 10 3E 41 44 46 49 4B 4D 50 52 54 56 59 5B 5D 5F 62** F7]++ = 808 | set pad velocities for indices 16...31, corresponding to weights 32...62 g 809 | |=== 810 | 811 | [cols="25%,10%,20%,35%,5%,5%"] 812 | |=== 813 | 4+|Get Pad Velocity Curve Entry ^|*ID* ^|+0x21+ 814 | |*Command Arguments* |i 4+|index (0...127) 815 | .2+|*Reply Arguments* |i 4+|index (0...127) 816 | |v 4+|velocity 817 | 6+|Example: ++[F0 00 21 1D 01 01 **21 11** F7]++ = get pad velocity at index 17 (34g) + 818 | Reply: ++[F0 00 21 1D 01 01 **21 11 3E** F7]++ = velocity for index 17 is 62 819 | |=== 820 | 821 | [id="Pad Parameters"] 822 | Pad Parameters 823 | ^^^^^^^^^^^^^^ 824 | 825 | The "Set Pad Parameters" sysex commands allows to set some parameters 826 | that apply to all 64 pads. 827 | 828 | [cols="25%,10%,20%,35%,5%,5%"] 829 | |=== 830 | 4+|Set Pad Parameters ^|*ID* ^|+0x1B+ 831 | .8+|*Command Arguments*|t0 (LSB) |lower 7 bits 3.2+|parameter 0 (unused) 832 | |t0 (MSB) |higher 5 bits 833 | |t1 (LSB) |lower 7 bits 3.2+|parameter 1 (unused) 834 | |t1 (MSB) |higher 5 bits 835 | |a0 (LSB) |lower 7 bits 3.2+|lower aftertouch threshold, must be > 400 836 | |a0 (MSB) |higher 5 bits 837 | |a1 (LSB) |lower 7 bits 3.2+|upper aftertouch threshold, must be 838 | greater then the lower threshold a0 839 | |a1 (MSB) |higher 5 bits 840 | 6+|Example: ++[F0 00 21 1D 01 01 **1B 00 00 00 00 44 09 22 0C** F7]++ = set pad aftertouch range to 1220 ... 1570 841 | |=== 842 | 843 | All values are in range 0...4095. At the moment, only the aftertouch 844 | threshold is used. It is adjusted by the Push 2 script together with the 845 | velocity curve. The set of pad parameters used by the firmware is subject 846 | to change. 847 | 848 | [id="Pad Settings"] 849 | Pad Settings 850 | ^^^^^^^^^^^^ 851 | 852 | The "Select/Get Selected Pad Settings" sysex commands allows to select one 853 | of three available sets of pad parameter values called settings, or to read the 854 | currently selected settings. The purpose is to reduce the 855 | sensitivity of pads that should not be triggered "by accident", like a 856 | loop selector near drum pads. By passing 0, 0 as scene and track, the 857 | settings for all pads can be selected. 858 | 859 | [cols="25%,10%,20%,35%,5%,5%"] 860 | |=== 861 | 4+|Select Pad Settings ^|*ID* ^|+0x28+ 862 | .3+|*Command Arguments*|ss 4+|scene 1 (top) ... 8 (bottom), or 0 (all pads) 863 | |tt 4+|track 1 (left) ... 8 (right), or 0 (all pads) 864 | |nn 4+|settings (0-regular, 1-reduced sensitivity, 2-low sensitivity) 865 | 6+|Example: ++[F0 00 21 1D 01 01 **28 03 06 02** F7]++ = set sixth 866 | pad in third row to low sensitivity 867 | |=== 868 | 869 | [cols="25%,10%,20%,35%,5%,5%"] 870 | |=== 871 | 4+|Get Selected Pad Settings ^|*ID* ^|+0x29+ 872 | .2+|*Command Arguments*|ss 4+|scene 1 (top) ... 8 (bottom) 873 | |tt 4+|track 1 (left) ... 8 (right) 874 | .3+|*Reply Arguments* |ss 4+|scene 1 (top) ... 8 (bottom) 875 | |tt 4+|track 1 (left) ... 8 (right) 876 | |nn 4+|settings (0...2) 877 | 6+|Example: ++[F0 00 21 1D 01 01 **29 03 06** F7]++ = get settings selected for scene 3 track 6 + 878 | Reply: ++[F0 00 21 1D 01 01 **29 03 06 00** F7]++ = regular sensitivity is selected for this pad 879 | |=== 880 | 881 | [id="Individual Pad Calibration"] 882 | Individual Pad Calibration 883 | ^^^^^^^^^^^^^^^^^^^^^^^^^^ 884 | 885 | Individual pad calibration is done using 400g values measured in the 886 | factory and written into the flash memory of the device. The "Read 400g 887 | Pad Values From Flash" sysex command allows to read these values. 888 | 889 | [cols="25%,10%,20%,35%,5%,5%"] 890 | |============================================= 891 | 4+|Read 400g Pad Values From Flash ^|*ID* ^|+0x1D+ 892 | |*Command Arguments*|s 4+|scene (1=top ... 8=bottom) 893 | .17+|*Reply Arguments*|s 4+|scene (1=top ... 8=bottom) 894 | |v0 (LSB) |lower 7 bits 3.2+|400g value for track 1 (leftmost) 895 | |v0 (MSB) |higher 5 bits 896 | |v1 (LSB) |lower 7 bits 3.2+|400g value for track 2 897 | |v1 (MSB) |higher 5 bits 898 | |v2 (LSB) |lower 7 bits 3.2+|400g value for track 3 899 | |v2 (MSB) |higher 5 bits 900 | |v3 (LSB) |lower 7 bits 3.2+|400g value for track 4 901 | |v3 (MSB) |higher 5 bits 902 | |v4 (LSB) |lower 7 bits 3.2+|400g value for track 5 903 | |v4 (MSB) |higher 5 bits 904 | |v5 (LSB) |lower 7 bits 3.2+|400g value for track 6 905 | |v5 (MSB) |higher 5 bits 906 | |v6 (LSB) |lower 7 bits 3.2+|400g value for track 7 907 | |v6 (MSB) |higher 5 bits 908 | |v7 (LSB) |lower 7 bits 3.2+|400g value for track 8 (rightmost) 909 | |v7 (MSB) |higher 5 bits 910 | 6+|Example: ++[F0 00 21 1D 01 01 **1D 04** F7]++ = get 400g values for scene 4 (fourth row of pads) + 911 | Reply: ++[F0 00 21 1D 01 01 **1D 04 41 0C 42 0C 43 0C 44 0C 45 0C 46 0C 47 0C 48 0C** F7]++ = values for scene 4 range from 1601 to 1608 912 | |============================================= 913 | 914 | The values measured in the factory are the values that are in effect by 915 | default. They might be overwritten using the "Set Temporary 400g Pad 916 | Values" sysex command. 917 | 918 | [cols="25%,10%,20%,35%,5%,5%"] 919 | |============================================= 920 | 4+|Set Temporary 400g Pad Values ^|*ID* ^|+0x22+ 921 | .17+|*Command Arguments*|s 4+|scene (1=top ... 8=bottom) 922 | |v0 (LSB) |lower 7 bits 3.2+|400g value for track 1 (leftmost) 923 | |v0 (MSB) |higher 5 bits 924 | |v1 (LSB) |lower 7 bits 3.2+|400g value for track 2 925 | |v1 (MSB) |higher 5 bits 926 | |v2 (LSB) |lower 7 bits 3.2+|400g value for track 3 927 | |v2 (MSB) |higher 5 bits 928 | |v3 (LSB) |lower 7 bits 3.2+|400g value for track 4 929 | |v3 (MSB) |higher 5 bits 930 | |v4 (LSB) |lower 7 bits 3.2+|400g value for track 5 931 | |v4 (MSB) |higher 5 bits 932 | |v5 (LSB) |lower 7 bits 3.2+|400g value for track 6 933 | |v5 (MSB) |higher 5 bits 934 | |v6 (LSB) |lower 7 bits 3.2+|400g value for track 7 935 | |v6 (MSB) |higher 5 bits 936 | |v7 (LSB) |lower 7 bits 3.2+|400g value for track 8 (rightmost) 937 | |v7 (MSB) |higher 5 bits 938 | 6+|Example: ++[F0 00 21 1D 01 01 **22 01 40 0C 40 0C 40 0C 40 0C 40 0C 40 0C 40 0C 40 0C** F7]++ = set all 400g values for scene 1 (topmost row of pads) to 1600 939 | |============================================= 940 | 941 | The overwritten values are in effect until the device is rebooted. Pad 942 | values are in range from 0 to 4095. The 400g reference value is 1690. 943 | Higher 400g values are compensated in the firmware by lowering the 944 | resulting velocities somewhat, for lower 400g values the velocities are 945 | boosted. The 400g values have no effect on the note-on threshold (both 946 | in the pad physics and in the algorithm interpreting the read values). 947 | 948 | [id="Aftertouch"] 949 | Aftertouch 950 | ^^^^^^^^^^ 951 | 952 | While a pad is pressed, it may send MIDI aftertouch messages. Depending 953 | on the aftertouch mode, either channel pressure or polyphonic key 954 | pressure is sent. 955 | 956 | [listing] 957 | -- 958 | Channel Pressure: 11010000 0vvvvvvv [11010000 = 0xD0 = 208] 959 | Polyphonic Key Pressure: 10100000 0nnnnnnn 0vvvvvvv [10100000 = 0xA0 = 160] 960 | -- 961 | 962 | - The note number +nnnnnnn+ (0...127) corresponds to the pad. See <>. 963 | 964 | - The value +vvvvvvv+ reflects how hard the pad is pressed. 965 | 966 | In channel pressure mode, the pad with the highest pressure determines 967 | the value sent. The pressure range that produces aftertouch is given 968 | by the aftertouch threshold pad parameters. The value curve is linear to the 969 | pressure and in range 0 to 127. See <>. 970 | 971 | In polyphonic key pressure mode, aftertouch for each 972 | pressed key is sent individually. The value is defined by the 973 | pad velocity curve and in range 1...127. See <>. 974 | 975 | [float] 976 | Examples 977 | ++++++++ 978 | [cols="31%,18%,14%,37%",options="header"] 979 | |=== 980 | |Binary | Hexadecimal | Decimal | Event 981 | |++11010000 01111111++ | ++0xD0 0x7F++ | ++208 127++ | maximum channel pressure 982 | |++11010000 00000000++ | ++0xD0 0x00++ | ++208 0++ | no channel pressure (i.e. released) 983 | |++10100000 00100100 01111111++ | ++0xA0 0x24 0x7F++ | ++160 36 127++ | maximum key pressure on bottom left pad 984 | |++10100000 00100100 00000001++ | ++0xA0 0x24 0x01++ | ++160 36 1++ | minimum key pressure on bottom left pad 985 | |=== 986 | 987 | The aftertouch mode can be set or retrieved using the "Set/Get 988 | Aftertouch Mode" sysex commands. The default is channel pressure. 989 | 990 | [cols="25%,10%,20%,35%,5%,5%"] 991 | |=== 992 | 4+|Set Aftertouch Mode ^|*ID* ^|+0x1E+ 993 | |*Command Arguments*|m 4+|aftertouch mode (0 = channel pressure, 1 = polyphonic key pressure) 994 | 6+|Example: ++[F0 00 21 1D 01 01 **1E 1** F7]++ = set pad aftertouch mode to "polyphonic key pressure" 995 | |=== 996 | 997 | [cols="25%,10%,20%,35%,5%,5%"] 998 | |=== 999 | 4+|Get Aftertouch Mode ^|*ID* ^|+0x1F+ 1000 | |*Command Arguments*|_none_ 4+| 1001 | |*Reply Arguments* |m 4+|aftertouch mode (see above) 1002 | 6+|Example: ++[F0 00 21 1D 01 01 **1F** F7]++ = get aftertouch mode + 1003 | Reply: ++[F0 00 21 1D 01 01 **1F 0** F7]++ = aftertouch mode is "channel pressure" 1004 | |=== 1005 | 1006 | [id="Encoders"] 1007 | Encoders 1008 | ~~~~~~~~ 1009 | 1010 | The encoders, when turned, send the following MIDI control change 1011 | messages: 1012 | 1013 | [listing] 1014 | -- 1015 | Turn Right: 10110000 0nnnnnnn 00xxxxxx [10110000 = 0xB0 = 176] 1016 | Turn Left: 10110000 0nnnnnnn 01yyyyyy 1017 | -- 1018 | 1019 | - The controller number +nnnnnnn+ (0...127) corresponds to the encoder. 1020 | See <>. 1021 | 1022 | - The value +0xxxxxx+ or +1yyyyyy+ gives the amount of accumulated 1023 | movement since the last message. The faster you move, the higher the value. 1024 | 1025 | The value is given as a 7 bit relative value encoded 1026 | in two’s complement. +0xxxxxx+ indicates a movement to 1027 | the right, with decimal values from 1 to 63 (in practice, values 1028 | above 20 are unlikely). +1yyyyyy+ means movement to the left, with 1029 | decimal values from 127 to 64. 1030 | 1031 | The total step count sent for a 360° turn is approx. 210, except for the 1032 | detented tempo encoder, where one turn is 18 steps. 1033 | 1034 | [float] 1035 | Examples 1036 | ++++++++ 1037 | [cols="31%,18%,14%,37%",options="header"] 1038 | |=== 1039 | |Binary | Hexadecimal | Decimal | Event 1040 | |++10110000 01001111 00000001++ | ++0xB0 0x4F 0x01++ | ++176 79 1++ | master encoder turned right by 1 step 1041 | |++10110000 01001111 00001010++ | ++0xB0 0x4F 0x0A++ | ++176 79 10++ | master encoder turned right by 10 steps 1042 | |++10110000 00001110 01111111++ | ++0xB0 0x0E 0x7F++ | ++176 14 127++ | tempo encoder turned left by 1 step 1043 | |++10110000 00001110 01111100++ | ++0xB0 0x0E 0x7C++ | ++176 14 124++ | tempo encoder turned left by 4 steps 1044 | |=== 1045 | 1046 | When touched or released, the encoders send note on messages with 1047 | velocity 127 or 0. 1048 | 1049 | [listing] 1050 | -- 1051 | Encoder Touched: 10010000 0nnnnnnn 01111111 [10010000 = 0x90 = 144] 1052 | Encoder Released: 10010000 0nnnnnnn 00000000 1053 | -- 1054 | 1055 | - The note number +nnnnnnn+ (0...127) corresponds to the encoder. 1056 | See <>. 1057 | 1058 | [float] 1059 | Examples 1060 | ++++++++ 1061 | [cols="31%,18%,14%,37%",options="header"] 1062 | |=== 1063 | |Binary | Hexadecimal | Decimal | Event 1064 | |++10010000 01000111 01111111++ | ++0x90 0x47 0x7F++ | ++144 71 127++ | leftmost track encoder touched 1065 | |++10010000 01000111 00000000++ | ++0x90 0x47 0x00++ | ++144 71 0++ | leftmost track encoder released 1066 | |=== 1067 | 1068 | [id="Touch Strip"] 1069 | Touch Strip 1070 | ~~~~~~~~~~~ 1071 | 1072 | The touch strip is a bit more complicated, because it can be configured 1073 | to run in different modes. The behavior will be explained as the 1074 | different configuration flags are discussed. 1075 | 1076 | Independently of the configuration, the touch strip sends note on 1077 | messages with velocity 127 or 0 when the finger touches the strip or is 1078 | lifted off. 1079 | 1080 | [listing] 1081 | -- 1082 | Touch Strip Touched: 10010000 00001100 01111111 [10010000 = 0x90 = 144] 1083 | Touch Strip Released: 10010000 00001100 00000000 1084 | -- 1085 | 1086 | - The note number +00001100+ (decimal 12) refers to the touch strip. See <>. 1087 | 1088 | [float] 1089 | Examples 1090 | ++++++++ 1091 | [cols="31%,18%,14%,37%",options="header"] 1092 | |=== 1093 | |Binary | Hexadecimal | Decimal | Event 1094 | |++10010000 00001100 01111111++ | ++0x90 0x0C 0x7F++ | ++144 12 127++ | touch strip touched 1095 | |++10010000 00001100 00000000++ | ++0x90 0x0C 0x00++ | ++144 12 0++ | touch strip released 1096 | |=== 1097 | 1098 | Touch Strip Configuration 1099 | ^^^^^^^^^^^^^^^^^^^^^^^^^ 1100 | 1101 | The sysex commands "Set/Get Touch Strip Configuration" define the touch 1102 | strip behavior by a number of flags in a 7 bit configuration setting. 1103 | 1104 | [cols="25%,10%,20%,35%,5%,5%"] 1105 | |=== 1106 | 4+|Set Touch Strip Configuration ^|*ID* ^|+0x17+ 1107 | |*Command Arguments*|t 4+|configuration flags 1108 | 6+|Example: ++[F0 00 21 1D 01 01 **17 68** F7]++ = set touch strip configuration to 1101000 1109 | |=== 1110 | 1111 | [cols="25%,10%,20%,35%,5%,5%"] 1112 | |=== 1113 | 4+|Get Touch Strip Configuration ^|*ID* ^|+0x18+ 1114 | |*Command Arguments*|_none_ 4+| 1115 | |*Reply Arguments* |t 4+|configuration flags 1116 | 6+|Example: ++[F0 00 21 1D 01 01 **18** F7]++ = get touchstrip configuration + 1117 | Reply: ++[F0 00 21 1D 01 01 **18 25** F7]++ = touchstrip configuration is 0100101 1118 | |=== 1119 | 1120 | [subs="quotes"] 1121 | ----------------------------------------------------------------------- 1122 | Configuration Flags 1123 | --------------- 1124 | bit |6|5|4|3|2|1|0| 1125 | --------------- | 0 | 1 1126 | | | | | | | | --------------------\+-------------+---------- 1127 | | | | | | | --- LEDs Controlled By | **Push 2*** | Host 1128 | | | | | | ----- Host Sends | **Values*** | Sysex 1129 | | | | | ------- Values Sent As | **Pitch Bend*** | Mod Wheel 1130 | | | | --------- LEDs Show | a Bar | **a Point*** 1131 | | | ----------- Bar Starts At | **Bottom*** | Center 1132 | | ------------- Do Autoreturn | No | **Yes*** 1133 | --------------- Autoreturn To | Bottom | **Center*** 1134 | 1135 | *) The default settings are marked in bold. 1136 | 1137 | ----------------------------------------------------------------------- 1138 | 1139 | 1140 | [float] 1141 | Touchstrip Configuration Flags Examples 1142 | +++++++++++++++++++++++++++++++++++++++ 1143 | [cols="12%,12%,12%,49%,15%",options="header"] 1144 | |=== 1145 | |Binary | Hexadecimal | Decimal | Configuration | Typical Application 1146 | |++1101000++ | ++0x68++ | ++104++ | *Default*: Push 2 controls LEDs as single point with autoreturn to center, sends pitch bend | Pitch bend control 1147 | |++0001100++ | ++0x0C++ | ++12++ | Push 2 controls LEDs as bar starting at bottom, no autoreturn, sends modulation | Volume control 1148 | |++0000011++ | ++0x03++ | ++3++ | Host controls LEDs using Sysex, Push 2 sends pitch bend | Drum rack MIDI range selection 1149 | |=== 1150 | 1151 | Below a description of each of the configuration flags is given. 1152 | 1153 | LEDs Controlled By 1154 | ++++++++++++++++++ 1155 | 1156 | - If LEDs are controlled by Push 2 (flag = 0), the touch strip hardware 1157 | sends the value both to the LEDs hardware as well as to the host, 1158 | simultaneously. Values received from the host are ignored. 1159 | 1160 | - If LEDs are controlled by the host (flag = 1), the touch strip hardware 1161 | sends the value to the host only. The host then might or might not send 1162 | an update to the LEDs. The host might even ignore the values sent by the 1163 | touch strip hardware and control the LEDs arbitrarily. 1164 | 1165 | Host Sends 1166 | ++++++++++ 1167 | 1168 | This flag is only relevant if the LEDs are controlled by the host. 1169 | 1170 | - If the flag is 0 ("send values"), the host may send pitch bend or mod 1171 | wheel (depending on the "Values Sent As" flag) to control the LEDs. The 1172 | sysex command "Set Touch Strip LEDs" is ignored. 1173 | 1174 | - If the flag is 1 ("send sysex"), the host may send the "Set Touch Strip 1175 | LEDs" sysex command to set the LEDs. Pitch bend or mod wheel are ignored 1176 | in this case. LED 0 is the bottom LED, LED30 is the top LED. The LED__n__ 1177 | values are color indices from 0 to 7. See <>. 1178 | 1179 | [cols="25%,11%,^8%,^8%,^8%,^8%,^8%,^8%,^8%,^8%"] 1180 | |=== 1181 | 8+|Set Touch Strip LEDs <| *ID* <|0x19 1182 | .18+|*Command Arguments* | *Argument* 8+| *Bits* 1183 | | ^| *7* | *6* | *5* | *4* | *3* | *2* | *1* | *0* 1184 | |b0 ^| 0 | 0 3+|LED1 3+|LED 0 1185 | |b1 ^| 0 |0 3+|LED3 3+|LED 2 1186 | |b2 ^| 0 |0 3+|LED5 3+|LED 4 1187 | |b3 ^| 0 |0 3+|LED7 3+|LED 6 1188 | |b4 ^| 0 |0 3+|LED9 3+|LED 8 1189 | |b5 ^| 0 |0 3+|LED11 3+|LED 10 1190 | |b6 ^| 0 |0 3+|LED13 3+|LED 12 1191 | |b7 ^| 0 |0 3+|LED15 3+|LED 14 1192 | |b8 ^| 0 |0 3+|LED17 3+|LED 16 1193 | |b9 ^| 0 |0 3+|LED19 3+|LED 18 1194 | |b10 ^| 0 |0 3+|LED21 3+|LED 20 1195 | |b11 ^| 0 |0 3+|LED23 3+|LED 22 1196 | |b12 ^| 0 |0 3+|LED25 3+|LED 24 1197 | |b13 ^| 0 |0 3+|LED27 3+|LED 26 1198 | |b14 ^| 0 |0 3+|LED29 3+|LED 28 1199 | |b15 ^| 0 |0 |0 |0 |0 3+|LED 30 1200 | 10+|Example: ++[F0 00 21 1D 01 01 **19 27 24 27 24 27 24 27 24 27 24 27 24 27 24 27 4** F7]++ = set each fourth touch strip LED to full brightness, the others are half lit 1201 | |=== 1202 | 1203 | Values Sent As 1204 | ++++++++++++++ 1205 | 1206 | This flag selects if pitch bend or mod wheel messages are sent. This 1207 | selects which messages the touch strip hardware sends to the host, 1208 | as well as which messages from the host are accepted to change the LEDs 1209 | (the latter only if LEDs are controlled by the host and the host sends 1210 | values). 1211 | 1212 | [listing] 1213 | -- 1214 | Pitch Bend: 11100000 0q000000 0ppppppp [11100000 = 0xE0 = 224] 1215 | Mod Wheel: 10110000 00000001 0vvvvvvv [10110000 = 0xB0 = 176] 1216 | -- 1217 | 1218 | - The pitch bend message contains a 14 bit pitch value +pppppppq000000+ 1219 | (0 ... 16320, neutral pitch level is 8192 = +10000000000000+). Please note that 1220 | the least significant 7 bits are sent first. 1221 | Only 8 bits are used by Push 2, the 6 less significant bits are always zero. 1222 | 1223 | - The mod wheel message is a control change for controller number 1. 1224 | It contains a 7 bit modulation value +vvvvvvv+ (0 ... 127, 1225 | the center value is 64). 1226 | 1227 | For both types of messages the zero value corresponds to the bottom of 1228 | Push 2 (near the "Play" button), the maximum value is at the top (near 1229 | the "Stop Clip" button). 1230 | 1231 | [float] 1232 | Touchstrip Value Examples 1233 | +++++++++++++++++++++++++ 1234 | [cols="31%,18%,14%,37%",options="header"] 1235 | |=== 1236 | |Binary | Hexadecimal | Decimal | Event 1237 | |++11100000 01000000 01111111++ | ++0xE0 0x40 0x7F++ | ++224 64 127++ | pitch bend at top 1238 | |++11100000 01000000 01000000++ | ++0xE0 0x40 0x40++ | ++224 64 64++ | pitch bend 1 step above center 1239 | |++11100000 00000000 01000000++ | ++0xE0 0x00 0x40++ | ++224 0 64++ | pitch bend at center 1240 | |++11100000 01000000 00111111++ | ++0xE0 0x40 0x3F++ | ++224 64 63++ | pitch bend 1 step below center 1241 | |++11100000 00000000 00000000++ | ++0xE0 0x00 0x00++ | ++224 0 0++ | pitch bend at bottom 1242 | |++10110000 00000001 01111111++ | ++0xB0 0x01 0x7F++ | ++176 1 127++ | mod wheel at top 1243 | |++10110000 00000001 01000001++ | ++0xB0 0x01 0x41++ | ++176 1 65++ | mod wheel 1 step above center 1244 | |++10110000 00000001 01000000++ | ++0xB0 0x01 0x40++ | ++176 1 64++ | mod wheel at center 1245 | |++10110000 00000001 00111111++ | ++0xB0 0x01 0x3F++ | ++176 1 63++ | mod wheel 1 step below center 1246 | |++10110000 00000001 00000000++ | ++0xB0 0x01 0x00++ | ++176 1 0++ | mod wheel at bottom 1247 | |=== 1248 | 1249 | 1250 | LEDs Show 1251 | +++++++++ 1252 | 1253 | This flag is only relevant if either the LEDs are controlled by Push 2 or 1254 | the host sends values. 1255 | 1256 | - If the LEDs show a bar (flag = 0), then the current value from the touch 1257 | strip hardware or from the host is taken to light up all LEDs from the 1258 | bar start point (see next flag) up to the LED corresponding to the 1259 | current value. 1260 | 1261 | - If the LEDs show a point (flag = 1), only the LED corresponding to the 1262 | current value is lit. 1263 | 1264 | Bar Starts At 1265 | +++++++++++++ 1266 | 1267 | This flag is only relevant if the LEDs show a bar. 1268 | 1269 | - If the bar starts at the bottom (flag = 0), then the lowest LED (near 1270 | the play button) is the start point for the bar. The bar is always drawn 1271 | upwards. 1272 | 1273 | - If the bar starts at the center (flag = 1), the middle LED (near the 1274 | "New" button, at the same level as the horizontal center line of the 1275 | pads) is the start point for the bar. The bar is drawn upwards if the 1276 | current value is greater than the center value and downwards if it is 1277 | less than the center value. 1278 | 1279 | Do Autoreturn 1280 | +++++++++++++ 1281 | 1282 | This flag decides if the touch strip hardware returns to a neutral value 1283 | when the user lifts the finger off the strip. The neutral value may be 1284 | at the bottom or the center of the strip depending on the "Autoreturn 1285 | to" flag. 1286 | 1287 | - If autoreturn is to be done (flag = 1), then the touch strip hardware 1288 | sends the neutral value as soon as the touch strip is released, just 1289 | before the note-on message with velocity 0 that indicates the touch 1290 | strip release. 1291 | 1292 | - If autoreturn is off (flag = 0), then the touch strip just sends the 1293 | note-on message with velocity 0, leaving the value at the position where 1294 | the finger was lift. 1295 | 1296 | Autoreturn To 1297 | +++++++++++++ 1298 | 1299 | This flag is only relevant if the "Do autoreturn" flag is 1. 1300 | 1301 | - If autoreturn to bottom (flag = 0) is selected, the touch strip hardware 1302 | resets itself to the value corresponding to the bottom of the touch 1303 | strip when releasing the touch. 1304 | 1305 | - If autoreturn to center (flag = 1) is selected, the touch strip hardware 1306 | jumps to the center value of the touch strip when the finger is lifted. 1307 | 1308 | [id="Pedals"] 1309 | Pedals 1310 | ~~~~~~ 1311 | 1312 | Push 2 has 2 pedal jacks, which can be connected to one or two pedals 1313 | using mono or stereo jacks. 1314 | 1315 | Pedal jack 1 is the one to the right when looking from the normal Push 2 1316 | user's point of view, i.e. the one near the ON/OFF switch, pedal jack 2 is 1317 | to the left of it, further away from the ON/OFF switch. 1318 | 1319 | Since there are no unified industry standards for pedals, Push 2 can be 1320 | configured to support many different kinds of (passive) pedals with 1321 | 6.35mm (1/4 inch) phone plugs: 1322 | 1323 | - switched (ON/OFF) or expression and volume pedals (for certain mono 1324 | volume pedals two cables/jacks are needed to connect a single pedal) 1325 | - resistance range between 10k and 300k 1326 | - all kinds of connection schemes, tip or ring, with or without offset 1327 | pots etc. 1328 | - linear or logarithmical or other tapers, heel down on or off, forward 1329 | or inverted 1330 | - it is also possible to use x/y controllers with two separate potentiometers, 1331 | one at the tip and one at the ring 1332 | 1333 | By default, the pedals are configured as ON/OFF switches, connected when 1334 | pressed, sending control change messages: 1335 | 1336 | - 64 "Sustain" for jack 1 (right) 1337 | - 69 "Hold 2" for jack 2 (left) 1338 | 1339 | The pedal configuration process is typically started by sampling the 1340 | pedal values, while asking the user to move the pedal to be configured. 1341 | This allows to find out where the pedal is connected and how the 1342 | measured values behave. Then the pedal jack parameters and the pedal 1343 | value curve are configured. The pedal configuration is not persistent. 1344 | 1345 | [id="Pedal Sampling"] 1346 | Pedal Sampling 1347 | ^^^^^^^^^^^^^^ 1348 | 1349 | The "Sample Pedal Data" sysex command accumulates the ADC readings of 1350 | the 4 pedal wires (left/right jack, tip/ring contact) over a certain 1351 | sample count and sends a reply containing the averages for each of the 1352 | wires. 1353 | 1354 | [cols="25%,10%,20%,35%,5%,5%"] 1355 | |=== 1356 | 4+|Sample Pedal Data ^|*ID* ^|+0x13+ 1357 | |*Command Arguments* |n 4+|log2 of number of samples to average (0..19) 1358 | .8+|*Reply Arguments* |d0 (LSB) |lower 7 bits 3.2+|pedal 1 (right) contact 0 (ring) 1359 | |d0 (MSB) |higher 5 bit 1360 | |d1 (LSB) |lower 7 bits 3.2+|pedal 1 (right) contact 1 (tip) 1361 | |d1 (MSB) |higher 5 bit 1362 | |d2 (LSB) |lower 7 bits 3.2+|pedal 2 (left) contact 0 (ring) 1363 | |d2 (MSB) |higher 5 bit 1364 | |d3 (LSB) |lower 7 bits 3.2+|pedal 2 (left) contact 1 (tip) 1365 | |d3 (MSB) |higher 5 bit 1366 | 6+|Example: ++[F0 00 21 1D 01 01 **13 09** F7]++ = sample pedal data for 512 samples (2^9^, approx 0.4 sec) + 1367 | Reply: ++[F0 00 21 1D 01 01 **13 68 07 5C 0B 50 0F 44 13** F7]++ = results are 1000, 1500, 2000 and 2500 1368 | |=== 1369 | 1370 | [id="Pedal Configuration"] 1371 | Pedal Configuration 1372 | ^^^^^^^^^^^^^^^^^^^ 1373 | 1374 | NOTE: Beginning with firmware version 1.0.58, the new pedal configuration 1375 | commands (codes 0x30, 0x31 and 0x32) replace their old versions (codes 0x11 and 0x12). 1376 | 1377 | The "Configure Pedal" sysex command defines, for one of four 1378 | pedal contacts, if it is active, which MIDI control change message 1379 | is sent, and when and to which port it is sent. 1380 | 1381 | [cols="25%,10%,20%,35%,5%,5%"] 1382 | |=== 1383 | 4+|Configure Pedal ^|*ID* ^|+0x30+ 1384 | .4+|*Command Arguments* 1385 | |x 4+|pedal contact + 1386 | 0 = right jack, ring + 1387 | 1 = right jack, tip + 1388 | 2 = left jack, ring + 1389 | 3 = left jack, tip 1390 | |c 4+|cc number to send (0...126) or 127 to turn contact off 1391 | |m 4+|in which mode to send CC messages + 1392 | 0 - send always (default) + 1393 | 1 - send in Live mode only + 1394 | 2 - send in User mode only + 1395 | 3 - send in Dual mode only 1396 | |p 4+|to which port to send CC messages + 1397 | 0 - send to port according to MIDI mode (default) + 1398 | 1 - send to Live port + 1399 | 2 - send to User port + 1400 | 3 - send to both ports 1401 | 6+|Example: ++[F0 00 21 1D 01 01 **30 02 0B 00 02** F7]++ = configure left jack ring contact to send control change 11 ("expression") in all MIDI modes to User port 1402 | |=== 1403 | 1404 | The pedal curves for each contact define the mapping between measured voltage 1405 | values and pedal positions, by specifying a voltage range and pedal positions 1406 | at equal voltage intervals. The curve in each voltage/position interval is then 1407 | linearly interpolated. The resulting position is mapped directly into CC values. 1408 | 1409 | In other words, the curve contains positions P~0~, P~1~, ..., P~31~ that 1410 | correspond to the equidistant voltage values V~0~, V~1~, ..., V~31~, where 1411 | 1412 | V~i~ = V~hd~ + (V~td~ - V~hd~) * i / 32 , for i = 0...31 1413 | 1414 | V~td~ and V~hd~ are voltages in range 0 ... 4095 that correspond to the 1415 | heel/toe down values given to the "Set Pedal Curve Limits" command below. 1416 | V~hd~ may be less than V~td~ (normal signal) or larger than V~td~ (inverted 1417 | signal), but not equal to V~td~. In practice, they should differ by at least 1418 | 32 units, otherwise the movement cannot be detected reliably. 1419 | 1420 | The positions P~i~ are in range from 0 (heel down) to 255 (toe down), 1421 | which map directly to CC values of 0 ... 127. P~0~ should be 0, P~32~ is not 1422 | transferred but assumed to be 255. The positions curve must 1423 | be rising steadily (P~i~ < = P~i+1~), independently of the relation 1424 | between V~td~ and V~hd~. 1425 | 1426 | For digital ("sustain") pedals, positions P~0~...P~16~ may be 0 and 1427 | P~17~...P~32~ equal to 255. In this case, the interval between 1428 | P~16~ and P~17~ is not interpolated, but either 0 (between V~hd~ and V~16~) 1429 | or 127 (between V~16~ and V~td~) is sent as CC value. 1430 | 1431 | The "Set Pedal Curve Limits" command sets V~td~ and V~hd~ for 1432 | a certain pedal contact. 1433 | 1434 | [cols="25%,10%,20%,35%,5%,5%"] 1435 | |=== 1436 | 4+|Set Pedal Curve Limits ^|*ID* ^|+0x31+ 1437 | .5+|*Command Arguments* 1438 | |x 4+|pedal contact + 1439 | 0 = right jack, ring + 1440 | 1 = right jack, tip + 1441 | 2 = left jack, ring + 1442 | 3 = left jack, tip 1443 | |h (LSB) |lower 7 bits 3.2+|heel down value V~hd~ (corresponds to MIDI value 0) 1444 | |h (MSB) |higher 5 bits 1445 | |t (LSB) |lower 7 bits 3.2+|toe down value V~td~ (corresponds to MIDI value 127) 1446 | |t (MSB) |higher 5 bits 1447 | 6+|Example: ++[F0 00 21 1D 01 01 **31 01 00 19 58 04** F7]++ = configure right 1448 | jack tip contact curve as inverse to span values of 3200 to 600 1449 | |=== 1450 | 1451 | The "Set Pedal Curve Entries" sysex command is used to define the 1452 | relation between the ADC value readings and pedal positions. 1453 | To limit the size of a single sysex message, eight commands are needed 1454 | to define a whole pedal curve. They can be sent in any order. 1455 | 1456 | [cols="25%,10%,20%,35%,5%,5%"] 1457 | |=== 1458 | 4+|Set Pedal Curve Entries ^|*ID* ^|+0x32+ 1459 | .10+|*Command Arguments* 1460 | |x 4+|pedal contact + 1461 | 0 = right jack, ring + 1462 | 1 = right jack, tip + 1463 | 2 = left jack, ring + 1464 | 3 = left jack, tip 1465 | |i 4+|index of first position (one of 0, 4, ..., 28) 1466 | |p (LSB) |lower 7 bits 3.2+|position i 1467 | |p (MSB) |higher 1 bit 1468 | |p (LSB) |lower 7 bits 3.2+|position i + 1 1469 | |p (MSB) |higher 1 bit 1470 | |p (LSB) |lower 7 bits 3.2+|position i + 2 1471 | |p (MSB) |higher 1 bit 1472 | |p (LSB) |lower 7 bits 3.2+|position i + 3 1473 | |p (MSB) |higher 1 bit 1474 | 6+|Example: ++[F0 00 21 1D 01 01 **32 00 04 1E 00 26 00 2D 00 32 00** F7]++ = 1475 | set curve indices 4 ... 7 of right pedal ring contact to positions 30, 38, 45, 50 1476 | |=== 1477 | 1478 | 1479 | [id="Display Backlight"] 1480 | Display Backlight 1481 | ~~~~~~~~~~~~~~~~~ 1482 | 1483 | To see something drawn on the display, the display backlight LEDs must be 1484 | turned on. For this purpose, the "Set/Get Display Brightness" sysex 1485 | command is used. 1486 | 1487 | [cols="25%,10%,20%,35%,5%,5%"] 1488 | |=== 1489 | 4+|Set Display Brightness ^|*ID* ^|+0x08+ 1490 | .2+|*Command Arguments* 1491 | |b (LSB) |lower 7 bits 3.2+|brightness 1492 | |b (MSB) |higher 1 bit 1493 | 6+|Example: ++[F0 00 21 1D 01 01 **08 7F 01** F7]++ = set display brightness to 255 1494 | |=== 1495 | 1496 | [cols="25%,10%,20%,35%,5%,5%"] 1497 | |=== 1498 | 4+|Get Display Brightness ^|*ID* ^|+0x09+ 1499 | |*Command Arguments* |_none_ 4+| 1500 | .2+|*Reply Arguments* 1501 | |b (LSB) |lower 7 bits 3.2+|brightness 1502 | |b (MSB) |higher 1 bit 1503 | 6+|Example: ++[F0 00 21 1D 01 01 **09** F7]++ = get display brightness + 1504 | Reply: ++[F0 00 21 1D 01 01 **09 40 00** F7]++ = display brightness is 64 1505 | |=== 1506 | 1507 | The brightness range goes from 0 (off) to 255 (maximum). 1508 | 1509 | When the Push 2 is USB powered (no external power supply) , the LED 1510 | brightness is automatically limited to 100, with a reduced backlight 1511 | current, resulting in a brightness of about 7% of the maximum possible 1512 | backlight power. 1513 | 1514 | Device Inquiry 1515 | ~~~~~~~~~~~~~~ 1516 | 1517 | The device inquiry allows to obtain the identity and version of the Push 1518 | 2 device. The message format is specified by the MIDI standard. This 1519 | allows to send inquiries to unknown devices. It also means that the 1520 | device inquiry is formatted differently than all the other Push 2 sysex 1521 | messages. 1522 | 1523 | The device inquire sysex message has the following format. 1524 | 1525 | .Device Inquiry Command 1526 | [cols="25%,75%",width="60%",options="header"] 1527 | |=== 1528 | |Message Data|Description 1529 | |+0xF0+ |SOX (start of sysex) 1530 | |+0x7E+ |Universal Non-Realtime Sysex ID 1531 | |+0x01+ |Device ID (may as well be +0x7F+ for "all devices") 1532 | |+0x06+ |SubID1: General Information 1533 | |+0x01+ |SubID2: Identity Request 1534 | |+0xF7+ |EOX (end of sysex) 1535 | 2+|Example: ++[F0 7E 01 06 01 F7]++ = request identity 1536 | |=== 1537 | 1538 | Push 2 will answer with the following message: 1539 | 1540 | .Device Inquiry Reply 1541 | [cols="25%,20%,55%",width="80%",options="header"] 1542 | |=== 1543 | |Message Data 2+|Description 1544 | |++0xF0++ 2+|SOX 1545 | |++0x7E++ 2+|Universal Non-Realtime Sysex ID 1546 | |++0x01++ 2+|Device ID 1547 | |++0x06++ 2+|SubID1: General Information 1548 | |++0x02++ 2+|SubID2: Identity Reply 1549 | |++0x00 0x21 0x1D++ 2+|Manufacturers Sysex ID code 1550 | |++0x67 0x32++ 2+|device family code, 2x7 bits, LSB first (Product ID from USB header) 1551 | |++0x02 0x00++ 2+|device family member code, 2x7 bits, LSB first (Push 2) 1552 | |n 2+|major software revision (7 bits) 1553 | |m 2+|minor software revision (7 bits) 1554 | |k (LSB) |lower 7 bits .2+|software build 1555 | |k (MSB) |higher 7 bits 1556 | |s (LSB) |bits 0... 6 .5+|serial number 1557 | |s |bits 7...13 1558 | |s |bits 14...20 1559 | |s |bits 21...27 1560 | |s (MSB) |bits 28...31 1561 | |r 2+|board revision (7 bits) 1562 | |++0xF7++ 2+|EOX 1563 | 3+|Example reply: ++[F0 7E 01 06 02 00 21 1D 67 32 02 00 01 00 2F 00 73 4D 1F 08 00 01 F7]++ = 1564 | manufacturer 00 21 1D (Ableton), device family 0x1967 (Push), family member 2, 1565 | version 1.0, build 47, serial number 17295091, board revision 1 1566 | |=== 1567 | 1568 | [id="Statistics"] 1569 | Statistics 1570 | ~~~~~~~~~~ 1571 | 1572 | The "Request Statistics" sysex command provides some useful information 1573 | about the Push 2 device. 1574 | 1575 | [cols="25%,10%,20%,35%,5%,5%"] 1576 | |=== 1577 | 4+|Request Statistics ^|*ID* ^|+0x1A+ 1578 | |*Command Arguments* 1579 | |r 4+|run ID to set (1...127, or 0 to keep it unchanged) 1580 | .7+|*Reply Arguments* 1581 | |p 4+|power supply status (1=external power supply, 0=USB power only) 1582 | |r 4+|current run ID 1583 | |t (LSB) |bits 0... 6 3.5+|uptime (seconds since last reboot) 1584 | |t |bits 7...13 1585 | |t |bits 14...20 1586 | |t |bits 21...27 1587 | |t (MSB) |bits 28...31 1588 | 6+|Example: ++[F0 00 21 1D 01 01 **1A** F7]++ = request statistics + 1589 | Reply: ++[F0 00 21 1D 01 01 **1A 01 00 3F 07 00 00 00** F7]++ = external power supply, run ID +0+, uptime 959 sec 1590 | |=== 1591 | 1592 | The run ID is used to identify reboots. If a value in range 1...127 is given to 1593 | the Request Statistics command, the value is set to this value. During a reboot 1594 | the value is reset to zero. If a value of zero is later given to the Request 1595 | Statistics command, the value remains unchanged and is returned in the reply. 1596 | If zero is returned, the device has rebooted in the meantime. 1597 | If the non-zero value that was set before is returned, the device 1598 | did not reboot. 1599 | 1600 | Display Interface 1601 | ----------------- 1602 | 1603 | USB Display Interface Access 1604 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | 1606 | From USB point of view, Push 2 is a composite device with a MIDI 1607 | interface and a generic bulk data interface used to drive the display. 1608 | Libusb is used to access the display interface (see http://libusb.info). 1609 | The library is freely available for Windows, MacOSX and Linux. 1610 | 1611 | Below is some example code to open and close the display interface. 1612 | 1613 | // [source,subs="none"] 1614 | ==== 1615 | ---- 1616 | #ifdef _MSC_VER 1617 | #define _CRT_SECURE_NO_WARNINGS 1618 | #endif 1619 | 1620 | #include 1621 | 1622 | #ifdef _WIN32 1623 | 1624 | // see following link for a discussion of the 1625 | // warning suppression: 1626 | // http://sourceforge.net/mailarchive/forum.php? 1627 | // thread_name=50F6011C.2020000%40akeo.ie&forum_name=libusbx-devel 1628 | 1629 | // Disable: warning C4200: nonstandard extension used: 1630 | // zero-sized array in struct/union 1631 | #pragma warning(disable:4200) 1632 | 1633 | #include 1634 | #endif 1635 | 1636 | #ifdef __linux__ 1637 | #include 1638 | #else 1639 | #include "libusb.h" 1640 | #endif 1641 | 1642 | #define ABLETON_VENDOR_ID 0x2982 1643 | #define PUSH2_PRODUCT_ID 0x1967 1644 | 1645 | static libusb_device_handle* open_push2_device() 1646 | { 1647 | int result; 1648 | 1649 | if ((result = libusb_init(NULL)) < 0) 1650 | { 1651 | printf("error: [%d] could not initilialize usblib\n", result); 1652 | return NULL; 1653 | } 1654 | 1655 | libusb_set_debug(NULL, LIBUSB_LOG_LEVEL_ERROR); 1656 | 1657 | libusb_device** devices; 1658 | ssize_t count; 1659 | count = libusb_get_device_list(NULL, &devices); 1660 | if (count < 0) 1661 | { 1662 | printf("error: [%ld] could not get usb device list\n", count); 1663 | return NULL; 1664 | } 1665 | 1666 | libusb_device* device; 1667 | libusb_device_handle* device_handle = NULL; 1668 | 1669 | char ErrorMsg[128]; 1670 | 1671 | // set message in case we get to the end of the list w/o finding a device 1672 | sprintf(ErrorMsg, "error: Ableton Push 2 device not found\n"); 1673 | 1674 | for (int i = 0; (device = devices[i]) != NULL; i++) 1675 | { 1676 | struct libusb_device_descriptor descriptor; 1677 | if ((result = libusb_get_device_descriptor(device, &descriptor)) < 0) 1678 | { 1679 | sprintf(ErrorMsg, 1680 | "error: [%d] could not get usb device descriptor\n", result); 1681 | continue; 1682 | } 1683 | 1684 | if (descriptor.bDeviceClass == LIBUSB_CLASS_PER_INTERFACE 1685 | && descriptor.idVendor == ABLETON_VENDOR_ID 1686 | && descriptor.idProduct == PUSH2_PRODUCT_ID) 1687 | { 1688 | if ((result = libusb_open(device, &device_handle)) < 0) 1689 | { 1690 | sprintf(ErrorMsg, 1691 | "error: [%d] could not open Ableton Push 2 device\n", result); 1692 | } 1693 | else if ((result = libusb_claim_interface(device_handle, 0)) < 0) 1694 | { 1695 | sprintf(ErrorMsg, 1696 | "error: [%d] could not claim interface 0 of Push 2 device\n", result); 1697 | libusb_close(device_handle); 1698 | device_handle = NULL; 1699 | } 1700 | else 1701 | { 1702 | break; // successfully opened 1703 | } 1704 | } 1705 | } 1706 | 1707 | if (device_handle == NULL) 1708 | { 1709 | printf(ErrorMsg); 1710 | } 1711 | 1712 | libusb_free_device_list(devices, 1); 1713 | return device_handle; 1714 | } 1715 | 1716 | static void close_push2_device(libusb_device_handle* device_handle) 1717 | { 1718 | libusb_release_interface(device_handle, 0); 1719 | libusb_close(device_handle); 1720 | } 1721 | ---- 1722 | ==== 1723 | 1724 | Display Interface Protocol 1725 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1726 | 1727 | For each display frame, a frame header is sent, followed by the pixel 1728 | data in 512 byte messages. 1729 | 1730 | All other header formats or data message sizes are reserved. 1731 | Some of them are used for undocumented functions like diagnostics or 1732 | firmware flashing. Sending reserved messages may compromise the 1733 | device function, up to making the device unusable, requiring to open 1734 | the case and reflash the firmware. Please, don't try to program the 1735 | Push 2 Display interface yourself if you can't make sure that reserved 1736 | messages are avoided. 1737 | 1738 | Frame Header 1739 | ^^^^^^^^^^^^ 1740 | 1741 | The frame header is the following fixed message of 16 bytes: 1742 | 1743 | { 0xFF, 0xCC, 0xAA, 0x88, 1744 | 0x00, 0x00, 0x00, 0x00, 1745 | 0x00, 0x00, 0x00, 0x00, 1746 | 0x00, 0x00, 0x00, 0x00 } 1747 | 1748 | Pixel Data 1749 | ^^^^^^^^^^ 1750 | 1751 | From USB point of view, each frame consists of 640 buffers of 512 bytes 1752 | each, containing the pixel data. From a host point of view (i.e. when 1753 | driving libusb), the pixel data is typically sent using larger buffers, 1754 | for example of 16kbytes each. This is needed for efficiency and high 1755 | frame rates. 1756 | 1757 | The Push 2 Display shows 160 lines of 960 pixels of 16 bit each. 1758 | The pixel data is sent line by line, starting with the topmost. 1759 | For each line, 2kbytes are sent. They consist of 1920 bytes of pixel data 1760 | and 128 filler bytes, which avoid line borders occuring in the middle 1761 | of the 512 byte USB buffers. The pixels for each line are sent with 1762 | leftmost pixel first. 1763 | 1764 | Pixel Color Encoding 1765 | ^^^^^^^^^^^^^^^^^^^^ 1766 | 1767 | The pixels are encoded as 16 bit RGB values according to the following table. 1768 | In memory and over USB, the least significant byte is sent first (little endian). 1769 | 1770 | [cols=",,,,,,,,,,,,,,,,",] 1771 | |=== 1772 | |bit |15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00 1773 | |value |b4|b3|b2|b1|b0|g5|g4|g3|g2|g1|g0|r4|r3|r2|r1|r0 1774 | |=== 1775 | 1776 | XORing Pixel Data 1777 | ^^^^^^^^^^^^^^^^^ 1778 | 1779 | Before sending a line buffer, it must be XORED with the 32 bit signal 1780 | shaping pattern +0xFFE7F3E7+ (i.e. the pixel data bits at positions 1781 | which are 1 in the pattern must be inverted). The pattern assumes little 1782 | endian representation, with the left pixel in the lower two bytes, 1783 | i.e. the first byte sent is xor'ed with +0xE7+, the second with +0xF3+, the 1784 | third with +0xE7+, the fourth with +0xFF+, the fifth with +0xE7+, etc. 1785 | 1786 | Frame Buffering 1787 | ^^^^^^^^^^^^^^^ 1788 | 1789 | A display frame is displayed when its complete pixel data is received. 1790 | The display runs at 60 fps. Frames are double-buffered and repeated if 1791 | the next frame does not arrive in time. If no frame arrives within 2 1792 | seconds, the display is turned black. 1793 | 1794 | Allocating Libusb Transfers 1795 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1796 | 1797 | The following code snippet shows how to allocate the frame header and 1798 | pixel data buffer transfers for libusb. 1799 | 1800 | // [source] 1801 | ==== 1802 | ---- 1803 | #define PUSH2_BULK_EP_OUT 0x01 1804 | #define TRANSFER_TIMEOUT 1000 // milliseconds 1805 | 1806 | unsigned char frame_header[16] = { 1807 | 0xff, 0xcc, 0xaa, 0x88, 1808 | 0x00, 0x00, 0x00, 0x00, 1809 | 0x00, 0x00, 0x00, 0x00, 1810 | 0x00, 0x00, 0x00, 0x00 1811 | }; 1812 | 1813 | libusb_transfer* frame_header_transfer; 1814 | 1815 | if ((frame_header_transfer = libusb_alloc_transfer(0)) == NULL) 1816 | { 1817 | printf("error: could not allocate frame header transfer handle\n"); 1818 | } 1819 | else 1820 | { 1821 | libusb_fill_bulk_transfer( 1822 | frame_header_transfer, 1823 | device_handle, 1824 | PUSH2_BULK_EP_OUT, 1825 | frame_header, 1826 | sizeof(frame_header), 1827 | on_frame_header_transfer_finished, 1828 | NULL, 1829 | TRANSFER_TIMEOUT); 1830 | } 1831 | 1832 | libusb_transfer* pixel_data_transfer; 1833 | 1834 | if ((pixel_data_transfer = libusb_alloc_transfer(0)) == NULL) 1835 | { 1836 | printf("error: could not allocate transfer handle\n"); 1837 | } 1838 | else 1839 | { 1840 | libusb_fill_bulk_transfer( 1841 | pixel_data_transfer, 1842 | device_handle, 1843 | PUSH2_BULK_EP_OUT, 1844 | buffer, 1845 | BUFFER_SIZE, 1846 | on_buffer_transfer_finished, 1847 | NULL, 1848 | TRANSFER_TIMEOUT); 1849 | } 1850 | ---- 1851 | ==== 1852 | 1853 | Appendix A: MIDI Implementation Chart 1854 | ------------------------------------- 1855 | 1856 | The MIDI Implementation chart according to the requirements of the MIDI 1857 | Manufacturers Association (http://www.midi.org[www.midi.org]) is given 1858 | on the following three pages. 1859 | 1860 | [cols="40%,12%,10%,38%"] 1861 | |=== 1862 | 4+|*MIDI Implementation Chart v. 2.0 (Page 1 of 3)* 1863 | 4+|Manufacturer: Ableton AG Model: Push 2 Version: {revision} Date: {date} 1864 | | |*Transmit* |*Recognize* |*Remarks* 1865 | 4+|*1. Basic Information* 1866 | |MIDI channels |32 |32 |Live port: L1-L16, User port: U1-U16 1867 | |Note numbers |0-10, 12, 36-99 |36-99 |pads, touch sensors (see drawing) 1868 | |Program change |No |No || 1869 | Bank Select response? (Yes/No) | |No || 1870 | Mode 1: Omni-On, Poly (Yes/No) + 1871 | Mode 2: Omni-On, Mono (Yes/No) + 1872 | Mode 3: Omni-Off, Poly (Yes/No) + 1873 | Mode 4: Omni-Off, Mono (Yes/No) + 1874 | Multi Mode (Yes/No)| | No + 1875 | Yes + 1876 | No + 1877 | No + 1878 | No | 1879 | |Note-On Velocity (Yes/No) |Yes |Yes |pads, touch, LEDs 1880 | |Note-Off Velocity (Yes/No) |No |No | 1881 | |Channel Aftertouch (Yes/No) |Yes |No |configurable 1882 | |Poly (Key) Aftertouch (Yes/No) |Yes |No |configurable 1883 | |Pitch Bend (Yes/No) |Yes |Yes |touch strip (configurable) 1884 | |Active Sensing (Yes/No) |No |No | 1885 | |System Reset (Yes/No) |No |No | 1886 | |Tune Request (Yes/No) |No |No | 1887 | | Universal System Exclusive + 1888 | Sample Dump Standard (Yes/No) + 1889 | Device Inquiry (Yes/No) + 1890 | File Dump (Yes/No) + 1891 | MIDI Tuning (Yes/No) + 1892 | Master Volume (Yes/No) + 1893 | Master Balance (Yes/No) + 1894 | Notation Information (Yes/No) + 1895 | Turn GM1 System On (Yes/No) + 1896 | Turn GM2 System On (Yes/No) + 1897 | Turn GM System Off (Yes/No) + 1898 | DLS-1 (Yes/No) + 1899 | File Reference (Yes/No) + 1900 | Controller Destination (Yes/No) + 1901 | Key-based Instrument Ctrl (Yes/No) + 1902 | Master Fine/Coarse Tune (Yes/No) + 1903 | Other Universal System Exclusive + 1904 | | 1905 | --- + 1906 | No + 1907 | Yes + 1908 | No + 1909 | No + 1910 | No + 1911 | No + 1912 | No + 1913 | No + 1914 | No + 1915 | No + 1916 | No + 1917 | No + 1918 | No + 1919 | No + 1920 | No + 1921 | No | 1922 | --- + 1923 | No + 1924 | Yes + 1925 | No + 1926 | No + 1927 | No + 1928 | No + 1929 | No + 1930 | No + 1931 | No + 1932 | No + 1933 | No + 1934 | No + 1935 | No + 1936 | No + 1937 | No + 1938 | No | 1939 | |Manufacturer System Exclusive |Yes |Yes 1940 | |Manufacturer: Ableton, ID: 00H 21H 1DH 1941 | |NRPNs (Yes/No) |No |No | 1942 | | 1943 | RPN 00 (Pitch Bend Sensitivity) (Yes/No) + 1944 | RPN 01 (Channel Fine Tune) (Yes/No) + 1945 | RPN 02 (Channel Coarse Tune) (Yes/No) + 1946 | RPN 03 (Tuning Program Select) (Yes/No) + 1947 | RPN 04 (Tuning Bank Select) (Yes/No) + 1948 | RPN 05 (Modulation Depth Range) (Yes/No) 1949 | | 1950 | No + 1951 | No + 1952 | No + 1953 | No + 1954 | No + 1955 | No| 1956 | No + 1957 | No + 1958 | No + 1959 | No + 1960 | No + 1961 | No| 1962 | 4+|*2. MIDI Timing and Synchronization* 1963 | |MIDI Clock (Yes/No) |No |Yes |LED animation sync 1964 | |Song Position Pointer (Yes/No) |No |No | 1965 | |Song Select (Yes/No) |No |No | 1966 | | 1967 | Start (Yes/No) + 1968 | Continue (Yes/No) + 1969 | Stop (Yes/No)| 1970 | No + 1971 | No + 1972 | No| 1973 | Yes + 1974 | Yes + 1975 | Yes|used for LED animation sync 1976 | |MIDI Time Code (Yes/No) |No |No | 1977 | |MIDI Machine Control (Yes/No) |No |No | 1978 | | 1979 | MIDI Show Control (Yes/No) |No |No | 1980 | 4+|*3. Extensions Compatibility* 1981 | |General MIDI compatible? |No |No | 1982 | |DLS compatible? |No |No | 1983 | |Standard MIDI Files (Type(s)/No) |No |No | 1984 | |XMF Files (Type(s)/No) |No |No | 1985 | |SP-MIDI compatible? (Yes/No) |No |Yes | 1986 | |=== 1987 | 1988 | [cols="10%,40%,10%,10%,30%"] 1989 | |=== 1990 | 5+|*MIDI Implementation Chart v. 2.0 (Page 2 of 3)* 1991 | 5+|Manufacturer: Ableton AG Model: Push 2 Version: {revision} Date: {date} 1992 | |Control # |Function |*Transmit* |*Recognize* |*Remarks* 1993 | |0 |Bank Select (MSB) |No |No | 1994 | |1 |Modulation Wheel (MSB) |Yes |Yes |touch strip (configurable) 1995 | |2 |Breath Controller (MSB) |No |No | 1996 | |3 | |Yes |Yes |tap tempo button 1997 | |4 |Foot Controller (MSB) |No |No | 1998 | |5 |Portamento Time (MSB) |No |No | 1999 | |6 |Data Entry (MSB) |No |No | 2000 | |7 |Channel Volume (MSB) |No |No | 2001 | |8 |Balance (MSB) |No |No | 2002 | |9 | |Yes |Yes |metronome button 2003 | |10 |Pan (MSB) |No |No | 2004 | |11 |Expression (MSB) |No |No | 2005 | |12 |Effect Control 1 (MSB) |No |No | 2006 | |13 |Effect Control 2 (MSB) |No |No | 2007 | |14 | |Yes |No |tempo encoder 2008 | |15 | |Yes |No |swing encoder 2009 | |16 |General Purpose Controller 1 (MSB) |No |No | 2010 | |17 |General Purpose Controller 2 (MSB) |No |No | 2011 | |18 |General Purpose Controller 3 (MSB) |No |No | 2012 | |19 |General Purpose Controller 4 (MSB) |No |No | 2013 | |20 | |Yes |Yes |track 1 button below display 2014 | |21 | |Yes |Yes |track 2 button below display 2015 | |22 | |Yes |Yes |track 3 button below display 2016 | |23 | |Yes |Yes |track 4 button below display 2017 | |24 | |Yes |Yes |track 5 button below display 2018 | |25 | |Yes |Yes |track 6 button below display 2019 | |26 | |Yes |Yes |track 7 button below display 2020 | |27 | |Yes |Yes |track 8 button below display 2021 | |28 | |Yes |Yes |master button 2022 | |29 | |Yes |Yes |stop clip button 2023 | |30 | |Yes |Yes |setup button 2024 | |31 | |Yes |Yes |layout button 2025 | |32 |Bank Select (LSB) |No |No | 2026 | |33 |Modulation Wheel (LSB) |No |No | 2027 | |34 |Breath Controller (LSB) |No |No | 2028 | |35 | |Yes |Yes |convert switch 2029 | |36 |Foot Controller (LSB) |Yes |Yes |scene 8 button 2030 | |37 |Portamento Time (LSB) |Yes |Yes |scene 7 button 2031 | |38 |Data Entry (LSB) |Yes |Yes |scene 6 button 2032 | |39 |Channel Volume (LSB) |Yes |Yes |scene 5 button 2033 | |40 |Balance (LSB) |Yes |Yes |scene 4 button 2034 | |41 | |Yes |Yes |scene 3 button 2035 | |42 |Pan (LSB) |Yes |Yes |scene 2 button 2036 | |43 |Expression (LSB) |Yes |Yes |scene 1 button 2037 | |44 |Effect Control 1 (LSB) |Yes |Yes |arrow left button 2038 | |45 |Effect Control 2 (LSB) |Yes |Yes |arrow right button 2039 | |46 | |Yes |Yes |arrow up button 2040 | |47 | |Yes |Yes |arrow down button 2041 | |48 |General Purpose Controller 1 (LSB) |Yes |Yes |select button 2042 | |49 |General Purpose Controller 2 (LSB) |Yes |Yes |shift button 2043 | |50 |General Purpose Controller 3 (LSB) |Yes |Yes |note button 2044 | |51 |General Purpose Controller 4 (LSB) |Yes |Yes |session button 2045 | |52 | |Yes |Yes |add device button 2046 | |53 | |Yes |Yes |add track button 2047 | |54 | |Yes |Yes |octave down button 2048 | |55 | |Yes |Yes |octave up button 2049 | |56 | |Yes |Yes |repeat button 2050 | |57 | |Yes |Yes |accent button 2051 | |58 | |Yes |Yes |scale button 2052 | |59 | |Yes |Yes |user button 2053 | |60 | |Yes |Yes |mute button 2054 | |61 | |Yes |Yes |solo button 2055 | |62 | |Yes |Yes |page left button 2056 | |63 | |Yes |Yes |page right button 2057 | |=== 2058 | 2059 | [cols="10%,45%,10%,8%,27%"] 2060 | |=== 2061 | 5+|*MIDI Implementation Chart v. 2.0 (Page 3 of 3)* 2062 | 5+|Manufacturer: Ableton AG Model: Push 2 Version: {revision} Date: {date} 2063 | |Control # |Function |*Transmit* |*Recognize* |*Remarks* 2064 | |64 |Sustain Pedal |Yes |No |foot pedal 1 (configurable) 2065 | |65 |Portamento On/Off |No |No | 2066 | |66 |Sostenuto |No |No | 2067 | |67 |Soft Pedal |No |No | 2068 | |68 |Legato Footswitch |No |No | 2069 | |69 |Hold 2 |Yes |No |foot pedal 2 (configurable) 2070 | |70 |Sound Controller 1 (default: Sound Variation) |No |No | 2071 | |71 |Sound Controller 2 (default: Timbre / Harmonic Quality) |Yes |No |track 1 encoder 2072 | |72 |Sound Controller 3 (default: Release Time) |Yes |No |track 2 encoder 2073 | |73 |Sound Controller 4 (default: Attack Time) |Yes |No |track 3 encoder 2074 | |74 |Sound Controller 5 (default: Brightness) |Yes |No |track 4 encoder 2075 | |75 |Sound Controller 6 (GM2 default: Decay Time) |Yes |No |track 5 encoder 2076 | |76 |Sound Controller 7 (GM2 default: Vibrato Rate) |Yes |No |track 6 encoder 2077 | |77 |Sound Controller 8 (GM2 default: Vibrato Depth) |Yes |No |track 7 encoder 2078 | |78 |Sound Controller 9 (GM2 default: Vibrato Delay) |Yes |No |track 8 encoder 2079 | |79 |Sound Controller 10 (GM2 default: Undefined) |Yes |No |master volume encoder 2080 | |80 |General Purpose Controller 5 |No |No | 2081 | |81 |General Purpose Controller 6 |No |No | 2082 | |82 |General Purpose Controller 7 |No |No | 2083 | |83 |General Purpose Controller 8 |No |No | 2084 | |84 |Portamento Control |No |No | 2085 | |85 | |Yes |Yes |play button 2086 | |86 | |Yes |Yes |record button 2087 | |87 | |Yes |Yes |new button 2088 | |88 | |Yes |Yes |duplicate button 2089 | |89 | |Yes |Yes |automate button 2090 | |90 | |Yes |Yes |fixed length button 2091 | |91 |Effects 1 Depth (default: Reverb Send) |No |No | 2092 | |92 |Effects 2 Depth (default: Tremolo Depth) |No |No | 2093 | |93 |Effects 3 Depth (default: Chorus Send) |No |No | 2094 | |94 |Effects 4 Depth (default: Celeste [Detune] Depth) |No |No | 2095 | |95 |Effects 5 Depth (default: Phaser Depth) |No |No | 2096 | |96 |Data Increment |No |No | 2097 | |97 |Data Decrement |No |No | 2098 | |98 |Non-Registered Parameter Number (LSB) |No |No | 2099 | |99 |Non-Registered Parameter Number(MSB) |No |No | 2100 | |100 |Registered Parameter Number (LSB) |No |No | 2101 | |101 |Registered Parameter Number(MSB) |No |No | 2102 | |102 | |Yes |Yes |track 1 button above display 2103 | |103 | |Yes |Yes |track 2 button above display 2104 | |104 | |Yes |Yes |track 3 button above display 2105 | |105 | |Yes |Yes |track 4 button above display 2106 | |106 | |Yes |Yes |track 5 button above display 2107 | |107 | |Yes |Yes |track 6 button above display 2108 | |108 | |Yes |Yes |track 7 button above display 2109 | |109 | |Yes |Yes |track 8 button above display 2110 | |110 | |Yes |Yes |device button 2111 | |111 | |Yes |Yes |browse button 2112 | |112 | |Yes |Yes |mix button 2113 | |113 | |Yes |Yes |clip button 2114 | |114 | |No |No | 2115 | |115 | |No |No | 2116 | |116 | |Yes |Yes |quantize button 2117 | |117 | |Yes |Yes |double loop button 2118 | |118 | |Yes |Yes |delete button 2119 | |119 | |Yes |Yes |undo button 2120 | |120 |All Sound Off |No |No | 2121 | |121 |Reset All Controllers |No |No | 2122 | |122 |Local Control On/Off |No |No | 2123 | |123 |All Notes Off |No |No | 2124 | |124 |Omni Mode Off |No |No | 2125 | |125 |Omni Mode On |No |No | 2126 | |126 |Poly Mode Off |No |No | 2127 | |127 |Poly Mode On |No |No | 2128 | |=== 2129 | -------------------------------------------------------------------------------- /doc/LED-Animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ableton/push-interface/7ba2816f73b5b8617ec9dd138356de27270a76c7/doc/LED-Animation.png -------------------------------------------------------------------------------- /doc/MidiMapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ableton/push-interface/7ba2816f73b5b8617ec9dd138356de27270a76c7/doc/MidiMapping.png -------------------------------------------------------------------------------- /doc/Push2-map.json: -------------------------------------------------------------------------------- 1 | { 2 | "Parts": { 3 | "Pads": [ 4 | { 5 | "Number": 36, 6 | "Message": "note", 7 | "Color": true, 8 | "Name": "Pad S8 T1" 9 | }, 10 | { 11 | "Number": 37, 12 | "Message": "note", 13 | "Color": true, 14 | "Name": "Pad S8 T2" 15 | }, 16 | { 17 | "Number": 38, 18 | "Message": "note", 19 | "Color": true, 20 | "Name": "Pad S8 T3" 21 | }, 22 | { 23 | "Number": 39, 24 | "Message": "note", 25 | "Color": true, 26 | "Name": "Pad S8 T4" 27 | }, 28 | { 29 | "Number": 40, 30 | "Message": "note", 31 | "Color": true, 32 | "Name": "Pad S8 T5" 33 | }, 34 | { 35 | "Number": 41, 36 | "Message": "note", 37 | "Color": true, 38 | "Name": "Pad S8 T6" 39 | }, 40 | { 41 | "Number": 42, 42 | "Message": "note", 43 | "Color": true, 44 | "Name": "Pad S8 T7" 45 | }, 46 | { 47 | "Number": 43, 48 | "Message": "note", 49 | "Color": true, 50 | "Name": "Pad S8 T8" 51 | }, 52 | { 53 | "Number": 44, 54 | "Message": "note", 55 | "Color": true, 56 | "Name": "Pad S7 T1" 57 | }, 58 | { 59 | "Number": 45, 60 | "Message": "note", 61 | "Color": true, 62 | "Name": "Pad S7 T2" 63 | }, 64 | { 65 | "Number": 46, 66 | "Message": "note", 67 | "Color": true, 68 | "Name": "Pad S7 T3" 69 | }, 70 | { 71 | "Number": 47, 72 | "Message": "note", 73 | "Color": true, 74 | "Name": "Pad S7 T4" 75 | }, 76 | { 77 | "Number": 48, 78 | "Message": "note", 79 | "Color": true, 80 | "Name": "Pad S7 T5" 81 | }, 82 | { 83 | "Number": 49, 84 | "Message": "note", 85 | "Color": true, 86 | "Name": "Pad S7 T6" 87 | }, 88 | { 89 | "Number": 50, 90 | "Message": "note", 91 | "Color": true, 92 | "Name": "Pad S7 T7" 93 | }, 94 | { 95 | "Number": 51, 96 | "Message": "note", 97 | "Color": true, 98 | "Name": "Pad S7 T8" 99 | }, 100 | { 101 | "Number": 52, 102 | "Message": "note", 103 | "Color": true, 104 | "Name": "Pad S6 T1" 105 | }, 106 | { 107 | "Number": 53, 108 | "Message": "note", 109 | "Color": true, 110 | "Name": "Pad S6 T2" 111 | }, 112 | { 113 | "Number": 54, 114 | "Message": "note", 115 | "Color": true, 116 | "Name": "Pad S6 T3" 117 | }, 118 | { 119 | "Number": 55, 120 | "Message": "note", 121 | "Color": true, 122 | "Name": "Pad S6 T4" 123 | }, 124 | { 125 | "Number": 56, 126 | "Message": "note", 127 | "Color": true, 128 | "Name": "Pad S6 T5" 129 | }, 130 | { 131 | "Number": 57, 132 | "Message": "note", 133 | "Color": true, 134 | "Name": "Pad S6 T6" 135 | }, 136 | { 137 | "Number": 58, 138 | "Message": "note", 139 | "Color": true, 140 | "Name": "Pad S6 T7" 141 | }, 142 | { 143 | "Number": 59, 144 | "Message": "note", 145 | "Color": true, 146 | "Name": "Pad S6 T8" 147 | }, 148 | { 149 | "Number": 60, 150 | "Message": "note", 151 | "Color": true, 152 | "Name": "Pad S5 T1" 153 | }, 154 | { 155 | "Number": 61, 156 | "Message": "note", 157 | "Color": true, 158 | "Name": "Pad S5 T2" 159 | }, 160 | { 161 | "Number": 62, 162 | "Message": "note", 163 | "Color": true, 164 | "Name": "Pad S5 T3" 165 | }, 166 | { 167 | "Number": 63, 168 | "Message": "note", 169 | "Color": true, 170 | "Name": "Pad S5 T4" 171 | }, 172 | { 173 | "Number": 64, 174 | "Message": "note", 175 | "Color": true, 176 | "Name": "Pad S5 T5" 177 | }, 178 | { 179 | "Number": 65, 180 | "Message": "note", 181 | "Color": true, 182 | "Name": "Pad S5 T6" 183 | }, 184 | { 185 | "Number": 66, 186 | "Message": "note", 187 | "Color": true, 188 | "Name": "Pad S5 T7" 189 | }, 190 | { 191 | "Number": 67, 192 | "Message": "note", 193 | "Color": true, 194 | "Name": "Pad S5 T8" 195 | }, 196 | { 197 | "Number": 68, 198 | "Message": "note", 199 | "Color": true, 200 | "Name": "Pad S4 T1" 201 | }, 202 | { 203 | "Number": 69, 204 | "Message": "note", 205 | "Color": true, 206 | "Name": "Pad S4 T2" 207 | }, 208 | { 209 | "Number": 70, 210 | "Message": "note", 211 | "Color": true, 212 | "Name": "Pad S4 T3" 213 | }, 214 | { 215 | "Number": 71, 216 | "Message": "note", 217 | "Color": true, 218 | "Name": "Pad S4 T4" 219 | }, 220 | { 221 | "Number": 72, 222 | "Message": "note", 223 | "Color": true, 224 | "Name": "Pad S4 T5" 225 | }, 226 | { 227 | "Number": 73, 228 | "Message": "note", 229 | "Color": true, 230 | "Name": "Pad S4 T6" 231 | }, 232 | { 233 | "Number": 74, 234 | "Message": "note", 235 | "Color": true, 236 | "Name": "Pad S4 T7" 237 | }, 238 | { 239 | "Number": 75, 240 | "Message": "note", 241 | "Color": true, 242 | "Name": "Pad S4 T8" 243 | }, 244 | { 245 | "Number": 76, 246 | "Message": "note", 247 | "Color": true, 248 | "Name": "Pad S3 T1" 249 | }, 250 | { 251 | "Number": 77, 252 | "Message": "note", 253 | "Color": true, 254 | "Name": "Pad S3 T2" 255 | }, 256 | { 257 | "Number": 78, 258 | "Message": "note", 259 | "Color": true, 260 | "Name": "Pad S3 T3" 261 | }, 262 | { 263 | "Number": 79, 264 | "Message": "note", 265 | "Color": true, 266 | "Name": "Pad S3 T4" 267 | }, 268 | { 269 | "Number": 80, 270 | "Message": "note", 271 | "Color": true, 272 | "Name": "Pad S3 T5" 273 | }, 274 | { 275 | "Number": 81, 276 | "Message": "note", 277 | "Color": true, 278 | "Name": "Pad S3 T6" 279 | }, 280 | { 281 | "Number": 82, 282 | "Message": "note", 283 | "Color": true, 284 | "Name": "Pad S3 T7" 285 | }, 286 | { 287 | "Number": 83, 288 | "Message": "note", 289 | "Color": true, 290 | "Name": "Pad S3 T8" 291 | }, 292 | { 293 | "Number": 84, 294 | "Message": "note", 295 | "Color": true, 296 | "Name": "Pad S2 T1" 297 | }, 298 | { 299 | "Number": 85, 300 | "Message": "note", 301 | "Color": true, 302 | "Name": "Pad S2 T2" 303 | }, 304 | { 305 | "Number": 86, 306 | "Message": "note", 307 | "Color": true, 308 | "Name": "Pad S2 T3" 309 | }, 310 | { 311 | "Number": 87, 312 | "Message": "note", 313 | "Color": true, 314 | "Name": "Pad S2 T4" 315 | }, 316 | { 317 | "Number": 88, 318 | "Message": "note", 319 | "Color": true, 320 | "Name": "Pad S2 T5" 321 | }, 322 | { 323 | "Number": 89, 324 | "Message": "note", 325 | "Color": true, 326 | "Name": "Pad S2 T6" 327 | }, 328 | { 329 | "Number": 90, 330 | "Message": "note", 331 | "Color": true, 332 | "Name": "Pad S2 T7" 333 | }, 334 | { 335 | "Number": 91, 336 | "Message": "note", 337 | "Color": true, 338 | "Name": "Pad S2 T8" 339 | }, 340 | { 341 | "Number": 92, 342 | "Message": "note", 343 | "Color": true, 344 | "Name": "Pad S1 T1" 345 | }, 346 | { 347 | "Number": 93, 348 | "Message": "note", 349 | "Color": true, 350 | "Name": "Pad S1 T2" 351 | }, 352 | { 353 | "Number": 94, 354 | "Message": "note", 355 | "Color": true, 356 | "Name": "Pad S1 T3" 357 | }, 358 | { 359 | "Number": 95, 360 | "Message": "note", 361 | "Color": true, 362 | "Name": "Pad S1 T4" 363 | }, 364 | { 365 | "Number": 96, 366 | "Message": "note", 367 | "Color": true, 368 | "Name": "Pad S1 T5" 369 | }, 370 | { 371 | "Number": 97, 372 | "Message": "note", 373 | "Color": true, 374 | "Name": "Pad S1 T6" 375 | }, 376 | { 377 | "Number": 98, 378 | "Message": "note", 379 | "Color": true, 380 | "Name": "Pad S1 T7" 381 | }, 382 | { 383 | "Number": 99, 384 | "Message": "note", 385 | "Color": true, 386 | "Name": "Pad S1 T8" 387 | } 388 | ], 389 | "Buttons": [ 390 | { 391 | "Number": 3, 392 | "Message": "cc", 393 | "Color": false, 394 | "Name": "Tap Tempo" 395 | }, 396 | { 397 | "Number": 9, 398 | "Message": "cc", 399 | "Color": false, 400 | "Name": "Metronome" 401 | }, 402 | { 403 | "Number": 118, 404 | "Message": "cc", 405 | "Color": false, 406 | "Name": "Delete" 407 | }, 408 | { 409 | "Number": 119, 410 | "Message": "cc", 411 | "Color": false, 412 | "Name": "Undo" 413 | }, 414 | { 415 | "Number": 60, 416 | "Message": "cc", 417 | "Color": true, 418 | "Name": "Mute" 419 | }, 420 | { 421 | "Number": 61, 422 | "Message": "cc", 423 | "Color": true, 424 | "Name": "Solo" 425 | }, 426 | { 427 | "Number": 29, 428 | "Message": "cc", 429 | "Color": true, 430 | "Name": "Stop" 431 | }, 432 | { 433 | "Number": 35, 434 | "Message": "cc", 435 | "Color": false, 436 | "Name": "Convert" 437 | }, 438 | { 439 | "Number": 117, 440 | "Message": "cc", 441 | "Color": false, 442 | "Name": "Double Loop" 443 | }, 444 | { 445 | "Number": 116, 446 | "Message": "cc", 447 | "Color": false, 448 | "Name": "Quantize" 449 | }, 450 | { 451 | "Number": 88, 452 | "Message": "cc", 453 | "Color": false, 454 | "Name": "Duplicate" 455 | }, 456 | { 457 | "Number": 87, 458 | "Message": "cc", 459 | "Color": false, 460 | "Name": "New" 461 | }, 462 | { 463 | "Number": 90, 464 | "Message": "cc", 465 | "Color": false, 466 | "Name": "Fixed Length" 467 | }, 468 | { 469 | "Number": 89, 470 | "Message": "cc", 471 | "Color": true, 472 | "Name": "Automate" 473 | }, 474 | { 475 | "Number": 86, 476 | "Message": "cc", 477 | "Color": true, 478 | "Name": "Record" 479 | }, 480 | { 481 | "Number": 85, 482 | "Message": "cc", 483 | "Color": true, 484 | "Name": "Play" 485 | }, 486 | { 487 | "Number": 102, 488 | "Message": "cc", 489 | "Color": true, 490 | "Name": "Upper Row 1" 491 | }, 492 | { 493 | "Number": 103, 494 | "Message": "cc", 495 | "Color": true, 496 | "Name": "Upper Row 2" 497 | }, 498 | { 499 | "Number": 104, 500 | "Message": "cc", 501 | "Color": true, 502 | "Name": "Upper Row 3" 503 | }, 504 | { 505 | "Number": 105, 506 | "Message": "cc", 507 | "Color": true, 508 | "Name": "Upper Row 4" 509 | }, 510 | { 511 | "Number": 106, 512 | "Message": "cc", 513 | "Color": true, 514 | "Name": "Upper Row 5" 515 | }, 516 | { 517 | "Number": 107, 518 | "Message": "cc", 519 | "Color": true, 520 | "Name": "Upper Row 6" 521 | }, 522 | { 523 | "Number": 108, 524 | "Message": "cc", 525 | "Color": true, 526 | "Name": "Upper Row 7" 527 | }, 528 | { 529 | "Number": 109, 530 | "Message": "cc", 531 | "Color": true, 532 | "Name": "Upper Row 8" 533 | }, 534 | { 535 | "Number": 20, 536 | "Message": "cc", 537 | "Color": true, 538 | "Name": "Lower Row 1" 539 | }, 540 | { 541 | "Number": 21, 542 | "Message": "cc", 543 | "Color": true, 544 | "Name": "Lower Row 2" 545 | }, 546 | { 547 | "Number": 22, 548 | "Message": "cc", 549 | "Color": true, 550 | "Name": "Lower Row 3" 551 | }, 552 | { 553 | "Number": 23, 554 | "Message": "cc", 555 | "Color": true, 556 | "Name": "Lower Row 4" 557 | }, 558 | { 559 | "Number": 24, 560 | "Message": "cc", 561 | "Color": true, 562 | "Name": "Lower Row 5" 563 | }, 564 | { 565 | "Number": 25, 566 | "Message": "cc", 567 | "Color": true, 568 | "Name": "Lower Row 6" 569 | }, 570 | { 571 | "Number": 26, 572 | "Message": "cc", 573 | "Color": true, 574 | "Name": "Lower Row 7" 575 | }, 576 | { 577 | "Number": 27, 578 | "Message": "cc", 579 | "Color": true, 580 | "Name": "Lower Row 8" 581 | }, 582 | { 583 | "Number": 43, 584 | "Message": "cc", 585 | "Color": true, 586 | "Name": "1/32t" 587 | }, 588 | { 589 | "Number": 42, 590 | "Message": "cc", 591 | "Color": true, 592 | "Name": "1/32" 593 | }, 594 | { 595 | "Number": 41, 596 | "Message": "cc", 597 | "Color": true, 598 | "Name": "1/16t" 599 | }, 600 | { 601 | "Number": 40, 602 | "Message": "cc", 603 | "Color": true, 604 | "Name": "1/16" 605 | }, 606 | { 607 | "Number": 39, 608 | "Message": "cc", 609 | "Color": true, 610 | "Name": "1/8t" 611 | }, 612 | { 613 | "Number": 38, 614 | "Message": "cc", 615 | "Color": true, 616 | "Name": "1/8" 617 | }, 618 | { 619 | "Number": 37, 620 | "Message": "cc", 621 | "Color": true, 622 | "Name": "1/4t" 623 | }, 624 | { 625 | "Number": 36, 626 | "Message": "cc", 627 | "Color": true, 628 | "Name": "1/4" 629 | }, 630 | { 631 | "Number": 30, 632 | "Message": "cc", 633 | "Color": false, 634 | "Name": "Setup" 635 | }, 636 | { 637 | "Number": 59, 638 | "Message": "cc", 639 | "Color": false, 640 | "Name": "User" 641 | }, 642 | { 643 | "Number": 52, 644 | "Message": "cc", 645 | "Color": false, 646 | "Name": "Add Device" 647 | }, 648 | { 649 | "Number": 53, 650 | "Message": "cc", 651 | "Color": false, 652 | "Name": "Add Track" 653 | }, 654 | { 655 | "Number": 110, 656 | "Message": "cc", 657 | "Color": false, 658 | "Name": "Device" 659 | }, 660 | { 661 | "Number": 112, 662 | "Message": "cc", 663 | "Color": false, 664 | "Name": "Mix" 665 | }, 666 | { 667 | "Number": 111, 668 | "Message": "cc", 669 | "Color": false, 670 | "Name": "Browse" 671 | }, 672 | { 673 | "Number": 113, 674 | "Message": "cc", 675 | "Color": false, 676 | "Name": "Clip" 677 | }, 678 | { 679 | "Number": 28, 680 | "Message": "cc", 681 | "Color": false, 682 | "Name": "Master" 683 | }, 684 | { 685 | "Number": 46, 686 | "Message": "cc", 687 | "Color": false, 688 | "Name": "Up" 689 | }, 690 | { 691 | "Number": 47, 692 | "Message": "cc", 693 | "Color": false, 694 | "Name": "Down" 695 | }, 696 | { 697 | "Number": 44, 698 | "Message": "cc", 699 | "Color": false, 700 | "Name": "Left" 701 | }, 702 | { 703 | "Number": 45, 704 | "Message": "cc", 705 | "Color": false, 706 | "Name": "Right" 707 | }, 708 | { 709 | "Number": 56, 710 | "Message": "cc", 711 | "Color": false, 712 | "Name": "Repeat" 713 | }, 714 | { 715 | "Number": 57, 716 | "Message": "cc", 717 | "Color": false, 718 | "Name": "Accent" 719 | }, 720 | { 721 | "Number": 58, 722 | "Message": "cc", 723 | "Color": false, 724 | "Name": "Scale" 725 | }, 726 | { 727 | "Number": 31, 728 | "Message": "cc", 729 | "Color": false, 730 | "Name": "Layout" 731 | }, 732 | { 733 | "Number": 50, 734 | "Message": "cc", 735 | "Color": false, 736 | "Name": "Note" 737 | }, 738 | { 739 | "Number": 51, 740 | "Message": "cc", 741 | "Color": false, 742 | "Name": "Session" 743 | }, 744 | { 745 | "Number": 55, 746 | "Message": "cc", 747 | "Color": false, 748 | "Name": "Octave Up" 749 | }, 750 | { 751 | "Number": 54, 752 | "Message": "cc", 753 | "Color": false, 754 | "Name": "Octave Down" 755 | }, 756 | { 757 | "Number": 62, 758 | "Message": "cc", 759 | "Color": false, 760 | "Name": "Page Left" 761 | }, 762 | { 763 | "Number": 63, 764 | "Message": "cc", 765 | "Color": false, 766 | "Name": "Page Right" 767 | }, 768 | { 769 | "Number": 49, 770 | "Message": "cc", 771 | "Color": false, 772 | "Name": "Shift" 773 | }, 774 | { 775 | "Number": 48, 776 | "Message": "cc", 777 | "Color": false, 778 | "Name": "Select" 779 | } 780 | ], 781 | "RotaryEncoders": [ 782 | { 783 | "Number": 14, 784 | "Message": "cc", 785 | "Name": "Tempo Encoder", 786 | "Position": 1, 787 | "Touch": { 788 | "Number": 10, 789 | "Message": "note" 790 | } 791 | }, 792 | { 793 | "Number": 15, 794 | "Message": "cc", 795 | "Name": "Swing Encoder", 796 | "Position": 2, 797 | "Touch": { 798 | "Number": 9, 799 | "Message": "note" 800 | } 801 | }, 802 | { 803 | "Number": 71, 804 | "Message": "cc", 805 | "Name": "Track1 Encoder", 806 | "Position": 3, 807 | "Touch": { 808 | "Number": 0, 809 | "Message": "note" 810 | } 811 | }, 812 | { 813 | "Number": 72, 814 | "Message": "cc", 815 | "Name": "Track2 Encoder", 816 | "Position": 4, 817 | "Touch": { 818 | "Number": 1, 819 | "Message": "note" 820 | } 821 | }, 822 | { 823 | "Number": 73, 824 | "Message": "cc", 825 | "Name": "Track3 Encoder", 826 | "Position": 5, 827 | "Touch": { 828 | "Number": 2, 829 | "Message": "note" 830 | } 831 | }, 832 | { 833 | "Number": 74, 834 | "Message": "cc", 835 | "Name": "Track4 Encoder", 836 | "Position": 6, 837 | "Touch": { 838 | "Number": 3, 839 | "Message": "note" 840 | } 841 | }, 842 | { 843 | "Number": 75, 844 | "Message": "cc", 845 | "Name": "Track5 Encoder", 846 | "Position": 7, 847 | "Touch": { 848 | "Number": 4, 849 | "Message": "note" 850 | } 851 | }, 852 | { 853 | "Number": 76, 854 | "Message": "cc", 855 | "Name": "Track6 Encoder", 856 | "Position": 8, 857 | "Touch": { 858 | "Number": 5, 859 | "Message": "note" 860 | } 861 | }, 862 | { 863 | "Number": 77, 864 | "Message": "cc", 865 | "Name": "Track7 Encoder", 866 | "Position": 9, 867 | "Touch": { 868 | "Number": 6, 869 | "Message": "note" 870 | } 871 | }, 872 | { 873 | "Number": 78, 874 | "Message": "cc", 875 | "Name": "Track8 Encoder", 876 | "Position": 10, 877 | "Touch": { 878 | "Number": 7, 879 | "Message": "note" 880 | } 881 | }, 882 | { 883 | "Number": 79, 884 | "Message": "cc", 885 | "Name": "Master Encoder", 886 | "Position": 11, 887 | "Touch": { 888 | "Number": 8, 889 | "Message": "note" 890 | } 891 | } 892 | ], 893 | "Slider": { 894 | "Touch": { 895 | "Number": 12, 896 | "Message": "pitchbend", 897 | "Name": "Slider" 898 | } 899 | } 900 | }, 901 | "layout": { 902 | "XY": [ 903 | [ 904 | 92, 905 | 93, 906 | 94, 907 | 95, 908 | 96, 909 | 97, 910 | 98, 911 | 99 912 | ], 913 | [ 914 | 84, 915 | 85, 916 | 86, 917 | 87, 918 | 88, 919 | 89, 920 | 90, 921 | 91 922 | ], 923 | [ 924 | 76, 925 | 77, 926 | 78, 927 | 79, 928 | 80, 929 | 81, 930 | 82, 931 | 83 932 | ], 933 | [ 934 | 68, 935 | 69, 936 | 70, 937 | 71, 938 | 72, 939 | 73, 940 | 74, 941 | 75 942 | ], 943 | [ 944 | 60, 945 | 61, 946 | 62, 947 | 63, 948 | 64, 949 | 65, 950 | 66, 951 | 67 952 | ], 953 | [ 954 | 52, 955 | 53, 956 | 54, 957 | 55, 958 | 56, 959 | 57, 960 | 58, 961 | 59 962 | ], 963 | [ 964 | 44, 965 | 45, 966 | 46, 967 | 47, 968 | 48, 969 | 49, 970 | 50, 971 | 51 972 | ], 973 | [ 974 | 36, 975 | 37, 976 | 38, 977 | 39, 978 | 40, 979 | 41, 980 | 42, 981 | 43 982 | ] 983 | ] 984 | } 985 | } 986 | -------------------------------------------------------------------------------- /doc/RGB-LED-Processing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ableton/push-interface/7ba2816f73b5b8617ec9dd138356de27270a76c7/doc/RGB-LED-Processing.png -------------------------------------------------------------------------------- /doc/TS-LED-Processing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ableton/push-interface/7ba2816f73b5b8617ec9dd138356de27270a76c7/doc/TS-LED-Processing.png -------------------------------------------------------------------------------- /doc/USB-Link-Overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ableton/push-interface/7ba2816f73b5b8617ec9dd138356de27270a76c7/doc/USB-Link-Overview.png -------------------------------------------------------------------------------- /doc/UserPortInPrefs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ableton/push-interface/7ba2816f73b5b8617ec9dd138356de27270a76c7/doc/UserPortInPrefs.png -------------------------------------------------------------------------------- /doc/White-LED-Processing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ableton/push-interface/7ba2816f73b5b8617ec9dd138356de27270a76c7/doc/White-LED-Processing.png --------------------------------------------------------------------------------