A custom Ableton Live control surface for the Intech Grid EN16 controller.
This integration has two parts that communicate via MIDI:
flowchart LR
subgraph EN16["EN16 Controller"]
Lua["Lua Scripts"]
end
subgraph Ableton["Ableton Live"]
Python["Python Control Surface"]
end
Lua <-->|MIDI| Python
| Component | Location | Purpose |
|---|---|---|
| Control Surface | control_surface/Grid.py |
Python script running in Ableton that maps MIDI to tracks, devices, and clips |
| EN16 Configuration | configs/EN16-Control.lua |
Lua scripts running on the EN16 that handle encoders, buttons, and LED feedback |
Both sides must agree on the MIDI layout (which CC/Note numbers mean what). See Control Surface Architecture for details.
| Control | Function |
|---|---|
| Buttons 1-8 | Select track (long press to arm) |
| Buttons 9-12 | Select Return track A-D |
| Buttons 13-16 | Launch/stop clips 1-4 (selected track) |
| Encoders 1-8 | Device parameters (selected track) |
| Encoders 9-12 | (available for custom mapping) |
| Encoder 13 | Send level to Return C (selected track) |
| Encoder 14 | Send level to Return B (selected track) |
| Encoder 15 | Send level to Return A (selected track) |
| Encoder 16 | Volume (selected track) |
-
Copy this folder to Ableton's Remote Scripts:
~/Music/Ableton/User Library/Remote Scripts/Intech -
In Ableton Live, go to Preferences → Link, Tempo & MIDI
-
Set Control Surface to Intech, Input/Output to your EN16 MIDI ports
-
Restart Ableton Live
Upload the Lua configuration to your EN16 using Grid Editor or the CLI tool:
cd grid-cli && npm install
npx tsx grid-cli.ts upload ../configs/EN16-Control.jsonSee EN16 Configuration Guide for details on the Lua scripts.
Intech/
├── __init__.py # Entry point
├── control_surface/
│ └── Grid.py # Control surface implementation
├── configs/
│ ├── EN16-Control.json # Grid config (JSON)
│ └── EN16-Control.lua # Grid config (Lua)
├── grid-cli/ # CLI tool for config upload/download
├── docs/ # Documentation
└── __ext__/ # Git submodules (reference scripts)
Edit control_surface/Grid.py to modify Ableton integration.
Prerequisites: Ableton Live 11+ (Python 3.x bundled)
Reload scripts: Add -_ToolsMenuRemoteScripts to Options.txt (Beta only), then use Tools → Reload MIDI Remote Scripts. Clear __pycache__ before reloading.
View logs:
tail -f ~/Library/Preferences/Ableton/Live\ */Log.txt | grep -i intechReferences:
- Control Surface Architecture - How the framework works
- AbletonLive12_MIDIRemoteScripts - Decompiled scripts
- ableton-control-surface-toolkit - Live object documentation
Edit configs/EN16-Control.lua to modify controller behavior, then upload to the device.
Using Grid CLI:
cd grid-cli && npm install
npx tsx grid-cli.ts upload ../configs/EN16-Control.jsonUsing Grid Editor: Open Grid Editor, connect your EN16, and configure elements visually.
References:
- EN16 Configuration Guide - Element scripts and MIDI routing
- Lua Config Authoring Guide - Write configs in Lua
- Grid CLI Tool - CLI for upload/download
- Grid Lua API - Full API reference
- Grid Firmware Internals - Device runtime details
- Grid Editor Documentation - Official docs
Initial sync delay: On startup, Ableton sends parameter values before EN16's MIDI callback is ready. A one-shot timer fires after 1 second to request a refresh.
MIT
