01 · Play
MIDI controllers, modeled.
A library of MIDI controllers written as data: every knob, pad and key with the exact MIDI message it sends and the document that number came from. Play them here, plug the real one in and watch it move, or put one in your own page with a single line.
Every music tool makes you map your controller again. Here a controller is modeled once, with sources, for everyone to use.
- devices
- 21
- generic layouts
- 6
- controls on the devices
- 1141
- sources cited
- 75
214 of those controls are marked unverified: the number is our best reading, and learn mode rebinds it in one move.
Last messageTouch a control: its signal and MIDI message appear here.
Drag knobs and faders · tap pads and keys · Tab and arrow keys work too
02 · Catalog
Every controller in the library
The faceplates on these cards are the component itself, live: drag them. The badges say where each profile's numbers come from.
Devices 21
-
AKAI Professional
AKAI LPD8 (mk2)
8 pads · 8 knobs
- Manufacturer docs
- Artist's TouchDesigner tool
- Community notes
- 8 unverified
-
AKAI Professional
AKAI APC mini mk2
64 pads · 9 faders · 17 buttons
- Manufacturer docs
- Community notes
- LED feedback
-
AKAI Professional
AKAI MIDImix
24 knobs · 9 faders · 19 buttons
- Manufacturer docs
- Community notes
- LED feedback
-
AKAI Professional
AKAI MPK mini mk3
8 pads · 25 keys · 8 knobs · 2 wheels
- Manufacturer docs
- Community notes
- 25 unverified
-
AKAI Professional
AKAI APC40 mkII
40 pads · 16 knobs · 2 encoders · 10 faders · 71 buttons
- Manufacturer docs
- Community notes
- LED feedback
- 40 unverified
-
Arturia
Arturia MiniLab 3
8 pads · 25 keys · 8 knobs · 1 encoder · 4 faders · 2 touch strips
- Manufacturer docs
- Artist's TouchDesigner tool
- Community notes
- 1 unverified
-
Arturia
Arturia KeyStep 37
37 keys · 4 knobs · 1 button · 2 touch strips
- Manufacturer docs
- Community notes
- 41 unverified
-
-
-
DJ TechTools
DJ TechTools Midi Fighter Twister
16 encoders · 22 buttons
- Manufacturer docs
- LED feedback
- 6 unverified
-
-
-
Novation
Novation Launchpad Mini MK3
64 pads · 16 buttons
- Manufacturer docs
- Artist's TouchDesigner tool
- LED feedback
- 8 unverified
-
Novation
Novation Launch Control XL (MK2)
24 knobs · 8 faders · 24 buttons
- Manufacturer docs
- Community notes
- LED feedback
-
Novation
Novation Launch Control XL 3
24 encoders · 8 faders · 16 buttons
- Manufacturer docs
- Community notes
-
Novation
Novation Launchkey Mini MK3
16 pads · 25 keys · 8 knobs · 2 touch strips
- Manufacturer docs
- Community notes
- 34 unverified
-
Novation
Novation Launchkey 25 MK4
16 pads · 25 keys · 8 knobs · 1 button · 2 wheels
- Manufacturer docs
- Community notes
- 8 unverified
-
Novation
Novation Launchkey 37 MK4
16 pads · 37 keys · 8 knobs · 1 button · 2 wheels
- Manufacturer docs
- Community notes
- 8 unverified
-
-
-
Generic layouts 6
For a controller that is not in the library yet: pick the layout closest to it, press Learn, and move your controls in order.
Not on the list?
Open an issue with the brand and model, whether you have the unit and a link to the manual. A profile is one JSON file, so if you would rather write it yourself, the steps are in Add your controller.
03 · Choose
Which one fits what you play?
Every number here is counted from the profile files, so the table cannot disagree with the pages. Press what you need and the table keeps the controllers that have it.
| Controller | Keys | Pads | Knobs | Encoders | Faders | Buttons | LED | Unverified | Sources | Good for |
|---|---|---|---|---|---|---|---|---|---|---|
| AKAI LPD8 (mk2)AKAI Professional | – | 8 | 8 | – | – | – | – | 8 | 4 | Triggers · Many parameters |
| AKAI APC mini mk2AKAI Professional | – | 64 | – | – | 9 | 17 | yes | – | 5 | Triggers · Mixing |
| AKAI MIDImixAKAI Professional | – | – | 24 | – | 9 | 19 | yes | – | 3 | Many parameters · Mixing |
| AKAI MPK mini mk3AKAI Professional | 25 | 8 | 8 | – | – | – | – | 25 | 6 | Melody · Triggers · Many parameters |
| AKAI APC40 mkIIAKAI Professional | – | 40 | 16 | 2 | 10 | 71 | yes | 40 | 4 | Triggers · Many parameters · Mixing |
| Arturia MiniLab 3Arturia | 25 | 8 | 8 | 1 | 4 | – | – | 1 | 3 | Melody · Triggers · Many parameters · Mixing |
| Arturia KeyStep 37Arturia | 37 | – | 4 | – | – | 1 | – | 41 | 2 | Melody |
| Arturia BeatStepArturia | – | 16 | – | 16 | – | – | – | – | 3 | Triggers · Many parameters |
| Behringer X-TOUCH MINIBehringer | – | – | – | 8 | 1 | 24 | – | – | 3 | Many parameters |
| DJ TechTools Midi Fighter TwisterDJ TechTools | – | – | – | 16 | – | 22 | yes | 6 | 2 | Many parameters |
| Korg nanoKONTROL2KORG | – | – | 8 | – | 8 | 35 | yes | – | 4 | Many parameters · Mixing |
| Korg nanoKEY2KORG | 25 | – | – | – | – | 2 | – | 25 | 3 | Melody |
| Novation Launchpad Mini MK3Novation | – | 64 | – | – | – | 16 | yes | 8 | 3 | Triggers |
| Novation Launch Control XL (MK2)Novation | – | – | 24 | – | 8 | 24 | yes | – | 5 | Many parameters · Mixing |
| Novation Launch Control XL 3Novation | – | – | – | 24 | 8 | 16 | – | – | 7 | Many parameters · Mixing |
| Novation Launchkey Mini MK3Novation | 25 | 16 | 8 | – | – | – | – | 34 | 6 | Melody · Triggers · Many parameters |
| Novation Launchkey 25 MK4Novation | 25 | 16 | 8 | – | – | 1 | – | 8 | 6 | Melody · Triggers · Many parameters |
| Novation Launchkey 37 MK4Novation | 37 | 16 | 8 | – | – | 1 | – | 8 | 6 | Melody · Triggers · Many parameters |
| Novation Launchpad Pro MK3Novation | – | 64 | – | – | – | 41 | yes | – | 2 | Triggers |
| ODD BallODD | – | 3 | 4 | – | 3 | – | – | 10 | 1 | – |
| OP-1 fieldteenage engineering | 24 | – | – | 4 | – | 33 | – | – | 2 | Melody |
| Generic 8 knobs + 8 padsGeneric layout | – | 8 | 8 | – | – | – | – | – | 1 | Triggers · Many parameters |
| Generic 8 fadersGeneric layout | – | – | – | – | 8 | – | – | – | 1 | Mixing |
| Generic 16 padsGeneric layout | – | 16 | – | – | – | – | – | – | 1 | Triggers |
| Generic 25-key keyboardGeneric layout | 25 | – | – | – | – | 1 | – | – | 1 | Melody |
| Generic 49-key keyboardGeneric layout | 49 | – | – | – | – | 1 | – | – | 1 | Melody |
| Generic 61-key keyboardGeneric layout | 61 | – | – | – | – | 1 | – | – | 1 | Melody |
Knobs send an absolute position; encoders turn without end and send steps. A dash means none. Unverified counts the controls whose number is our best reading.
“Good for” is assigned by a rule from the counts: keys → melody; 8 or more pads → triggers; 8 or more knobs or encoders → many parameters; 4 or more faders → mixing. It is a rule of thumb, not a review.
LED feedback
LED feedback is a controller lighting its own pads and buttons. A profile that models it says which note or CC lights each control and which values mean on and off. 8 of the 27 profiles have it:
- AKAI APC mini mk2
- AKAI MIDImix
- AKAI APC40 mkII
- DJ TechTools Midi Fighter Twister
- Korg nanoKONTROL2
- Novation Launchpad Mini MK3
- Novation Launch Control XL (MK2)
- Novation Launchpad Pro MK3
When one of them is plugged in, OAV sends those messages to its output port as a control changes, and once when the device connects, so the lights can follow what happens on screen.
The other 19 have no LED messages in their profile yet: OAV does not light them, but every control still plays and sends its message. A profile takes an led entry on each control.
04 · Spec sheets
One page for each controller
Every controller has its own page with the full MIDI map, its sources, embed code and the names it gets in p5.js. They are generated from the JSON files at build time, so they cannot drift from what the component plays.
| Controller | Maker | On the faceplate | Page |
|---|---|---|---|
| AKAI LPD8 (mk2) | AKAI Professional | 8 pads · 8 knobs | MIDI map → |
| AKAI APC mini mk2 | AKAI Professional | 64 pads · 9 faders · 17 buttons | MIDI map → |
| AKAI MIDImix | AKAI Professional | 24 knobs · 9 faders · 19 buttons | MIDI map → |
| AKAI MPK mini mk3 | AKAI Professional | 8 pads · 25 keys · 8 knobs · 2 wheels | MIDI map → |
| AKAI APC40 mkII | AKAI Professional | 40 pads · 16 knobs · 2 encoders · 10 faders · 71 buttons | MIDI map → |
| Arturia MiniLab 3 | Arturia | 8 pads · 25 keys · 8 knobs · 1 encoder · 4 faders · 2 touch strips | MIDI map → |
| Arturia KeyStep 37 | Arturia | 37 keys · 4 knobs · 1 button · 2 touch strips | MIDI map → |
| Arturia BeatStep | Arturia | 16 pads · 16 encoders | MIDI map → |
| Behringer X-TOUCH MINI | Behringer | 8 encoders · 1 fader · 24 buttons | MIDI map → |
| DJ TechTools Midi Fighter Twister | DJ TechTools | 16 encoders · 22 buttons | MIDI map → |
| Korg nanoKONTROL2 | KORG | 8 knobs · 8 faders · 35 buttons | MIDI map → |
| Korg nanoKEY2 | KORG | 25 keys · 2 buttons · 1 touch strip | MIDI map → |
| Novation Launchpad Mini MK3 | Novation | 64 pads · 16 buttons | MIDI map → |
| Novation Launch Control XL (MK2) | Novation | 24 knobs · 8 faders · 24 buttons | MIDI map → |
| Novation Launch Control XL 3 | Novation | 24 encoders · 8 faders · 16 buttons | MIDI map → |
| Novation Launchkey Mini MK3 | Novation | 16 pads · 25 keys · 8 knobs · 2 touch strips | MIDI map → |
| Novation Launchkey 25 MK4 | Novation | 16 pads · 25 keys · 8 knobs · 1 button · 2 wheels | MIDI map → |
| Novation Launchkey 37 MK4 | Novation | 16 pads · 37 keys · 8 knobs · 1 button · 2 wheels | MIDI map → |
| Novation Launchpad Pro MK3 | Novation | 64 pads · 41 buttons | MIDI map → |
| ODD Ball | ODD | 3 pads · 4 knobs · 3 faders | MIDI map → |
| OP-1 field | teenage engineering | 24 keys · 4 encoders · 33 buttons | MIDI map → |
| Generic 8 knobs + 8 pads | Generic layout | 8 pads · 8 knobs | MIDI map → |
| Generic 8 faders | Generic layout | 8 faders | MIDI map → |
| Generic 16 pads | Generic layout | 16 pads | MIDI map → |
| Generic 25-key keyboard | Generic layout | 25 keys · 1 button · 2 wheels | MIDI map → |
| Generic 49-key keyboard | Generic layout | 49 keys · 1 button · 2 wheels | MIDI map → |
| Generic 61-key keyboard | Generic layout | 61 keys · 1 button · 2 wheels | MIDI map → |
05 · Embed it
Put one in your page
One line of HTML, an iframe, or JavaScript. Choose a device and options: the preview and every snippet below follow.
Live preview
The last event, as your code receives it
Play the preview: its control event appears here.
-
One line, any page
No import map, no build step. Shadow DOM keeps your page's CSS out and the controller's CSS in.
<script type="module" src="https://openaudiovisual.com/packages/midi/element.js"></script> <oav-controller profile="akai-lpd8" readout></oav-controller> -
An iframe
For places that only take an iframe. Every event arrives as a
postMessage; you can sendsetandingestback.<iframe src="https://openaudiovisual.com/embed/controller/?profile=akai-lpd8&readout" width="720" height="216" style="border:0;max-width:100%" allow="midi" title="AKAI LPD8 (mk2)"></iframe> <script> // every control the visitor plays arrives here addEventListener('message', (e) => { if (e.data?.source !== 'openav' || e.data.type !== 'control') return; console.log(e.data.detail.signal, e.data.detail.value); }); </script> -
JavaScript, any framework
createController()is the element without the element: React, Vue, Svelte or plain. It works headless, with no faceplate at all.import { createController } from 'https://openaudiovisual.com/packages/midi/index.js'; const ctl = createController('akai-lpd8'); ctl.mount(document.querySelector('#controller')); // optional: headless works too ctl.on('control', (e) => console.log(e.signal, e.value)); ctl.connectHardware(); // optional: follow the real one (asks for Web MIDI) -
Listen to it
Events bubble and cross the shadow root. Each payload is plain JSON: the control, its value, its signal name, the MIDI message and the bytes.
const el = document.querySelector('oav-controller'); el.addEventListener('control', (e) => { const { id, value, signal, message, source } = e.detail; // 'k1' 0..1 'midi/lpd8/k1' { type: 'cc', ch: 1, cc: 70, value: 64 } 'ui' | 'hardware' }); el.addEventListener('noteon', (e) => console.log(e.detail.note, e.detail.velocity)); await el.ready; el.set('k1', 0.5); // move a control: fires 'control', reaches MIDI out el.set('pad1', 1); el.set('pad1', 0); // strike and release el.ingest([0xb0, 70, 64]); // MIDI from anywhere (a WebSocket, another tab) -
Play your DAW with it
What you play on screen leaves as real MIDI, into Ableton Live, TouchDesigner, Resolume or any software that takes a MIDI input.
<!-- what you play on this controller → the IAC bus (macOS) → Ableton, TouchDesigner, Resolume --> <script type="module" src="https://openaudiovisual.com/packages/midi/element.js"></script> <oav-controller profile="akai-lpd8" midi-out="IAC" readout></oav-controller> <!-- Windows: midi-out="loopMIDI" · let the visitor pick a port: midi-out="ask" -->
The element, in one table
| Name | Kind | What it does |
|---|---|---|
profile | attribute | which device: an id, a short name, or a URL to a profile JSON |
layout | attribute | auto, face (as it looks) or stack (re-gridded for a tall box) |
hardware | attribute | follow the real device: on, ask (a button), or a port name |
midi-out | attribute | send what is played to an output: a port name, /regex/, or ask |
channel | attribute | 1–16: move every control to the channel your unit is set to |
picker · readout · learn · follow | attribute | device picker, last-message line, learn button, switch to the device you plug in |
control | event | any control moved: id, type, value, raw, signal, message, bytes, source |
noteon · noteoff | event | pads, keys and note buttons, with note and velocity |
connect · disconnect · status | event | the hardware port came or went; the state of hardware and MIDI out |
set(id, value) · get(id) · values() · reset() | method | move a control like a hand would, read it, read all, bring all home |
ingest(bytes) · send(bytes) | method | MIDI in from anywhere (the faceplate follows) · raw bytes to the output port |
on(name, fn) | method | subscribe, returns an unsubscribe function |
Everything, with every field of every payload: the package README →
06 · Model yours
Add your controller
A profile is one JSON file. If the manual has a MIDI implementation chart, the profile can be exact; if it does not, say so in the file.
- Start from the closest file Copy a device that looks like yours, or a generic layout. The faceplate is sections on a grid in face units, so the screen version looks like the desk.
- Write down what each control sends Type, message (
cc,note,pitchbend), channel, number. Encoders name their relative mode; buttons say momentary or toggle; LEDs say what lights them. - Cite every number Each source has a title, a link and what it confirmed. A number nobody has checked gets
"verified": falseand a note. - Validate
validateProfile()returns every problem in words, or an empty list. The test suite runs it on every shipped profile. - Try it before you send it
<oav-controller profile="./my-pads.json">loads a profile from a URL, so you can play your file on your own page first. - Open a pull request Put the file in
packages/midi/profiles/and add it toprofiles/index.js. Tell us which unit and firmware you checked it on.
A profile, in short
{
"id": "my-pads", "short": "mypads", "name": "My Pads", "maker": "…", "kind": "device",
"match": { "ports": ["my\\s*pads"] },
"sources": [{ "title": "My Pads manual, MIDI implementation chart", "url": "https://…",
"note": "pads: notes 36–43 on channel 10" }],
"face": { "w": 100, "h": 30, "label": "MY PADS" },
"sections": [{ "id": "pads", "x": 2, "y": 4, "w": 60, "h": 24, "cols": 4, "rows": 2,
"controls": ["pad1", "pad2", "…"] }],
"controls": [
{ "id": "pad1", "type": "pad", "msg": "note", "ch": 10, "note": 36, "label": "1" },
{ "id": "k1", "type": "knob", "msg": "cc", "cc": 70, "label": "K1",
"verified": false, "note": "default not printed in the manual" }
]
}Check it
// check.mjs — run: node check.mjs
import { validateProfile } from './packages/midi/profiles.js';
import p from './packages/midi/profiles/my-pads.json' with { type: 'json' };
console.log(validateProfile(p)); // [] = valid; otherwise every problem, in wordsControl types
| Type | Sends | Signal value |
|---|---|---|
knob · fader | CC, absolute 0–127 | 0..1 |
encoder | CC, relative (offset64, offset16, twos, signbit) | position 0..1, plus /delta steps |
pad | note with velocity (or CC); optional aftertouch | velocity while held, 0 on release, plus /hit |
button | note or CC; momentary or toggle | 0 or 1 |
keys | a note range | /on and /off pulses, n<note> while held |
wheel · strip | CC or pitch bend; may spring back | 0..1, or −1..1 when bipolar |
No manual? Learn it
Choose a generic layout, press Learn, and move your controls in order: the layout fills itself with your device's messages. exportMapping() gives you the result as JSON, the start of a real profile.