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.
Oberheim OB-X8 MIDI implementation
The MIDI implementation of the Oberheim OB-X8: what it answers to, and the 147 controls it offers, on firmware 2.0.
At a glance
- Firmware
- This page describes firmware 2.0.
- MIDI channel
- 1 to 16.
- Modes
- Normal.
Split.
Double. - MPE
- Received: its voices are spread across its MIDI channels, a note to each.
- Parts
- Lower: on the base MIDI channel, taking notes and controls, with 4 voices, in Split only.
Upper: on the MIDI channel one above the base, taking notes and controls, with 4 voices, in Split only. - Voices
- 8.
- Note range
- Not recorded.
- Velocity
- Sent and received. Release velocity is ignored.
- Aftertouch
- Channel pressure and polyphonic, each answered. It sends aftertouch too.
- Pitch bend
- 12 semitones, and the range can be changed.
- Program change
- Received and sent.
- MIDI clock
- Received.
- Start and stop
- Received.
- Control change
- 105 controls, in the tables below.
- NRPN
- Supported, and preferred to CC. 133 of the controls below have one.
- System exclusive
- Supported.
Controls
In the order the definition gives them, by group. Under each control is the name a program calls it by, once pymidiinstrumentdefs.load("oberheim/ob_x8") has loaded them.
Oscillators
| Control | CC | NRPN | Values |
|---|---|---|---|
OSC 1 FREQosc_1_freq |
15 | 1 MSB 0, LSB 1 |
0-63 |
0SC 2 FREQosc_2_freq |
16 | 2 MSB 0, LSB 2 |
0-63 |
OSC 2 DETUNEosc_2_detune |
17 | 3 MSB 0, LSB 3 |
0-63 |
OSC 1 WAVEFORMosc_1_waveform |
19 | 5 MSB 0, LSB 5 |
0-3 |
OSC 2 WAVEFORMosc_2_waveform |
20 | 6 MSB 0, LSB 6 |
0-3 |
OSC 1 PWosc_1_pw |
21 | 7 MSB 0, LSB 7 |
0-127 |
OSC 2 PWosc_2_pw |
22 | 8 MSB 0, LSB 8 |
0-127 |
OSC 1 XMODosc_1_xmod |
12 | 9 MSB 0, LSB 9 |
0-1 |
OSC SQUARE MODEosc_square_mode |
23 | 10 MSB 0, LSB 10 |
0-1 |
OSC 1 FILTER ENV MODosc_1_filter_env_mod |
12 | 12 MSB 0, LSB 12 |
0-1 |
OSC 1 SYNCosc_1_sync |
24 | 13 MSB 0, LSB 13 |
0-1 |
OSC 1 LEVELosc_1_level |
25 | 19 MSB 0, LSB 19 |
0-1 |
OSC 2 LEVELosc_2_level |
26 | 20 MSB 0, LSB 20 |
0-1 |
NOISE LEVELnoise_level |
29 | 21 MSB 0, LSB 21 |
0-1 |
Page 2 oscillators
| Control | CC | NRPN | Values |
|---|---|---|---|
PAGE 2 VOICE DETUNE RANGEpage_2_voice_detune_range |
18 | 4 MSB 0, LSB 4 |
0-127 |
PAGE 2 OSC XMOD AMTpage_2_osc_xmod_amt |
13 | 11 MSB 0, LSB 11 |
0-127 |
PAGE 2 OSC 1 ON LEVELpage_2_osc_1_on_level |
27 | 97 MSB 0, LSB 97 |
0-127 |
PAGE 2 OSC 2 ON LEVELpage_2_osc_2_on_level |
28 | 98 MSB 0, LSB 98 |
0-127 |
PAGE 2 NOISE ON LEVELpage_2_noise_on_level |
30 | 99 MSB 0, LSB 99 |
0-127 |
Control
| Control | CC | NRPN | Values |
|---|---|---|---|
PORTAMENTO RATEportamento_rate |
5 | 14 MSB 0, LSB 14 |
0-127 |
VINTAGEvintage |
3 | 26 MSB 0, LSB 26 |
0-127 |
Page 2 portamento
| Control | CC | NRPN | Values |
|---|---|---|---|
PAGE 2 PORTAMENTO MODEpage_2_portamento_mode |
91 | 15 MSB 0, LSB 15 |
0-66 |
PAGE 2 PORTAMENTO MATCHpage_2_portamento_match |
92 | 16 MSB 0, LSB 16 |
0-1 |
PAGE 2 PORTAMENTO QUANTIZEpage_2_portamento_quantize |
93 | 17 MSB 0, LSB 17 |
0-1 |
PAGE 2 PORTAMENTO LEGATOpage_2_portamento_legato |
94 | 18 MSB 0, LSB 18 |
0-1 |
Filter
| Control | CC | NRPN | Values |
|---|---|---|---|
FILTER FREQUENCYfilter_frequency |
33 | 22 MSB 0, LSB 22 |
0-175 |
FILTER RESONANCEfilter_resonance |
34 | 23 MSB 0, LSB 23 |
0-127 |
FILTER TYPEfilter_type |
35 | 24 MSB 0, LSB 24 |
0-5 |
FILTER KBD TRACKfilter_kbd_track |
25 MSB 0, LSB 25 |
0-1 | |
FILTER MODULATIONfilter_modulation |
31 | 59 MSB 0, LSB 59 |
0-127 |
FILTER PRESSUREfilter_pressure |
44 | 70 MSB 0, LSB 70 |
0-1 |
FILTER KEYBOARDfilter_keyboard |
36 | 0-1 | |
BRIGHTNESS (FILTER CUTOFF - RELATIVE)brightness_filter_cutoff_relative |
74 | 0-175 |
Page 2 LFO 1
| Control | CC | NRPN | Values |
|---|---|---|---|
PAGE 2 LFO TYPEpage_2_lfo_type |
62 | 27 MSB 0, LSB 27 |
0-1 |
PAGE 2 LFO SAMPLE/HOLD INpage_2_lfo_sample_hold_in |
63 | 28 MSB 0, LSB 28 |
0-1 |
PAGE 2 LFO 1 TRIGGERpage_2_lfo_1_trigger |
102 | 39 MSB 0, LSB 39 |
0-1 |
PAGE 2 LFO 1 TRIGGER PHASEpage_2_lfo_1_trigger_phase |
103 | 40 MSB 0, LSB 40 |
0-127 |
PAGE 2 LFO 1 KBD TRACKpage_2_lfo_1_kbd_track |
104 | 41 MSB 0, LSB 41 |
0-1 |
PAGE 2 LFO 1 MOD 1 RAMP DELAYpage_2_lfo_1_mod_1_ramp_delay |
105 | 42 MSB 0, LSB 42 |
0-127 |
PAGE 2 LFO 1 MOD 1 RAMP UPpage_2_lfo_1_mod_1_ramp_up |
106 | 43 MSB 0, LSB 43 |
0-127 |
PAGE 2 LFO 1 RAMP INVERTpage_2_lfo_1_ramp_invert |
107 | 44 MSB 0, LSB 44 |
0-1 |
PAGE 2 LFO 1 MOD 1 QUANTIZEpage_2_lfo_1_mod_1_quantize |
108 | 45 MSB 0, LSB 45 |
0-1 |
PAGE 2 LFO 1 OSC 1 MOD 1 INVERTpage_2_lfo_1_osc_1_mod_1_invert |
109 | 46 MSB 0, LSB 46 |
0-1 |
PAGE 2 LFO 1 MOD 2 RAMP DELAYpage_2_lfo_1_mod_2_ramp_delay |
110 | 47 MSB 0, LSB 47 |
0-127 |
PAGE 2 LFO 1 MOD 2 RAMP UPpage_2_lfo_1_mod_2_ramp_up |
111 | 48 MSB 0, LSB 48 |
0-127, or 0-27 by NRPN |
PAGE 2 LFO 1 MOD 2 RAMP INVERTpage_2_lfo_1_mod_2_ramp_invert |
112 | 49 MSB 0, LSB 49 |
0-1 |
PAGE 2 LFO 1 MOD 2 QUANTIZEpage_2_lfo_1_mod_2_quantize |
113 | 50 MSB 0, LSB 50 |
0-1 |
PAGE 2 LFO 1 OSC 1 MOD 2 INVERTpage_2_lfo_1_osc_1_mod_2_invert |
114 | 51 MSB 0, LSB 51 |
0-1 |
PAGE 2 MOD 2 RAMP TO LFO SPEEDpage_2_mod_2_ramp_to_lfo_speed |
115 | 52 MSB 0, LSB 52 |
0-1 |
PAGE 2 LFO SHIFT VOICES 5-8page_2_lfo_shift_voices_5_8 |
116 | 53 MSB 0, LSB 53 |
0-2 |
LFO 1
| Control | CC | NRPN | Values |
|---|---|---|---|
LFO 1 RATElfo_1_rate |
51 | 29 MSB 0, LSB 29 |
0-127 |
LFO 1 SHAPElfo_1_shape |
52 | 30 MSB 0, LSB 30 |
0-4 |
LFO 1 DEPTH 1lfo_1_depth_1 |
53 | 31 MSB 0, LSB 31 |
0-127 |
LFO 1 DEPTH 2lfo_1_depth_2 |
54 | 32 MSB 0, LSB 32 |
0-127 |
LFO 1 DEST 1 OSC 1lfo_1_dest_1_osc_1 |
55 | 33 MSB 0, LSB 33 |
0-1 |
LFO 1 DEST 1 OSC 2lfo_1_dest_1_osc_2 |
56 | 34 MSB 0, LSB 34 |
0-1 |
LFO 1 DEST 1 FILTERlfo_1_dest_1_filter |
57 | 35 MSB 0, LSB 35 |
0-1 |
LFO 1 DEST 2 PWM 1lfo_1_dest_2_pwm_1 |
58 | 36 MSB 0, LSB 36 |
0-1 |
LFO 1 DEST 2 PWM 2lfo_1_dest_2_pwm_2 |
59 | 37 MSB 0, LSB 37 |
0-1 |
LFO 1 DEST 2 VOLUMElfo_1_dest_2_volume |
60 | 38 MSB 0, LSB 38 |
0-1 |
Mod box LFO 2
| Control | CC | NRPN | Values |
|---|---|---|---|
MOD BOX LFO 2 RATEmod_box_lfo_2_rate |
75 | 54 MSB 0, LSB 54 |
0-127 |
MOD BOX LFO 2 SHAPEmod_box_lfo_2_shape |
76 | 55 MSB 0, LSB 55 |
0-5 |
MOD BOX LFO 2 DEPTHmod_box_lfo_2_depth |
79 | 58 MSB 0, LSB 58 |
0-127 |
MOD BOX LFO2 BEND AMOUNTmod_box_lfo2_bend_amount |
1 | 72 MSB 0, LSB 72 |
0-255, or 0-12 by NRPN |
MOD BOX LFO 2 LOWERmod_box_lfo_2_lower |
82 | 78 MSB 0, LSB 78 |
0-1 |
MOD BOX LFO 2 UPPERmod_box_lfo_2_upper |
83 | 79 MSB 0, LSB 79 |
0-1 |
MOD BOX LFO 2 BEND OSC 2 ONLYmod_box_lfo_2_bend_osc_2_only |
80 | 92 MSB 0, LSB 92 |
0-1 |
MOD BOX LFO 2 DEST OSC 1mod_box_lfo_2_dest_osc_1 |
77 | 0-1 | |
MOD BOX LFO 2 DEST OSC 2mod_box_lfo_2_dest_osc_2 |
78 | 0-1 |
Filter envelope
| Control | CC | NRPN | Values |
|---|---|---|---|
FILTER ENV ATTACKfilter_env_attack |
39 | 60 MSB 0, LSB 60 |
0-255 |
FILTER ENV DECAYfilter_env_decay |
40 | 62 MSB 0, LSB 62 |
0-255 |
FILTER ENV SUSTAINfilter_env_sustain |
41 | 64 MSB 0, LSB 64 |
0-127 |
FILTER ENV RELEASEfilter_env_release |
42 | 66 MSB 0, LSB 66 |
0-255 |
FILTER ENV VELOCITY ON/OFFfilter_env_velocity_on_off |
43 | 68 MSB 0, LSB 68 |
0-1 |
Volume envelope
| Control | CC | NRPN | Values |
|---|---|---|---|
VOLUME ENV ATTACKvolume_env_attack |
45 | 61 MSB 0, LSB 61 |
0-255 |
VOLUME ENV DECAYvolume_env_decay |
46 | 63 MSB 0, LSB 63 |
0-255 |
VOLUME ENV SUSTAINvolume_env_sustain |
47 | 65 MSB 0, LSB 65 |
0-127 |
VOLUME ENV RELEASEvolume_env_release |
48 | 67 MSB 0, LSB 67 |
0-255 |
VOLUME ENV VELOCITY ON/OFFvolume_env_velocity_on_off |
49 | 69 MSB 0, LSB 69 |
0-1 |
Aftertouch
| Control | CC | NRPN | Values |
|---|---|---|---|
LFO PRESSURElfo_pressure |
61 | 71 MSB 0, LSB 71 |
0-1 |
Amplifier
| Control | CC | NRPN | Values |
|---|---|---|---|
PROGRAM VOLUMEprogram_volume |
8 | 73 MSB 0, LSB 73 |
0-127 |
MASTER VOLUMEmaster_volume |
7 | 0-127 |
Unison
| Control | CC | NRPN | Values |
|---|---|---|---|
UNISONunison |
70 | 74 MSB 0, LSB 74 |
0-1 |
UNISON VOICE COUNTunison_voice_count |
71 | 75 MSB 0, LSB 75 |
0-7 |
UNISON KEY MODEunison_key_mode |
72 | 76 MSB 0, LSB 76 |
0-5 |
Mod box
| Control | CC | NRPN | Values |
|---|---|---|---|
MOD BOX MODEmod_box_mode |
81 | 77 MSB 0, LSB 77 |
0-1 |
MOD BOX TRANSPOSE UP/ DOWNmod_box_transpose_up_down |
122 MSB 0, LSB 122 |
0-2 |
Mod box arpeggiator
| Control | CC | NRPN | Values |
|---|---|---|---|
MOD BOX ARP ONmod_box_arp_on |
84 | 80 MSB 0, LSB 80 |
0-1 |
MOD BOX ARP SPEEDmod_box_arp_speed |
85 | 81 MSB 0, LSB 81 |
0-127, or 0-27 by NRPN |
MOD BOX ARP HOLD KBDmod_box_arp_hold_kbd |
86 | 82 MSB 0, LSB 82 |
0-2 |
MOD BOX ARP DOWN/UPmod_box_arp_down_up |
87 | 83 MSB 0, LSB 83 |
0-3 |
MOD BOX ARP LOWERmod_box_arp_lower |
88 | 84 MSB 0, LSB 84 |
0-1 |
MOD BOX ARP UPPERmod_box_arp_upper |
89 | 85 MSB 0, LSB 85 |
0-1 |
ARP NUMBER OF TRANS POSE INTERVALSarp_number_of_trans_pose_intervals |
86 MSB 0, LSB 86 |
0-5 | |
ARP TRANS INTVAL NOTE 0arp_trans_intval_note_0 |
87 MSB 0, LSB 87 |
0-120 | |
ARP TRANS INTVAL NOTE 1arp_trans_intval_note_1 |
88 MSB 0, LSB 88 |
0-120 | |
ARP TRANS INTVAL NOTE 2arp_trans_intval_note_2 |
89 MSB 0, LSB 89 |
0-120 | |
ARP TRANS INTVAL NOTE 3arp_trans_intval_note_3 |
90 MSB 0, LSB 90 |
0-120 | |
ARP TRANS INTVAL NOTE 4arp_trans_intval_note_4 |
91 MSB 0, LSB 91 |
0-120 | |
ARP TRANSPOSEarp_transpose |
90 | 0-2 |
Page 2 pedal
| Control | CC | NRPN | Values |
|---|---|---|---|
PAGE 2 PEDAL RELEASEpage_2_pedal_release |
73 | 93 MSB 0, LSB 93 |
0-255 |
Page 2 chord
| Control | CC | NRPN | Values |
|---|---|---|---|
PAGE 2 CHORD KEY LIMITpage_2_chord_key_limit |
117 | 94 MSB 0, LSB 94 |
0-127, or 0-1207 by NRPN |
PAGE 2 CHORD HOLD MODEpage_2_chord_hold_mode |
118 | 95 MSB 0, LSB 95 |
0-1 |
Envelopes
| Control | CC | NRPN | Values |
|---|---|---|---|
ENV TYPEenv_type |
50 | 96 MSB 0, LSB 96 |
0-1, or 0-2 by NRPN |
Page 2 pan
| Control | CC | NRPN | Values |
|---|---|---|---|
PAGE 2 PAN MODEpage_2_pan_mode |
100 MSB 0, LSB 100 |
0-4 | |
PAGE 2 PANWIDTHpage_2_panwidth |
10 | 101 MSB 0, LSB 101 |
0-2 |
Program name
| Control | CC | NRPN | Values |
|---|---|---|---|
PROGRAM NAME CHAR 0program_name_char_0 |
102 MSB 0, LSB 102 |
0-87 | |
PROGRAM NAME CHAR 1program_name_char_1 |
103 MSB 0, LSB 103 |
0-87 | |
PROGRAM NAME CHAR 2program_name_char_2 |
104 MSB 0, LSB 104 |
0-87 | |
PROGRAM NAME CHAR 3program_name_char_3 |
105 MSB 0, LSB 105 |
0-87 | |
PROGRAM NAME CHAR 4program_name_char_4 |
106 MSB 0, LSB 106 |
0-87 | |
PROGRAM NAME CHAR 5program_name_char_5 |
107 MSB 0, LSB 107 |
0-87 | |
PROGRAM NAME CHAR 6program_name_char_6 |
108 MSB 0, LSB 108 |
0-87 | |
PROGRAM NAME CHAR 7program_name_char_7 |
109 MSB 0, LSB 109 |
0-87 | |
PROGRAM NAME CHAR 8program_name_char_8 |
110 MSB 0, LSB 110 |
0-87 | |
PROGRAM NAME CHAR 9program_name_char_9 |
111 MSB 0, LSB 111 |
0-87 | |
PROGRAM NAME CHAR 10program_name_char_10 |
112 MSB 0, LSB 112 |
0-87 | |
PROGRAM NAME CHAR 11program_name_char_11 |
113 MSB 0, LSB 113 |
0-87 | |
PROGRAM NAME CHAR 12program_name_char_12 |
114 MSB 0, LSB 114 |
0-87 | |
PROGRAM NAME CHAR 13program_name_char_13 |
115 MSB 0, LSB 115 |
0-87 | |
PROGRAM NAME CHAR 14program_name_char_14 |
116 MSB 0, LSB 116 |
0-87 | |
PROGRAM NAME CHAR 15program_name_char_15 |
117 MSB 0, LSB 117 |
0-87 | |
PROGRAM NAME CHAR 16program_name_char_16 |
118 MSB 0, LSB 118 |
0-87 | |
PROGRAM NAME CHAR 17program_name_char_17 |
119 MSB 0, LSB 119 |
0-87 | |
PROGRAM NAME CHAR 18program_name_char_18 |
120 MSB 0, LSB 120 |
0-87 | |
PROGRAM NAME CHAR 19program_name_char_19 |
121 MSB 0, LSB 121 |
0-87 |
Page 2 filter
| Control | CC | NRPN | Values |
|---|---|---|---|
PAGE 2 FILTER KBD TRACKpage_2_filter_kbd_track |
123 MSB 0, LSB 123 |
0-127 | |
PAGE 2 FILTER KBD ON LEVELpage_2_filter_kbd_on_level |
37 | 0-127 |
Split
| Control | CC | NRPN | Values |
|---|---|---|---|
SPLIT PARAMS UPPER LEVEL (UPPER/LOWER)split_params_upper_level_upper |
1122 MSB 8, LSB 98 |
0-63 | |
SPLIT PARAMS UPPER LEVEL (UPPER/LOWER)split_params_upper_level_lower |
1090 MSB 8, LSB 66 |
0-63 | |
SPLIT PARAMS SPLIT POINT (UPPER/LOWER)split_params_split_point_upper |
1123 MSB 8, LSB 99 |
0-127 | |
SPLIT PARAMS SPLIT POINT (UPPER/LOWER)split_params_split_point_lower |
1092 MSB 8, LSB 68 |
0-127 | |
SPLIT LOWER TRANSPOSEsplit_lower_transpose |
1093 MSB 8, LSB 69 |
0-72 | |
SPLIT UPPER TRANSPOSEsplit_upper_transpose |
1125 MSB 8, LSB 101 |
0-72 | |
SPLIT LOWER DETUNEsplit_lower_detune |
1094 MSB 8, LSB 70 |
0-64 | |
SPLIT PAN MODEsplit_pan_mode |
1076 MSB 8, LSB 52 |
0-4 | |
SPLIT PAN WIDTHsplit_pan_width |
1077 MSB 8, LSB 53 |
0-2 | |
SPLIT HOLD/CHORD SOURCEsplit_hold_chord_source |
1072 MSB 8, LSB 48 |
0-2 | |
SPLIT BOX MOD SOURCEsplit_box_mod_source |
1061 MSB 8, LSB 37 |
0-2 | |
SPLIT ARP SOURCEsplit_arp_source |
1047 MSB 8, LSB 23 |
0-2 | |
LOWER/UPPER/NO SELECTlower_upper_no_select |
95 | 0-2 | |
NORMAL/SPLIT/DOUBLE MODEnormal_split_double_mode |
119 | 0-2 |
Program selection
| Control | CC | NRPN | Values |
|---|---|---|---|
BANK SELECT MSBbank_select_msb |
0 | 0-127 | |
BANK SELECT LSBbank_select_lsb |
32 | 0-127 |
Keyboard
| Control | CC | NRPN | Values |
|---|---|---|---|
TRANSPOSE UP/DOWNtranspose_up_down |
9 | 0-2 | |
EXPRESION PEDALexpresion_pedal |
11 | 0-127 | |
SUSTAINsustain |
64 | 0-1 |
Where these facts come from
Source documents
- OB-X8 User's Guide, Version 1.2, dated May 2023, its user manual, read on 4 October 2026 (the file read).
- Oberheim OB-X8 OS 2.0 New Features Addendum, dated 28 June 2024, its firmware addendum, read on 4 October 2026 (the file read).
- OB-X8 analog synthesizer - Oberheim, its product page, read on 4 October 2026.
How they were read
OB-X8 User's Guide, printed "Version 1.2, May, 2023" and served as OB-X8-Manual-V2_2.pdf, 137 sheets: the MIDI implementation is sheets 122 to 137 - the globals that govern MIDI response on p. 122, the received and transmitted channel and controller messages on pp. 123-124, the control change table on pp. 125-128, how an NRPN travels on pp. 129-130, the NRPN table on pp. 131-133, and system exclusive on pp. 134-137. The OS 2.0 Addendum (8 sheets) supplies everything about split channels, MPE and the arpeggiator's clock. The product page is cited for which documents the maker offers, for the two bodies sharing one page, and for the newest OS it names.
PAGES ARE CITED AS FILE PAGES, BECAUSE THE PRINTED NUMBERING IS BROKEN. Sheets 1 to 7 print no number; 8 and 9 print "viii" and "ix", and i to vii are never printed at all; sheets 10 to 120 print 1 to 111; and then two different sheets both print 112 - sheet 121, the last page of Appendix E, and sheet 122, the first page of the MIDI implementation - after which 123 to 137 print 113 to 127. So the offset would be +9 for one run and +10 for the other and undefined for 112 itself. Both readers read the folio off all 137 sheets independently and agree on every range. The addendum prints no page number on any sheet.
THE MAKER STATES A LIMIT AND THEN BREAKS IT TEN TIMES, which is the one thing most likely to be got wrong here. "NRPNs are the preferred method of parameter transmission, since they cover the complete range of all parameters, while CCs are limited to a range of 128" (manual p. 122) - and its own control change table prints a range wider than 128 on ten rows: CC 1 and CC 73 and the six envelope times at 0-255, CC 33 at "00-175" and CC 74 at 0-175. Those are the parameter's range printed in a control change column, not the message's. range below carries the figure exactly as printed and nothing is scaled, because no page says how a value that wide is scaled into seven bits, and a 127 that no document prints would be this file's invention rather than the maker's statement. Where the parameter also has an NRPN, that is the way to reach the top of it, which is the maker's own advice.
SIX RANGES DISAGREE BETWEEN THE TWO TABLES, and nrpn_range carries the NRPN table's. Both readers found the same six and no others, out of 91 parameters this file pairs. One is not a real disagreement: Filter Frequency is "00-175" by control change against 0-175 by NRPN, which is a leading zero. Three are unreadable as anything but a mistyping of 0-127 - Page 2 LFO 1 Mod 2 Ramp Up and Mod Box Arp Speed are 0-27 by NRPN, where Mod 2's own twin is 0-127 in both tables, and Page 2 Chord Key Limit is "0-1207". Two are genuinely two-sided. Env Type is 0-1 by control change and 0-2 by NRPN, and the prose supports the control change: Page 2's Envelope Type sets the envelopes "to either OB-X/Xa or OB-8 contours" (manual p. 61), which is two states. Mod Box LFO 2 Bend Amount is 0-255 by control change and 0-12 by NRPN, twenty-one times apart, and here the prose supports the NRPN: the Bend Lever Amount runs "from ¼ to 12 semitones" (manual p. 67). Both figures are published in both cases and neither is resolved.
TWO NRPN ADDRESSES ARE NOT PUBLISHED AT ALL, which is the strongest thing in this file. The NRPN table prints MOD BOX LFO 2 DEST OSC 2 twice, at 56 and at 57, with one range. The two tables list that block in the same order - control change 75 Rate, 76 Shape, 77 Dest Osc 1, 78 Dest Osc 2, 79 Depth against NRPN 54, 55, 56, 57, 58 - so 56 sits exactly where the control change table has Dest Osc 1, and the reading that explains the document is that 56's printed name is wrong. That reading is not written into this file, because correcting a maker's printed name is not this project's to do. Nor is either address attached to a control: pairing CC 78 with whichever of the two comes first would be arbitrary, and publishing both as controls would invent a parameter the instrument has not. So the two control changes publish without an NRPN, and 56 and 57 publish not at all. Both readers reached this independently.
THREE PARAMETERS ARE DELIBERATELY NOT PAIRED, and the two readers disagree about one of them. NRPN 122 MOD BOX TRANSPOSE UP/ DOWN could be control change 9 TRANSPOSE UP/DOWN or control change 90 ARP TRANSPOSE: all three are 0-2, the arpeggiator lives in the Mod Box, and both control changes are otherwise unpaired. The second reader paired it with 90 and this file pairs it with neither, which is a disagreement recorded rather than resolved. The other two are NRPN 25 FILTER KBD TRACK against control change 36 FILTER KEYBOARD, and NRPN 123 PAGE 2 FILTER KBD TRACK against control change 37 PAGE 2 FILTER KBD ON LEVEL: plausible both times, and keyboard track and on level are not the same words.
CONTROL CHANGE 12 IS PRINTED TWICE, for OSC 1 XMOD and for OSC 1 FILTER ENV MOD. The NRPN table gives those 9 and 12, so the second row's "12" is very likely its NRPN number repeated into the control change column. Both ship at control change 12 as printed, which is the rule this corpus follows for a number a maker prints and nothing corrects.
SIXTEEN CONTROL CHANGES ARE NOT PUBLISHED AS CONTROLS, which follows oberheim/teo_5 exactly: 6 and 38 Data Entry, 96 and 97 Data Increment and Decrement - whose printed "ranges" are "+1" and "-1" - 98 to 101 NRPN and RPN, and 120 to 127, which are channel mode messages the validator refuses. 0 and 32 Bank Select do publish, as they do for the sibling.
THE DOCUMENT GIVES SIX ACCOUNTS OF HOW MANY PROGRAMS THERE ARE AND NO TWO AGREE, so presets is not recorded. "The OB-X8 contains 768 user-programmable presets... organized into six Banks, each of which contain 128 preset locations (organized as 16 Groups of 8 Programs)" (manual p. 15); a global transmits "the entire 640 program sound set" (manual p. 27); bank select is "1 - 5 select user banks 1 - 5; 6 - 9 select factory banks 1 - 4" (manual p. 123), which is nine banks against six, while the transmitted table gives "Bank Select: 1 - 5" (manual p. 124); the program dump request takes a "Bank Number, 0 - 7" (manual p. 135) and the program data dump a "Group Number: 0 - 9" (manual p. 136) with "Program Number: 0 - 39" (manual p. 136); and the program change row announces "0-39" and then enumerates 0 to 127 across sixteen groups (manual p. 123). Six statements of one number. receives and sends are recorded because every account agrees that program change travels both ways.
WHAT IS ABSENT, CHECKED RATHER THAN ASSUMED. There is no MIDI implementation chart - the conventional grid - in either document, so mode is not recorded: the control change table lists Omni and Mono and Poly Mode messages as received, and no page gives a default mode. Neither document states a note range for the sound engine beyond "Note number 0-127" (manual p. 123) in the message tables, so note_range is not recorded. And neither message table is a complete statement of what is received: control changes 2 and 4 are absent from the control change table and present in the message tables, while a global says the synth responds to "Pitch Wheel, Mod Wheel, Pedal, Breath, Volume, and Expression" (manual p. 26).
FOUR THINGS THAT LOOK LIKE MISPRINTS AND ARE NOT, established from the prose by the second reader, and recorded here so nobody "fixes" them. Portamento Mode's 0-66 is right: Page 2 lists three non-bend modes and a Bend Up mode whose range "is displayed as -12.0... to +19.5, in 0.5 semitone increments", which is 64 bend steps plus three modes, 67 values. Osc Freq's 0-63 is right: "5-octave+minor third range (0-+63 semitones.)" (manual p. 30). Program Name Char's 0-87 is right, 88 printable characters, and consistent across all twenty rows. Arp Transpose Interval's 0-120 against a count of 0-5 is right, five keys pressed.
THE MAKER'S CAPITALS ARE THE LABELS, as they are for roland/tr_6s, whose document is also entirely in capitals - where oberheim/teo_5 keeps title case because its own document prints title case. The printed typos are kept in the labels and not in the field names: 0SC 2 FREQ for control change 16, EXPRESION PEDAL for 11, PAGE 2 PANWIDTH for 10 against the NRPN table's PAGE 2 PAN WIDTH, MOD BOX LFO2 for 1 against MOD BOX LFO 2 everywhere else.
NOT RECORDED: values, bands and defaults for any control. The two tables give a range and nothing else, and the guide's Page 2 chapter names the states some parameters step through under menu numbers that the addendum shows are not stable - it addresses "Global 3. MIDI Channel" where the guide's third global is Local Control, and "Page 2 23. LFO Volume Dest" where the guide's twenty-third is Vibrato LFO Wave. Those numbers also have to differ between the keyboard and the Module, because one has a global the other has not. So no state is taken from a menu position.
WHAT THIS FILE DOES NOT CARRY, and a reader implementing system exclusive needs to know: the document gives this instrument two different SysEx IDs. The device inquiry reply says "OB-X8 ID (Family LS)" (manual p. 134) against 0011 0011, which is 0x33, and every one of the seven other SysEx messages says "OB-X8 ID" against 0011 0001, which is 0x31. One is wrong and no page tells which. The dump sizes do not agree either - 599 bytes for a program dump against 597 for an edit buffer dump of the same data, and "The 128 'packed' parameter bytes in the program dump follow the order of the NRPN list" (manual p. 137) - and a "Save Edit Buffer" (manual p. 136) table is byte-for-byte the "Request Program Dump" (manual p. 135) table above it, command byte and description included. sysex: true records that the instrument has system exclusive, which is not in doubt; the messages themselves are beyond what this format holds.