jdxi_editor.ui.editors.digital.editor

Digital Synth Editor for the Roland JD-Xi.

This module provides the UI components for editing digital synth parameters on the Roland JD-Xi. The editor supports three partials (voices) with individual parameter control and common parameters that affect all partials.

Classes:
DigitalSynthEditor: Main editor class for digital synth parameters
  • Handles MIDI communication for parameter changes

  • Manages UI state for all digital synth controls

  • Provides preset loading and management

  • Supports real-time parameter updates via SysEx

Features:
  • Three independent partial editors

  • Common parameter controls (portamento, unison, legato, etc.)

  • Preset management and loading

  • Real-time MIDI parameter updates

  • ADSR envelope controls for both amplitude and filter

  • Oscillator waveform selection

  • Partial enabling/disabling and selection

Dependencies:
  • PySide6 for UI components

  • qtawesome for icons

  • Custom MIDI handling classes

  • Digital synth parameter definitions

Classes

DigitalSynthEditor

class for Digital Synth Editor containing 3 partials

DigitalSynth2Editor

class for Digital Synth Editor containing 3 partials

Module Contents

class jdxi_editor.ui.editors.digital.editor.DigitalSynthEditor(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper | None = None, preset_helper: jdxi_editor.ui.preset.helper.JDXiPresetHelper = None, synth_number: int = 1, parent: jdxi_editor.ui.windows.jdxi.instrument.JDXiInstrument = None)[source]

Bases: jdxi_editor.ui.editors.base.editor.BaseSynthEditor

class for Digital Synth Editor containing 3 partials

preset_changed[source]
FILTER_MODE_MAP[source]
main_layout = None[source]
instrument_image_group: PySide6.QtWidgets.QGroupBox | None = None[source]
instrument_title_label: PySide6.QtWidgets.QLabel | None = None[source]
partial_number = None[source]
current_data = None[source]
preset_helper = None[source]
main_window = None[source]
synth_number = 1[source]
adsr_parameters[source]
pitch_env_parameters[source]
pwm_parameters[source]
_partial_param_control_map: Dict[int, Dict[str, jdxi_editor.ui.common.QWidget]][source]
refresh_shortcut[source]
setup_ui()[source]

set up user interface

set_style()[source]

Set style

set_dimensions()[source]

Set dimensions

build_widgets()[source]

Build Widgets before running setup ui

_setup_tabs(container_layout: Any, midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper) None[source]

Create the partial tab widget for the digital synth editor.

Parameters:
  • container_layout – QVBoxLayout for the main container

  • midi_helper – MidiIOHelper instance for MIDI communication

Returns:

None

_on_partial_state_changed(partial: jdxi_editor.midi.data.digital.DigitalPartial, enabled: bool, selected: bool) None[source]

Handle the state change of a partial (enabled/disabled and selected/unselected).

Parameters:
  • partial – DigitalPartial The partial to modify

  • enabled – bool Whether the partial is enabled (ON/OFF)

  • selected – Whether the partial is selected

Returns:

None

set_partial_state(partial: jdxi_editor.midi.data.digital.DigitalPartial, enabled: bool = True, selected: bool = True) bool | None[source]

Set the state of a partial (enabled/disabled and selected/unselected).

Parameters:
  • partial – The partial to modify (DigitalPartial enum)

  • enabled – Whether the partial is enabled (ON/OFF)

  • selected – Whether the partial is selected

Returns:

True if successful, False otherwise

_initialize_partial_states()[source]

Initialize partial states with defaults Default: Partial 1 enabled and selected, others disabled

_handle_special_params(partial_no: int, param: picomidi.sysex.parameter.address.AddressParameter, value: int) None[source]

Handle special parameters that require additional UI updates.

Parameters:
  • partial_no – int

  • param – AddressParameter

  • value – int

Returns:

None

_update_controls(partial_no: int, sysex_data: dict, successes: list, failures: list) None[source]

Apply updates to the UI components based on the received SysEx data. @@@

Parameters:
  • partial_no – int

  • sysex_data – dict

  • successes – list

  • failures – list

Returns:

None

_update_filter_state(partial_no: int, value: int) None[source]

Update the filter state of a partial based on the given value.

Parameters:
  • partial_no – int

  • value – int

Returns:

None

_update_partial_control(partial_no: int, param: jdxi_editor.midi.data.parameter.digital.DigitalPartialParam, midi_value: int, bindings: dict, successes: list, failures: list)[source]
_update_common_controls(partial_number: int, sysex_data: Dict, successes: list = None, failures: list = None) None[source]

Update the UI components for tone common and modify parameters.

Parameters:
  • partial_number – int partial number

  • sysex_data – Dictionary containing SysEx data

  • successes – List of successful parameters

  • failures – List of failed parameters

Returns:

None

_update_modify_controls(partial_number: int, sysex_data: dict, successes: list = None, failures: list = None) None[source]

Update the UI components for tone common and modify parameters.

Parameters:
  • partial_number – int partial number

  • sysex_data – dict Dictionary containing SysEx data

  • successes – list List of successful parameters

  • failures – list List of failed parameters

Returns:

None

_update_partial_adsr_widgets_new(partial_no: int, param: jdxi_editor.midi.data.parameter.digital.DigitalPartialParam, midi_value: int, successes: list = None, failures: list = None)[source]
_update_partial_pitch_env_widgets_new(partial_no: int, param: jdxi_editor.midi.data.parameter.digital.DigitalPartialParam, midi_value: int, successes: list = None, failures: list = None)[source]
_update_pulse_width_widgets_new(partial_no: int, param: jdxi_editor.midi.data.parameter.digital.DigitalPartialParam, midi_value: int, successes: list = None, failures: list = None)[source]
_update_partial_adsr_widgets(partial_no: int, param: jdxi_editor.midi.data.parameter.digital.DigitalPartialParam, midi_value: int, successes: list = None, failures: list = None)[source]

Update the ADSR widget for a specific partial based on the parameter and value.

Parameters:
  • partial_no – int Partial number

  • param – AddressParameter address

  • midi_value – int value

Returns:

None

_update_partial_pitch_env_widgets(partial_no: int, param: jdxi_editor.midi.data.parameter.digital.DigitalPartialParam, midi_value: int, successes: list = None, failures: list = None)[source]

Update the Pitch Env widget for a specific partial based on the parameter and value.

Parameters:
  • partial_no – int Partial number

  • param – AddressParameter address

  • midi_value – int value

  • successes – list = None,

  • failures – list = None,

Returns:

None

_update_pulse_width_widgets(partial_no: int, param: jdxi_editor.midi.data.parameter.digital.DigitalPartialParam, midi_value: int, successes: list = None, failures: list = None)[source]

Update the Pitch Env widget for a specific partial based on the parameter and value.

Parameters:
  • partial_no – int Partial number

  • param – AddressParameter address

  • midi_value – int value

  • successes – list = None,

  • failures – list = None,

Returns:

None

_get_partial_param_control_map(partial_no: int) Dict[str, jdxi_editor.ui.common.QWidget][source]

Build param name -> widget map for this partial (same pattern as adsr_map / pitch_env_map). All section widgets are stored in the partial’s controls dict.

_update_partial_slider_digital(partial_no: int, param: jdxi_editor.midi.data.parameter.digital.DigitalPartialParam, value: int, successes: list = None, failures: list = None) None[source]

Update a partial’s slider/control from SysEx. Uses the same param object as the sections (Digital.Param.<name>) so pe.controls.get(param) resolves the widget by key.

pe.controls (partial_editor.controls) is the panel’s shared dict, keyed by Digital.Param (DigitalPartialParam) class attributes. Sections (oscillator, filter, amp, LFO, mod LFO) add entries when they build widgets, e.g.: - Oscillator: OSC_WAVEFORM, OSC_WAVE_VARIATION, OSC_PITCH, OSC_DETUNE, … - Filter: FILTER_CUTOFF, FILTER_SLOPE, FILTER_RESONANCE, FILTER_* from

FilterWidget and from SLIDER_GROUPS[“filter”] sliders.

  • Amp, LFO, Mod LFO: their respective params.

Param must be the same object as the key (use getattr(Digital.Param, name)).

_update_partial_selection_switch(param: picomidi.sysex.parameter.address.AddressParameter, value: int, successes: list, failures: list) None[source]

Update the partial selection switches based on parameter and value.

Parameters:
  • param – AddressParameter

  • value – int

  • successes – list

  • failures – list

Returns:

None

_update_partial_selected_state(param: picomidi.sysex.parameter.address.AddressParameter, value: int, successes: list, failures: list) None[source]

Update the partial selected state based on parameter and value.

Parameters:
  • param – AddressParameter

  • value – int

  • successes – list

  • failures – list

  • debug – bool

Returns:

None

_update_waveform_buttons(partial_number: int, value: int)[source]

Update the waveform buttons based on the OSC_WAVE value with visual feedback

Parameters:
  • partial_number – int

  • value – int

Returns:

_update_filter_mode_buttons(partial_number: int, value: int)[source]

Update the filter mode buttons based on the FILTER_MODE_SWITCH value with visual feedback

Parameters:
  • partial_number – int

  • value – int

Returns:

_update_lfo_shape_buttons(partial_number: int, value: int)[source]

Update the LFO shape buttons based on the LFO_SHAPE value with visual feedback

Parameters:
  • partial_number – int

  • value – int

Returns:

_update_mod_lfo_shape_buttons(partial_number: int, value: int)[source]

Update the Mod LFO shape buttons based on the MOD_LFO_SHAPE value with visual feedback

Parameters:
  • partial_number – int

  • value – int

Returns:

class jdxi_editor.ui.editors.digital.editor.DigitalSynth2Editor(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper | None = None, preset_helper: jdxi_editor.ui.preset.helper.JDXiPresetHelper = None, synth_number: int = 2, parent: jdxi_editor.ui.common.QWidget = None)[source]

Bases: DigitalSynthEditor

class for Digital Synth Editor containing 3 partials

preset_changed[source]