Subsystem Search

This page is read from MIDI Instrument Definitions, a Python library used in the author's other projects, in which every number is traced to a document its maker published. Its source is on GitHub.

Teenage engineering OP-Z MIDI implementation

The MIDI implementation of the teenage engineering OP-Z: what it answers to, and the 53 controls it offers, on firmware 1.2.45.

At a glance

Firmware
This page describes firmware 1.2.45.
MIDI channel
Any one of 1 to 16.
Parts
Track, 16 of them: each on a MIDI channel of its own, taking notes and controls.
Voices
Not recorded.
Note range
Not recorded.
Velocity
Not recorded.
Aftertouch
Not recorded.
Pitch bend
Not recorded.
Program change
Received and sent.
MIDI clock
Sent and received.
Start and stop
Received.
Control change
53 controls, in the tables below.
NRPN
Not recorded.
System exclusive
Not recorded.

Controls

In the order the definition gives them, by part and group. Under each control is the name a program calls it by, once pymidiinstrumentdefs.load("teenage_engineering/op_z") has loaded them.

Track

Parameters

Control CC Values
parameter 1
parameter_1
1 0-127
Received, never sent
parameter 2
parameter_2
2 0-127
Received, never sent
filter cutoff
filter_cutoff
3 0-127
Received, never sent
filter resonance
filter_resonance
4 0-127
Received, never sent
envelope attack
envelope_attack
5 0-127
Received, never sent
envelope decay
envelope_decay
6 0-127
Received, never sent
envelope sustain
envelope_sustain
7 0-127
Received, never sent
envelope release
envelope_release
8 0-127
Received, never sent
lfo depth
lfo_depth
9 0-127
Received, never sent
lfo speed
lfo_speed
10 0-127
Received, never sent
lfo target
lfo_target
11 0-127
Received, never sent
lfo shape
lfo_shape
12 0-127
Received, never sent
fx 1 send
fx_1_send
13 0-127
Received, never sent
fx 2 send
fx_2_send
14 0-127
Received, never sent
pan
pan
15 0-127
Received, never sent
volume
volume
16 0-127
Received, never sent
portamento
portamento
17 0-127
Received, never sent
note style
note_style
18 0-127
Received, never sent

Parameters (relative)

Control CC Values
parameter 1, relative
parameter_1_relative
32 1 n1, 127 n127
Received, never sent
parameter 2, relative
parameter_2_relative
33 1 n1, 127 n127
Received, never sent
filter cutoff, relative
filter_cutoff_relative
34 1 n1, 127 n127
Received, never sent
filter resonance, relative
filter_resonance_relative
35 1 n1, 127 n127
Received, never sent
envelope attack, relative
envelope_attack_relative
36 1 n1, 127 n127
Received, never sent
envelope decay, relative
envelope_decay_relative
37 1 n1, 127 n127
Received, never sent
envelope sustain, relative
envelope_sustain_relative
38 1 n1, 127 n127
Received, never sent
envelope release, relative
envelope_release_relative
39 1 n1, 127 n127
Received, never sent
lfo depth, relative
lfo_depth_relative
40 1 n1, 127 n127
Received, never sent
lfo speed, relative
lfo_speed_relative
41 1 n1, 127 n127
Received, never sent
lfo target, relative
lfo_target_relative
42 1 n1, 127 n127
Received, never sent
lfo shape, relative
lfo_shape_relative
43 1 n1, 127 n127
Received, never sent
fx 1 send, relative
fx_1_send_relative
44 1 n1, 127 n127
Received, never sent
fx 2 send, relative
fx_2_send_relative
45 1 n1, 127 n127
Received, never sent
pan, relative
pan_relative
46 1 n1, 127 n127
Received, never sent
volume, relative
volume_relative
47 1 n1, 127 n127
Received, never sent
portamento, relative
portamento_relative
48 1 n1, 127 n127
Received, never sent
note style, relative
note_style_relative
49 1 n1, 127 n127
Received, never sent

System

Control CC Values
track gain
track_gain
50 0-127
Received, never sent
TRACK GAIN (RELATIVE)
track_gain_relative
51 1 n1, 127 n127
Received, never sent
mute
mute
53 0-1
Received, never sent
audio mute
audio_mute
54 0-1
Received, never sent

Track

Control CC Values
TRACK STEP COUNT
track_step_count
60 1-16
Received, never sent
TRACK STEP LENGTH
track_step_length
61 1-16
Received, never sent
quantize
quantize
62 0-127
Received, never sent
note length
note_length
63 0-127
Received, never sent

On the base MIDI channel

System

Control CC Values
reset track gains
reset_track_gains
52 0-127
Received, never sent
mute group
mute_group
55 0-9
Received, never sent
tempo
tempo
56 0-127
Received, never sent
swing
swing
57 0-127
Received, never sent
select pattern
select_pattern
103 0-15
Received, never sent
next pattern
next_pattern
103 16 triggered
Received, never sent
previous pattern
previous_pattern
103 17 triggered
Received, never sent

UI

Control CC Values
active track
active_track
102 0-15
Received, never sent
parameter page
parameter_page
102 0-3
Received, never sent

Where these facts come from

Source documents

How they were read

The OP-Z's online guide, v.1.2.45, a website of 24 numbered sections, cited by the section number each page prints in its own heading: the hardware at 1, the parameter pages at 4, the track button at 5, projects at 7, the mixer at 8, tempo at 9, the tracks at 11, tape at 13, usb at 20, midi at 21, the app at 23 and the reference at 24. Every other section was saved and searched too. And the maker's OS updates page, whose release notes carry several MIDI facts the guide does not, and its product page.

ONE TABLE OF CONTROLLER NUMBERS, AND IT IS WHAT THE OP-Z RECEIVES. Section 21.6 is headed "incoming midi table" (midi), and no other page prints a controller number. Section 21 opens, at 21.1: "each of the OP-Z's 16 tracks can both send and receive midi. the outgoing cc values of each parameter on each track can be assigned a custom control number." (midi). The configuration file, midi.json, gives parameter_cc_out, from 0 to 255, as "set outgoing cc value per parameter per track" (midi), and the app does the same: "select a parameter indicator and use the touch pad to edit the midi control change number it sends out." (app). So the parameters' values are sent, under numbers the player assigns - but no page prints those numbers before the player sets them, or says what an outgoing number above 127 means, and every control below is therefore recorded as received only. The notes to 1.2.38 add that a knob sends even on a muted track: "allow sending cc from knobs on muted track" (os_updates).

SIXTEEN TRACKS, EACH ON A CHANNEL OF ITS OWN. "OP-Z is a 16-track sequencer. it features eight audio tracks and eight control tracks." (tracks), and "in parallel, all 16 tracks can also send and receive midi, each on its own channel." (tracks). Tracks 1 to 4 are kick, snare, perc and sample, 5 to 8 bass, lead, arp and chord, and 9 to 16 fx1, fx2, tape, master, perform, module, lights and motion (tracks). The player sets each track's channel - "set midi channel 1–16 for selected track" (midi) - but the guide three times calls it the outgoing or send channel: "the outgoing channel of each track can also be customized." (midi), track_channels, "set outgoing channel per track" (midi), and "it is also possible to assign the midi cc values and midi send channels for each track." (midi). No page says whether what arrives follows it, or gives a track's channel before it is set. A setting sends channel 1 to whichever track is selected: "any incoming midi on channel 1 is redirected to the currently active track" (midi). And with no module fitted, "the module track can act as a midi track with 16 independent midi CC values." (tracks), with no numbers given for them.

NOTES ARRIVE, AND NO PAGE SAYS WHAT AN INCOMING NOTE DOES ON MOST TRACKS. No page names a note message. That notes arrive rests on the notes to 1.1.23, "allow programming steps with external controller" (os_updates), on the redirect above, on a MIDI keyboard among the supported devices, korg microkey air 25 (usb), and on the notes to 1.1.27, "improved usb midi throughput (reduce risk of lost notes)" (os_updates). Only the synth tracks, 5 to 8, are described as playing pitches. The drum tracks are kits: "they are all sample based and consist of 24 different sounds across the musical keyboard." (tracks). On the control tracks the keys do other things - on tape, "the white keys are used to choose from which part of the buffer playback begins." (tape). All of that is said of the built-in keys, and no page says how an incoming note maps onto a kit's 24 sounds or onto a control track. A part holds one way of addressing notes, so none is recorded.

THE TABLE'S CHANNEL COLUMN SAYS WHAT A ROW REACHES. Where it reads 1-16, the channel picks the track, and those controls name the track part below. Where it reads any, the row reaches the whole instrument on any channel. Three rows read neither: select pattern, 1-10, and the two ui rows, 0 and 1 (midi). 0 is no MIDI channel, and 1 is one fixed channel rather than a track's; no page explains either. The table counts programs and patterns from 0, and if its ui column does too, 0 and 1 are channels 1 and 2 - a possibility, not a finding. The table's sections are parameters, system, track, other and real time, and ui, and the groups below are named after them.

THE PARAMETER ROWS FOLLOW THE PARAMETER PAGES' ORDER, IN THEIR OWN WORDS. The first sixteen, parameter 1 to volume (midi), follow dial by dial the parameter pages' chart for bass, lead, chord and module, whose words differ: the chart's param 1, filter, lfo amount and level are the table's parameter 1, filter cutoff, lfo depth and volume (parameter_pages). The last two, portamento and note style, are the track button's own parameters (track). The chart gives the drum tracks pitch and reverse in the first two places, the arp track arp controls in place of the lfo, and the fx, tape, master, motion and lights tracks fewer or different controls (parameter_pages). No page says outright what a parameter row reaches on such a track. The tape section comes closest: it lists speed coarse, speed fine, filter and resonance, and adds "pro-tip: sending midi cc simultaneously to parameters 1 and 2 can result in some cool scratching effects." (tape).

EIGHTEEN PARAMETERS TWICE: ONCE ABSOLUTE AND ONCE RELATIVE. Each parameter row gives an absolute number, 1 to 18 over 0 to 127, and a relative one, 32 to 49, whose range reads 1, 127 (midi); system's TRACK GAIN (RELATIVE), 51, reads the same. No page says which of 1 and 127 raises a value and which lowers it, so the relative controls carry the two values as choices named for themselves, n1 and n127, with the n that novation/circuit puts before a name that starts with a digit (n4ths). The table prints each parameter's name once, against both numbers, so the relative controls' labels add , relative to it.

PATTERNS BY CONTROLLER 103, AND 102 ON TWO FIXED CHANNELS. The table gives 103 three times: select pattern, 0-15 on channels 1-10; next pattern, 16, and previous pattern, 17, on any (midi). The notes to 1.2.8 add a controller for it - "add cc for changing/switching to next/prev pattern." (os_updates) - and link to the whole table. The ui rows give 102 twice, active track 0-15 on channel 0 and parameter page 0-3 on channel 1 (midi), and the notes to 1.2.12 appear to name them: "disregard 'channel_one_to_active' setting when processing incoming UI group CC messages" (os_updates). Mute reads 0-1, and the notes to 1.2.20 widen it: "change track mute cc to treat value 127 as mute (in addition to 1)" (os_updates); the control keeps the table's range, within which 1 mutes in every release, and no page says what 2 to 126 do. Mute group's 0-9 fits "each project holds 10 mute groups." (mixer). What muting does to MIDI is in the mixer section: "tracks that are lit are active, playing audio and sending midi information by default. tracks that are unlit are muted." (mixer), while the audio mute "will mute only the track audio but not the outgoing midi." (mixer).

PROGRAM CHANGE SELECTS PATTERNS, NOT SOUNDS, BOTH WAYS. "each of the 10 projects holds 16 pattern." (project), so 160 patterns. A setting decides how: on, "use bank 1–16 / program 1–16 to set active pattern" (midi); off, "pattern 1–16 is activated with bank 1 / program 1–128 and bank 2 / program 1–32" (midi), where midi.json's description of the same setting reads "pattern 1–160" (midi), and 128 and 32 make 160. The table's two program change rows read 0-15 on channels 1-10 and 0-127 on channels 1, 2 (midi). So the settings count programs from 1 and the table from 0, and the settings speak of a bank where the table gives a channel. No page says whether a bank is a bank select message, and the table gives 32, the MIDI specification's bank select LSB, to parameter 1 in its relative column (midi). Another setting reads "enable program change in/out" (midi), and the notes to 1.1.12 confirm the OP-Z sends one: "outgoing program change had inverted “alt_program_change” setting" (os_updates). Since 1.2.14 one takes effect at once: "switch pattern immediately on incoming program change (instead of waiting until next step)" (os_updates). What it reaches is a pattern, so no preset count is recorded.

CLOCK BOTH WAYS, TRANSPORT RECEIVED. Two settings enable incoming midi clock and outgoing midi clock (midi); "sending midi clock to OP-Z will automatically activate the external sync mode." (tempo), but "by default, incoming midi clock is disabled, this can be configured in the midi settings." (tempo). The notes to 1.2.5 send clock on its own: "send clock out if enabled even though midi out is disabled" (os_updates). Start, stop and continue each have a row in the table, and song pointer and sense read not used (midi). The notes to 1.1.23 pass transport on - "pass incoming midi start/continue/stop to other ports" (os_updates) - and also "improve midi continue behaviour (works better with OP-1)" (os_updates) without saying in which direction. No page says that pressing play sends a start; relaying what came in is not originating it, as teenage_engineering/op_xy rules on the same kind of note.

PITCH BEND BOTH WAYS, AND NO RANGE. The table gives pitch bend on channels 1-16 (midi), and the notes to 1.2.38 send it: "send pitch bend on correct midi channel when remapped" (os_updates). No page states a bend range or a setting for one, so the bend field is not recorded, and the part's receives has no word for pitch bend.

POLYPHONY IS STATED FOR TRACKS 1 TO 8, AND PER STEP. The drum tracks: "each track in this group has a two note polyphony per step." (tracks). Bass is monophonic, lead "the polyphony for this track is three, meaning maximum three notes per step." (tracks), arp monophonic, and chord four, which a setting in general.json raises - the one place the guide tells voices from notes per step: "increases the chord track polyphony from four to six notes. Note: this doesn't affect the number of notes per step, which is still four." (reference). No polyphony is given for the control tracks. One part carries the sixteen tracks because each is reached on its own channel, and a part holds one polyphony, so the figures are here and in no field.

MIDI IS SWITCHED ON AND OFF BY EIGHT SETTINGS, AND ONE DEFAULT IS PRINTED. Holding the tempo and screen buttons, keys 1 to 8 toggle channel one to active, incoming midi, outgoing midi, midi clock in, midi clock out, alt program change, midi echo and program change, and a track key mutes all MIDI on its track (midi); midi.json holds the same, with track_enable, "enable midi per track" (midi). The only default printed is clock in's, off (tempo), so a sender whose messages are ignored should check every one of them. The gesture moved in 1.2.38: "move midi settings to SCREEN + TEMPO" (os_updates).

WHERE MIDI TRAVELS. The one wired MIDI port is "usb-c port for charging, file transfers and midi." (hardware), and it is a host too: "OP-Z has usb host functionality that allows you to connect usb devices directly into the usb-c port." (usb). As a host it has limits: "the OP-Z can provide a maximum of 100 mA which is not enough for some midi devices." (usb), and "some devices present themselves as more than one midi device, which currently is not supported by the OP-Z." (usb); the notes to 1.1.27 add "now supporting two midi devices when using a powered USB hub" (os_updates). The product page adds "wireless communication over ble" (product_page), and the notes to 1.2.45 name MIDI over it: "reduced ble midi jitter" (os_updates). MIDI is passed between them: midi.json's echo adds "+ midi through to other ports" (midi), and transport is passed on as above.

MORE THINGS STATED TWO WAYS, NONE IN A FIELD, ALL FOUND BY THE BLIND SECOND READER. Midi echo is "echo incoming midi back on same port" (midi) among the settings, where midi.json adds the through. External sync "is indicated by four green leds showing the current tempo when tempo button is held." (midi), and in the tempo section "this is indicated by the track leds 1-16 blinking green, in groups of four." (tempo). And three numbers no page maps onto what they set: 61, TRACK STEP LENGTH, reads 1-16 (midi), where the track section sets a multiplier, "note: setting the multiplier to 9 makes the track 16 times longer." (track); 56, tempo, reads 0-127 against "values between 40 – 200 bpm can be used." (tempo); and 57, swing, reads 0-127 against "no swing is a 50% setting." (tempo).

NOT RECORDED, AND WHY. System exclusive: the one mention is in the notes to 1.1.12, "occasional crash when recieving midi identity request on startup" (os_updates), and a crash that stopped happening is not a statement that the OP-Z answers, as teenage_engineering/op_xy rules. NRPN: 98 to 101 are not in the incoming table, 6 and 38, the data entry pair, are envelope decay and envelope sustain's relative number there, and no page names NRPN or RPN - but what goes out is the player's choice of number from 0 to 255, which no page explains, so nothing is claimed for it. No page says that MIDI velocity is sent or received - the guide's velocity is a sequencer step's - and none states aftertouch, a note range or a MIDI mode; the poly and mono of the track button are note styles (track). The words aftertouch, nrpn and sysex appear on no page saved.