teenage engineering
teenage engineering OP-1 field
teenage engineering OP-1 field is a MIDI hardware controller by teenage engineering: 24 keys, 4 encoders and 33 buttons.
It sends CC and Note on channel 1. The profile cites 2 sources. No control is flagged unverified.
- Manufacturer docs
- Community notes
- Kind
- hardware device
- Maker
- teenage engineering
- Controls
- 61 controls
- Messages
- CC · Note
- MIDI channels
- 1
- LED feedback
- none sent
- Signals
midi/op1field/…- Port name matches
/\bop-?1\b/i
Drag knobs and faders · tap pads and keys · or plug the real one in and press Connect. Nothing is sent anywhere unless you add a MIDI out.
MIDI implementation
Every control of teenage engineering OP-1 field and the message it sends
Generated from the profile file, so it is the same table the on-screen controller plays. Channels are 1–16; numbers are real MIDI numbers.
| Control | Type | Message | Ch | Number | Signal | LED feedback | Verified |
|---|---|---|---|---|---|---|---|
enc1 |
encoder | CC · absolute | 1 | 1 | midi/op1field/enc1 |
— | yes |
enc2 |
encoder | CC · absolute | 1 | 2 | midi/op1field/enc2 |
— | yes |
enc3 |
encoder | CC · absolute | 1 | 3 | midi/op1field/enc3 |
— | yes |
enc4 |
encoder | CC · absolute | 1 | 4 | midi/op1field/enc4 |
— | yes |
push1 |
button | CC · momentary | 1 | 66 | midi/op1field/push1 |
— | yes |
push2 |
button | CC · momentary | 1 | 67 | midi/op1field/push2 |
— | yes |
push3 |
button | CC · momentary | 1 | 68 | midi/op1field/push3 |
— | yes |
push4 |
button | CC · momentary | 1 | 69 | midi/op1field/push4 |
— | yes |
? help |
button | CC · momentary | 1 | 5 | midi/op1field/help |
— | yes |
♩ metronome |
button | CC · momentary | 1 | 6 | midi/op1field/metronome |
— | yes |
↗ input |
button | CC · momentary | 1 | 48 | midi/op1field/input |
— | yes |
com |
button | CC · momentary | 1 | 49 | midi/op1field/com |
— | yes |
∿∿ synth |
button | CC · momentary | 1 | 7 | midi/op1field/synth |
— | yes |
◉ drum |
button | CC · momentary | 1 | 8 | midi/op1field/drum |
— | yes |
ꝏ tape |
button | CC · momentary | 1 | 9 | midi/op1field/tape |
— | yes |
ılı mixer |
button | CC · momentary | 1 | 10 | midi/op1field/mixer |
— | yes |
1 t1 |
button | CC · momentary | 1 | 11 | midi/op1field/t1 |
— | yes |
2 t2 |
button | CC · momentary | 1 | 12 | midi/op1field/t2 |
— | yes |
3 t3 |
button | CC · momentary | 1 | 13 | midi/op1field/t3 |
— | yes |
4 t4 |
button | CC · momentary | 1 | 14 | midi/op1field/t4 |
— | yes |
1 in k1 |
button | CC · momentary | 1 | 50 | midi/op1field/k1 |
— | yes |
2 out k2 |
button | CC · momentary | 1 | 51 | midi/op1field/k2 |
— | yes |
3 ↺ k3 |
button | CC · momentary | 1 | 52 | midi/op1field/k3 |
— | yes |
4 ꝏ k4 |
button | CC · momentary | 1 | 21 | midi/op1field/k4 |
— | yes |
5 я k5 |
button | CC · momentary | 1 | 22 | midi/op1field/k5 |
— | yes |
6 ⋯ k6 |
button | CC · momentary | 1 | 23 | midi/op1field/k6 |
— | yes |
7 m1 k7 |
button | CC · momentary | 1 | 24 | midi/op1field/k7 |
— | yes |
8 m2 k8 |
button | CC · momentary | 1 | 25 | midi/op1field/k8 |
— | yes |
⋰ seq |
button | CC · momentary | 1 | 26 | midi/op1field/seq |
— | yes |
⤒ lift |
button | CC · momentary | 1 | 15 | midi/op1field/lift |
— | yes |
⤓ drop |
button | CC · momentary | 1 | 16 | midi/op1field/drop |
— | yes |
✂ split |
button | CC · momentary | 1 | 17 | midi/op1field/split |
— | yes |
● rec |
button | CC · momentary | 1 | 38 | midi/op1field/rec |
— | yes |
▶ play |
button | CC · momentary | 1 | 39 | midi/op1field/play |
— | yes |
■ stop |
button | CC · momentary | 1 | 40 | midi/op1field/stop |
— | yes |
← left |
button | CC · momentary | 1 | 41 | midi/op1field/left |
— | yes |
→ right |
button | CC · momentary | 1 | 42 | midi/op1field/right |
— | yes |
Keys keys |
keys | Note · velocity | 1 | 53–76 (F3–E5) | midi/op1field/keys/on · midi/op1field/keys/off · midi/op1field/n53…n76 |
— | yes |
LED feedback is not modeled for this one yet, so OAV does not light its LEDs. Every control still plays and sends its message.
Notes on single controls
enc1CC 1, tested on hardware: absolute 0–127 (the unit's CTRL page has encoders set to absolute). Set to relative, the original OP-1 is reported to send 1 per step right and 127 per step left: change relative to "twos".enc2CC 2, tested on hardware: absolute 0–127 (the unit's CTRL page has encoders set to absolute). Set to relative, the original OP-1 is reported to send 1 per step right and 127 per step left: change relative to "twos".enc3CC 3, tested on hardware: absolute 0–127 (the unit's CTRL page has encoders set to absolute). Set to relative, the original OP-1 is reported to send 1 per step right and 127 per step left: change relative to "twos".enc4CC 4, tested on hardware: absolute 0–127 (the unit's CTRL page has encoders set to absolute). Set to relative, the original OP-1 is reported to send 1 per step right and 127 per step left: change relative to "twos".push1Pressing the blue encoder, tested on hardware: CC 66, 127 while held, 0 on release. On release the unit also sends a one-off CC 59 127/0 pulse, not modelled.push2Pressing the ochre encoder, tested on hardware: CC 67, 127 while held, 0 on release. On release the unit also sends a one-off CC 60 127/0 pulse, not modelled.push3Pressing the gray encoder, tested on hardware: CC 68, 127 while held, 0 on release. On release the unit also sends a one-off CC 61 127/0 pulse, not modelled.push4Pressing the orange encoder, tested on hardware: CC 69, 127 while held, 0 on release. On release the unit also sends a one-off CC 62 127/0 pulse, not modelled.keysTested on hardware: the 24 keys run F3 (53) to E5 (76) at the default octave, velocity was 127 on every press in the test. Keys follow any note on the channel, so octave shifts just scroll the on-screen keys.
Sources
- manufacturer OP-1 field user guide, fw 1.7 (teenage engineering)CTRL mode (shift + COM → T2) turns the unit into a controller; control MIDI channel settable 1–16; encoders send relative or absolute (unit setting); MIDI over USB and Bluetooth LE; the field's encoders are blue, ochre, gray and orange
- community Support for Teenage Engineering OP-1 — Zynthian forum (non-official)community report for the original OP-1: encoders = CC 1–4 (blue, green, white, orange on the original — blue, ochre, gray, orange on the field — in the MIDI log's column order), relative 1 = right, 127 = left; encoder push = CC 64–67, 127 press / 0 release. On the tested OP-1 field the encoders matched (CC 1–4); its pushes send CC 66–69 instead
Notes
Before anything is sent: COM → T1 sys → midi, set NOTES and OTHER to OUT (both were OFF on the unit this was tested on, and CTRL mode sent nothing until they were set). Then CTRL mode: shift + COM → T2. Tested over USB on an OP-1 field. Its MIDI port is named just "OP-1" (macOS, USB 2367:8102), so the port match cannot tell it from the original OP-1. Control channel 1 (settable 1–16 on the CTRL page; use the element's channel attribute if yours differs). Every control was pressed once on the tested unit: encoders CC 1–4 (absolute as tested; the CTRL page can switch them to relative), encoder pushes CC 66–69, T1–T4 CC 11–14, help 5, metronome 6, synth/drum/tape/mixer 7–10, lift/drop/scissors 15–17, keys 1–3 CC 50–52, keys 4–8 CC 21–25, sequencer 26, record/play/stop 38–40, input 48, COM 49, ← → 41–42 (with OCTAVE off) — all 127 press / 0 release. Hold shift on the CTRL page for its settings: MIDI CH, KNOBS (abs/rel) and OCTAVE. With OCTAVE on, the ← → arrows shift the keyboard an octave and send nothing; turn it off to use them as CC 41/42. Shift and the volume knob send nothing (both tested): they are drawn, not mapped. On screen, tap a knob's centre to press it and drag its ring to turn it. The faceplate follows the top view in TE's user guide. No LED feedback.
Port names it recognises
- matches
/\bop-?1\b/i
Signals
Every control publishes midi/op1field/<control> (0..1), plus /raw; pads add /hit, encoders /delta, keys /on /off and n<note>; the last control touched is midi/op1field/last.
Use it
Use teenage engineering OP-1 field in your own work
Embed it with one line
No import map, no build step. Change
layout, addhardware="ask"for a Connect button.<script type="module" src="https://openaudiovisual.com/packages/midi/element.js"></script> <oav-controller profile="teenage-engineering-op-1-field" readout></oav-controller>Or as an iframe
For places that only take an iframe. Every event arrives as a
postMessage.<iframe src="https://openaudiovisual.com/embed/controller/?profile=teenage-engineering-op-1-field&readout" width="720" height="281" style="border:0;max-width:100%" allow="midi" title="OP-1 field"></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>Send it to Ableton, TouchDesigner or Resolume
What you play on screen leaves as real MIDI on the IAC bus (macOS) or a loopMIDI port (Windows). The steps are on the catalog page.
<!-- 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="teenage-engineering-op-1-field" midi-out="IAC" readout></oav-controller> <!-- Windows: midi-out="loopMIDI" · let the visitor pick a port: midi-out="ask" -->macOS: Audio MIDI Setup → MIDI Studio → IAC Driver → “Device is online”. Windows 11: the built-in Windows MIDI Services have a loopback (not tested by us); older Windows: install loopMIDI, add a port and use
midi-out="loopMIDI".
In p5.js, with one line
The one-line injection names knobs, faders and pads by their order in this profile, the order of the table above. Add ?profile=teenage-engineering-op-1-field to make the on-screen controller this one; a real teenage engineering OP-1 field is recognised by its port name.
document.head.prepend(Object.assign(document.createElement('script'), { src: 'https://openaudiovisual.com/p5/oav-p5.js?profile=teenage-engineering-op-1-field' }));| In your sketch | Control | Message |
|---|---|---|
notePressed(note, velocity) | 53–76 (F3–E5) | a key goes down |
function draw() {
background(20);
}
function notePressed(note, velocity) { // a key goes down
circle(random(width), random(height), velocity * 100);
}Encoders, buttons, wheels and strips are not numbered: read them as midi.cc[number] in the table above, or react in controlChange(cc, value, ch).
Missing
Is your controller not here?
Open an issue with the brand and model, whether you have the unit and a link to the manual. Or write the profile yourself: it is one JSON file.
GitHub
Is something in this data wrong?
Every number on this page comes from one JSON file. If it disagrees with your unit or the manual, tell us which firmware you checked and we fix the file.