It's Digital

Behringer UB-Xa

Behringer · clone of Oberheim OB-Xa
INOSC ×2sawtooth pulse triangleNOISEMIXERFILTERlowpass 2-pole/4-poleVCAOUTLFO ×2ENV ×2MOD MATRIX 8modulation sources

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
Synthesizersanalogcapability-v4fx: outboard

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
      }
    }
  }
}