Behringer UB-Xa
Voicing
- Voices
- 16
- Polyphony
- 16
- Multitimbral
- bi-timbral (Split/Double)
- Unison
- yes
- Portamento
- yes
- Mono legato
- yes
Oscillators
- Oscillators
- 2
- Noise source
- yes
- OSC 1
- analog-vco · sawtooth/pulse/triangle · PWM
- OSC 2
- analog-vco · sawtooth/pulse/triangle · PWM · sync
Cross-modulation
- Hard sync
- yes
- Osc FM / X-mod
- no
- Ring mod
- no
Filters
- Filter 1
- lowpass · 2-pole/4-pole · resonance · self-osc
- Routing
- single
Envelopes
- Count
- 2
- Stages
- ADSR
- Assignments
- filter, amp
LFO
- Count
- 2
- Waveforms
- sine, triangle, square, sawtooth, ramp, noise, sample-hold
- Destinations
- osc1-freq, osc2-freq, filter, pwm, amp
- Tempo sync
- yes
Modulation
- Mod matrix
- yes
- Matrix size
- 8
- Patchbay
- no
Performance & I/O
- Velocity
- yes
- Aftertouch
- yes
- Mod wheel
- yes
- Pitch bend
- yes
- Onboard FX
- —
- Audio out
- stereo
- MIDI
- yes
- USB
- yes
- CV / gate
- no
Notes
Signal flow rendered server-side as inline SVG from capability.json: no WPF, no client JavaScript.
Provenance
- Confidence
- high
- Last verified
- 2026-05-26
- Manual
- manuals/synths--behringer-ubxa-d-manual.pdf
- Pages
- 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 19, 20, 21
- Via
- council.py run transactions/2026-05-24T04-29-46Z-studio-ub-xa template capability-extract@v2 (SM16); SM25 capability-v1->v2 migration (filters[] + cross_mod); SM34 (2026-05-26) STRUCTURAL migration capability-v3->v4 (control_style=mixed + morphology_overrides[]=[]); SM36 council re-extraction with panel-image SSOT (2026-05-26): CC/Opus + Codex CLI + Gemini browser 3-seat council, panel images at manuals/synths--<id>-panel.jpg (SM35-landed) -- panel-grounded re-extraction.
Council-VERIFIED (supersedes the SM14 hand-authored draft). Confirmed SM14 corrections (voices 16, lfo.count 2, self_oscillation true, fx_onboard []). New council corrections: oscillators.waveforms +triangle; modulation.mod_matrix _verify->true; io.cv_gate _verify->false; voicing.polyphony 8->16; lfo.waveforms _verify->resolved set; cross_mod.x_mod true->false (manual-literal). Contested+resolved: filter.count (manual 'two switchable LPF' -> 1). See report/contested.md. SM25 (2026-05-25): STRUCTURAL migration capability-v1->v2 (filter->filters[] + filter_routing:single + drive; oscillators->per[] with engine_type; cross_mod{x_mod,fm}->{hard_sync:true,osc_fm:false,ring_mod:false}; modulation +mod_matrix_size:'8' +patchbay:false; provenance +fields{}). No facts re-read -- manual-grounded values preserved from the 2026-05-24 verification (last_verified unchanged); lfo.waveforms 'smp'->'sample-hold' enum-normalized. SM34 (2026-05-26): STRUCTURAL migration capability-v3->v4 (top-level control_style='mixed', morphology_overrides[] of length 0). Morphology grounded in real-hardware knowledge + the SM34 brief's per-synth assignment (panel-image backfill at manuals/synths--*-panel.jpg is a separate follow-on node). SM36 (2026-05-26): 2-of-3 council seats (CC/Opus + Gemini, both panel-grounded) DISAGREED with SM34's control_style=mixed and CONVERGED on dial-led. The panel image (manual p1) shows EVERY continuous control on the UB-Xa panel as a rotary knob -- MANUAL/CONTROL/PERF-LFO sections (VOLUME, BALANCE, MASTER TUNE, PORTAMENTO, UNISON, OSC 2 DETUNE, RATE, WAVEFORM, DEPTH), OSCILLATORS 1/2 (FREQUENCY, PULSE WIDTH, VOICE DETUNE), FILTER (FREQUENCY, RESONANCE, MODULATION, NOISE), both ENVELOPES (Filter + Loudness: ATTACK, DECAY, SUSTAIN, RELEASE), MODULATION (LFO RATE, OSC1/2 mod depths, FREQ/FILTER/VOLUME/DEPTH1/DEPTH2/PERF LFO PHASE) -- all dials. The many BUTTONS (SAW/PULSE waveform, OSC1/HALF/OSC2/FULL/4-POLE/TRACK switches, MOD-DELAY/MOD-ATTACK/TRIG-POINT, etc.) are STRUCTURAL toggles, not morphological -- they collapse to Toggle in the renderer, not knob/slider. Codex outlier suggested control_style=mixed + 11 overrides {VCF.key_track=slider + ENVfilter/ENVamp ADSR=knob}; NOT ADOPTED -- the codex sandbox blocked file/image access (run-log captured the policy rejections), so codex's 'rectangular slider/switch' reading was speculative not panel-grounded. CRITICAL FIX: under SM34's mixed, the renderer would draw the UB-Xa's ADSR envelopes as faders (ControlDetails default ENV.attack/decay/sustain/release=Slider under mixed dispatch) -- the actual panel has KNOB envelopes; dial-led + [] resolves this rendering bug. provenance.fields.control_style value flipped mixed -> dial-led; conf STAYS medium per SM36 brief (council DISAGREES with SM34's call, divergence recorded here).
Raw capability.json
{
"schema_version": "capability-v4",
"id": "ub-xa",
"name": "Behringer UB-Xa",
"maker": "Behringer",
"clone_of": "Oberheim OB-Xa",
"type": "analog",
"voices": 16,
"voices_note": "16-voice bi-timbral (manual p5 feature list; p4 'two analog oscillators per voice'). Split mode halves to 8 voices/timbre (p6). Confirms SM14's 8->16 correction across two manual-grounded seats.",
"multitimbral": "bi-timbral (Split/Double)",
"control_style": "dial-led",
"device_class": "synth",
"voicing": {
"polyphony": 16,
"polyphony_note": "Max 16 voices (single/non-split); Split halves to 8/side (p5/p6). Council correction of the hand-draft's 8 (the per-timbre figure) -- polyphony is the max, consistent with voices=16.",
"unison": true,
"unison_detune_spread": true,
"portamento": true,
"mono_legato": true
},
"oscillators": {
"count": 2,
"noise": true,
"note": "Two identical analog VCOs (manual p4 'two analog oscillators per voice'). Saw + Pulse buttons per VCO; selecting NEITHER yields Triangle (osc section p8) -- 'triangle' was a council ADD over the hand-draft, both seats found it. per[].sync encodes hard-sync ROLE: Sync resets osc2 to osc1 (p8), so osc1=master(sync:false)/osc2=slave(sync:true); the synth-level hard-sync capability is cross_mod.hard_sync=true (migrated from the v1 oscillators.sync flag).",
"per": [
{
"engine_type": "analog-vco",
"waveforms": [
"sawtooth",
"pulse",
"triangle"
],
"wave_selection": "mixable",
"pwm": true,
"sub": false,
"sync": false,
"octave_select": true,
"octave_positions": 4,
"detune": true
},
{
"engine_type": "analog-vco",
"waveforms": [
"sawtooth",
"pulse",
"triangle"
],
"wave_selection": "mixable",
"pwm": true,
"sub": false,
"sync": true,
"octave_select": true,
"octave_positions": 4,
"detune": true
}
]
},
"cross_mod": {
"hard_sync": true,
"osc_fm": false,
"ring_mod": false,
"note": "hard_sync=true: manual shows Sync (osc2 resets to osc1, p8) -- migrated from the v1 oscillators.sync flag. osc_fm=false: the manual shows Filter-Env->OSC2 pitch (F-Env) but NO dedicated oscillator cross-mod/X-Mod control (codex, p8); Opus inferred x_mod=true from the F-Env->OSC2 path, the manual-literal reading wins (the hand-draft's x_mod=true was OB-Xa-reputation-based). ring_mod=false: no ring modulator on the panel (v2-added field, manual-confirmed none)."
},
"filters": [
{
"type": "lowpass",
"slopes": [
"2-pole",
"4-pole"
],
"slope_switchable": true,
"resonance": true,
"self_oscillation": true,
"key_tracking": true,
"drive": false
}
],
"filters_note": "ONE filter per voice (filters[] has a single entry). CONTESTED in v1: the manual says 'two switchable Low Pass Filters' (p9) -- codex read count=2. Resolved to a single filter with a switchable 2-pole/4-pole slope (you SWITCH, not stack), captured by slopes[] + slope_switchable; two entries would double-encode the slope switch and mislead the advice council. drive=false: no dedicated filter drive/saturation control on the panel (p9; v2-added field).",
"filter_routing": "single",
"envelopes": {
"count": 2,
"assignments": [
"filter",
"amp"
],
"stages": "ADSR"
},
"lfo": {
"count": 2,
"count_note": "Two multi-waveform modulation LFOs (p5). A separate Performance LFO (Rate 0.06-50 Hz, p7) also exists -- arguably a 3rd LFO source; count=2 follows the headline spec.",
"waveforms": [
"sine",
"triangle",
"square",
"sawtooth",
"ramp",
"noise",
"sample-hold"
],
"waveforms_note": "Union across both LFOs (council reconciliation): modulation LFO = sine/sawtooth/square/ramp/S&H (ctrl 40, p8); Performance LFO = triangle/square/sawtooth/noise/... (p7). Resolves the hand-draft's '_verify'. SM25 migration: the v1 token 'smp' was normalized into 'sample-hold' (same Sample&Hold shape under a different panel abbreviation) and de-duped to keep the list within the locked waveform enum; re-confirm in SM26's re-extraction.",
"destinations": [
"osc1-freq",
"osc2-freq",
"filter",
"pwm",
"amp"
],
"sync": true
},
"modulation": {
"mod_matrix": true,
"mod_matrix_size": "8",
"mod_matrix_note": "CONFIRMED true (both seats): each patch carries modulation matrices with assignable sources/destinations (codex: 'eight modulation matrices', p14; firmware notes add VCO/VCF drift sources+destinations). Resolves the hand-draft's '_verify'. mod_matrix_size='8' is the codex 'eight modulation matrices' count (p14); the exact source x destination dimensions are _verify pending the SM26 re-read.",
"patchbay": false,
"vibrato_lever": true
},
"performance": {
"velocity": true,
"aftertouch": true,
"mod_wheel": true,
"pitch_bend": true
},
"performance_note": "mod_wheel is physically a modulation LEVER (OB-X heritage, ctrl 74), functionally a mod wheel; pitch via the pitchbend lever (20/21).",
"fx_onboard": [],
"fx_onboard_note": "VERIFIED NONE (both seats): no onboard chorus/delay/reverb. 'Xa Chorus' is preset patch #14's NAME (p21); 'Mod 1/2 Delay' are modulation-onset delays, not a delay effect. Route FX externally. Re-confirms the SM13/SM14 + terminator-brass finding. Rig policy (route choice) lives in rig.json (fx_policy.mode=outboard).",
"io": {
"audio_out": "stereo",
"audio_out_note": "Balanced Left (89) / Right (91) TRS + Mono sum (90) + Phones (92), rear panel p19-20.",
"midi": true,
"usb": true,
"cv_gate": false,
"cv_gate_note": "CONFIRMED false (both seats): rear panel (80-92) has USB, MIDI In/Out/Thru DIN, pedal/footswitch inputs, and audio outs -- NO CV/Gate jacks. MIDI/USB only. Resolves the hand-draft's '_verify'."
},
"morphology_overrides": [],
"provenance": {
"manual_path": "manuals/synths--behringer-ubxa-d-manual.pdf",
"confidence": "high",
"last_verified": "2026-05-26",
"manual_pages": [
4,
5,
6,
7,
8,
9,
10,
11,
12,
14,
16,
19,
20,
21
],
"verify_via": "council.py run transactions/2026-05-24T04-29-46Z-studio-ub-xa template capability-extract@v2 (SM16); SM25 capability-v1->v2 migration (filters[] + cross_mod); SM34 (2026-05-26) STRUCTURAL migration capability-v3->v4 (control_style=mixed + morphology_overrides[]=[]); SM36 council re-extraction with panel-image SSOT (2026-05-26): CC/Opus + Codex CLI + Gemini browser 3-seat council, panel images at manuals/synths--<id>-panel.jpg (SM35-landed) -- panel-grounded re-extraction.",
"verify_note": "Council-VERIFIED (supersedes the SM14 hand-authored draft). Confirmed SM14 corrections (voices 16, lfo.count 2, self_oscillation true, fx_onboard []). New council corrections: oscillators.waveforms +triangle; modulation.mod_matrix _verify->true; io.cv_gate _verify->false; voicing.polyphony 8->16; lfo.waveforms _verify->resolved set; cross_mod.x_mod true->false (manual-literal). Contested+resolved: filter.count (manual 'two switchable LPF' -> 1). See report/contested.md. SM25 (2026-05-25): STRUCTURAL migration capability-v1->v2 (filter->filters[] + filter_routing:single + drive; oscillators->per[] with engine_type; cross_mod{x_mod,fm}->{hard_sync:true,osc_fm:false,ring_mod:false}; modulation +mod_matrix_size:'8' +patchbay:false; provenance +fields{}). No facts re-read -- manual-grounded values preserved from the 2026-05-24 verification (last_verified unchanged); lfo.waveforms 'smp'->'sample-hold' enum-normalized. SM34 (2026-05-26): STRUCTURAL migration capability-v3->v4 (top-level control_style='mixed', morphology_overrides[] of length 0). Morphology grounded in real-hardware knowledge + the SM34 brief's per-synth assignment (panel-image backfill at manuals/synths--*-panel.jpg is a separate follow-on node). SM36 (2026-05-26): 2-of-3 council seats (CC/Opus + Gemini, both panel-grounded) DISAGREED with SM34's control_style=mixed and CONVERGED on dial-led. The panel image (manual p1) shows EVERY continuous control on the UB-Xa panel as a rotary knob -- MANUAL/CONTROL/PERF-LFO sections (VOLUME, BALANCE, MASTER TUNE, PORTAMENTO, UNISON, OSC 2 DETUNE, RATE, WAVEFORM, DEPTH), OSCILLATORS 1/2 (FREQUENCY, PULSE WIDTH, VOICE DETUNE), FILTER (FREQUENCY, RESONANCE, MODULATION, NOISE), both ENVELOPES (Filter + Loudness: ATTACK, DECAY, SUSTAIN, RELEASE), MODULATION (LFO RATE, OSC1/2 mod depths, FREQ/FILTER/VOLUME/DEPTH1/DEPTH2/PERF LFO PHASE) -- all dials. The many BUTTONS (SAW/PULSE waveform, OSC1/HALF/OSC2/FULL/4-POLE/TRACK switches, MOD-DELAY/MOD-ATTACK/TRIG-POINT, etc.) are STRUCTURAL toggles, not morphological -- they collapse to Toggle in the renderer, not knob/slider. Codex outlier suggested control_style=mixed + 11 overrides {VCF.key_track=slider + ENVfilter/ENVamp ADSR=knob}; NOT ADOPTED -- the codex sandbox blocked file/image access (run-log captured the policy rejections), so codex's 'rectangular slider/switch' reading was speculative not panel-grounded. CRITICAL FIX: under SM34's mixed, the renderer would draw the UB-Xa's ADSR envelopes as faders (ControlDetails default ENV.attack/decay/sustain/release=Slider under mixed dispatch) -- the actual panel has KNOB envelopes; dial-led + [] resolves this rendering bug. provenance.fields.control_style value flipped mixed -> dial-led; conf STAYS medium per SM36 brief (council DISAGREES with SM34's call, divergence recorded here).",
"fields": {
"voices": {
"conf": "high",
"pg": 5
},
"voicing.polyphony": {
"conf": "high",
"pg": 5
},
"oscillators.count": {
"conf": "high",
"pg": 8
},
"oscillators.per.0.waveforms": {
"conf": "high",
"pg": 8
},
"oscillators.per.1.sync": {
"conf": "high",
"pg": 8
},
"oscillators.noise": {
"conf": "high",
"pg": 8
},
"cross_mod.hard_sync": {
"conf": "high",
"pg": 8
},
"cross_mod.osc_fm": {
"conf": "high",
"pg": 8
},
"cross_mod.ring_mod": {
"conf": "medium",
"pg": null
},
"filters.0.type": {
"conf": "high",
"pg": 9
},
"filters.0.slopes": {
"conf": "high",
"pg": 9
},
"filters.0.self_oscillation": {
"conf": "high",
"pg": 9
},
"filters.0.drive": {
"conf": "medium",
"pg": 9
},
"filter_routing": {
"conf": "high",
"pg": 9
},
"envelopes.count": {
"conf": "high",
"pg": null
},
"lfo.count": {
"conf": "high",
"pg": 5
},
"lfo.waveforms": {
"conf": "medium",
"pg": 8
},
"modulation.mod_matrix": {
"conf": "high",
"pg": 14
},
"modulation.mod_matrix_size": {
"conf": "low",
"pg": 14
},
"modulation.patchbay": {
"conf": "high",
"pg": 19
},
"fx_onboard": {
"conf": "high",
"pg": 21
},
"io.cv_gate": {
"conf": "high",
"pg": 20
},
"control_style": {
"conf": "medium",
"pg": 1
}
}
}
}