jdxi_editor.ui.editors.synth.base

Synth Control Base Module

This module defines the SynthControlBase class, a Qt-based widget that provides MIDI control functionality for synthesizer parameters in the JD-Xi editor.

It facilitates: - Sending and receiving MIDI SysEx messages. - Handling parameter updates through UI elements (sliders, combo boxes, spin boxes, switches). - Managing MIDI helper instances for communication.

Dependencies: - PySide6 for GUI components. - jdxi_editor.midi for MIDI communication. - jdxi_editor.ui.widgets for UI elements.

Classes: - SynthControlBase: A base widget for controlling synth parameters via MIDI.

Classes

SynthBase

base class for all synth editors

Functions

_tooltip_to_str(→ str)

Ensure tooltip is a str; param.get_tooltip() may return a list (e.g. options).

_label_to_str(→ str)

Ensure label is a str; spec.label / display_name may be a list.

Module Contents

jdxi_editor.ui.editors.synth.base._tooltip_to_str(tooltip) str[source]

Ensure tooltip is a str; param.get_tooltip() may return a list (e.g. options).

jdxi_editor.ui.editors.synth.base._label_to_str(label) str[source]

Ensure label is a str; spec.label / display_name may be a list.

class jdxi_editor.ui.editors.synth.base.SynthBase(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper | None = None, parent: PySide6.QtWidgets.QWidget = None, address: jdxi_editor.midi.data.address.address.JDXiSysExAddress | None = None, controls=None)[source]

Bases: PySide6.QtWidgets.QWidget

base class for all synth editors

midi_channel: int | None = None[source]
tab_widget: PySide6.QtWidgets.QTabWidget | None = None[source]
preset_type = None[source]
parent = None[source]
tone_names[source]
controls[source]
_control_registries: Dict[tuple, jdxi_editor.ui.widgets.controls.registry.ControlRegistry][source]
partial_editors[source]
sysex_data = None[source]
address: jdxi_editor.midi.data.address.address.JDXiSysExAddress | None = None[source]
partial_number = None[source]
bipolar_parameters = [][source]
analog: bool = False[source]
_midi_helper = None[source]
midi_requests = [][source]
sysex_composer[source]
property midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper[source]
get_control_registry(synth_type: str, partial_no: int = 1) jdxi_editor.ui.widgets.controls.registry.ControlRegistry[source]

Return the ControlRegistry singleton instance (shared across all partials). Note: ControlRegistry is now a singleton, so all partials share the same registry.

Parameters:
  • synth_type – JDXiSynth.ANALOG_SYNTH, DIGITAL_SYNTH_1, DIGITAL_SYNTH_2, DRUM_KIT

  • partial_no – Partial number (e.g. 1, 2 for digital; 1..N for drums)

Returns:

ControlRegistry singleton instance

_get_address_from_hierarchy(parameter_cls: picomidi.sysex.parameter.address.AddressParameter = None) jdxi_editor.midi.data.address.address.JDXiSysExAddress | None[source]

Get address from self, parent, or parent.parent if available. If no address is found and we’re dealing with a ProgramEditor or ProgramCommonParam, create a program address.

Parameters:

parameter_cls – Optional[AddressParameter] Parameter class hint (e.g., ProgramCommonParam)

Returns:

Optional[RolandSysExAddress] The address if found, None otherwise

send_control_change(control_change: jdxi_editor.midi.data.control_change.base.ControlChange, value: int)[source]

Send MIDI CC message

send_raw_message(message: bytes) bool[source]

Send a raw MIDI message using the MIDI helper.

Parameters:

message – bytes MIDI message to send

Returns:

bool True on success, False otherwise

edit_tone_name()[source]

edit_tone_name

Returns:

None

data_request(channel=None, program=None)[source]

Request the current value of the NRPN parameter from the device.

Parameters:
  • channel – int MIDI channel to send the request on (discarded)

  • program – int Program number to request data for (discarded)

_build_sliders(specs: list[jdxi_editor.ui.widgets.spec.SliderSpec])[source]

build sliders

_build_combo_boxes(specs: list[jdxi_editor.ui.widgets.spec.ComboBoxSpec])[source]

build combo boxes

_build_switches(specs: list[jdxi_editor.ui.widgets.spec.SwitchSpec])[source]
_on_midi_message_received(message: mido.Message) None[source]

Handle incoming MIDI messages

Parameters:

message – mido.Message MIDI message received

Returns:

None

send_tone_name(parameter_cls: picomidi.sysex.parameter.address.AddressParameter, tone_name: str, address: jdxi_editor.midi.data.address.address.JDXiSysExAddress = None) None[source]

send_tone_name

Parameters:
  • parameter_cls – AddressParameter Parameter class containing TONE_NAME parameters

  • tone_name – str Name of the Tone/preset

  • address – Optional[RolandSysExAddress] Address to use, or None to get from hierarchy

Send the characters of the tone name to SysEx parameters.

send_midi_parameter(param: picomidi.sysex.parameter.address.AddressParameter, value: int, address: jdxi_editor.midi.data.address.address.JDXiSysExAddress = None) bool[source]

Send MIDI parameter with error handling

Parameters:
  • address – RolandSysExAddress

  • param – AddressParameter the parameter to send

  • value – int value to send

Returns:

bool True on success, False otherwise

get_controls_as_dict()[source]

Get the current values of self.controls as a dictionary.

Returns:

dict A dictionary of control parameter names and their values.

_add_tab(*, key: jdxi_editor.midi.data.parameter.digital.spec.TabDefinitionMixin, widget: PySide6.QtWidgets.QWidget) None[source]
_on_parameter_changed(param: picomidi.sysex.parameter.address.AddressParameter, display_value: int, address: jdxi_editor.midi.data.address.address.JDXiSysExAddress = None) None[source]

Handle parameter change event, convert digital value to MIDI value,

Parameters:
  • param – AddressParameter Parameter that was changed

  • display_value – int Display value from the UI control

Returns:

None

_create_parameter_slider(param: picomidi.sysex.parameter.address.AddressParameter, label: str, vertical: bool = False, initial_value: int | None = 0, address: jdxi_editor.midi.data.address.address.JDXiSysExAddress = None, show_value_label: bool = True) jdxi_editor.ui.widgets.slider.Slider[source]

Create a slider for an address parameter with proper digital conversion.

Parameters:
  • param – AddressParameter Parameter to create slider for

  • label – str label for the slider

  • initial_value – int initial value for the slider

  • vertical – bool whether the slider is vertical

  • address – RolandSysExAddress

  • show_value_label – str whether to show the value label

Returns:

Slider

_create_parameter_combo_box(param: picomidi.sysex.parameter.address.AddressParameter, label: str = None, options: list = None, values: list = None, show_label: bool = True) jdxi_editor.ui.widgets.combo_box.combo_box.ComboBox[source]

Create a combo box for an address parameter with options and values.

Parameters:
  • param – AddressParameter

  • label – str label for the combo box

  • options – list of options to digital in the combo box

  • values – list of values corresponding to the options (or options if options is None)

  • show_label – bool whether to show the label

Returns:

ComboBox

_create_parameter_spin_box(param: picomidi.sysex.parameter.address.AddressParameter, label: str = None) jdxi_editor.ui.widgets.spin_box.spin_box.SpinBox[source]

Create address spin box for address parameter with proper digital conversion

Parameters:
  • param – AddressParameter Parameter to create spin box for

  • label – str label for the spin box

Returns:

SpinBox

_create_parameter_switch(param: picomidi.sysex.parameter.address.AddressParameter, label: str, values: list[str]) jdxi_editor.ui.widgets.switch.switch.Switch[source]

Create a switch for an address parameter with specified label and values.

Parameters:
  • param – AddressParameter Parameter to create switch for

  • label – str label for the switch

  • values – list of values for the switch

Returns:

Switch

_init_synth_data(synth_type: str = JDXiSynth.DIGITAL_SYNTH_1, partial_number: int | None = 0)[source]

Initialize synth-specific data.

_update_slider(param: picomidi.sysex.parameter.address.AddressParameter, midi_value: int, successes: list = None, failures: list = None, slider: PySide6.QtWidgets.QWidget = None) None[source]

Update slider based on parameter and value.

Parameters:
  • param – AddressParameter

  • midi_value – int value

  • successes – list

  • failures – list

Returns:

None

_update_switch(param: picomidi.sysex.parameter.address.AddressParameter, midi_value: int, successes: list = None, failures: list = None) None[source]

Update switch based on parameter and value.

Parameters:
  • param – AddressParameter

  • midi_value – int value

  • successes – list

  • failures – list

Returns:

None

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

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

Parameters:
  • partial_no – int

  • param – AddressParameter

  • value – int

  • successes – list list of successful updates

  • failures – list list of failed updates

Returns:

None