jdxi_editor.ui.editors

Editor modules for JD-Xi parameters

Submodules

Classes

AnalogSynthEditor

Analog Synth Editor UI.

ArpeggioEditor

Arpeggio Editor Window

DigitalSynthEditor

class for Digital Synth Editor containing 3 partials

DrumCommonEditor

Editor for JD-Xi Drum Kit parameters

EffectsCommonEditor

Effects Editor Window

VocalFXEditor

Vocal Effects Window Class

ProgramEditor

Program Editor Window

Package Contents

class jdxi_editor.ui.editors.AnalogSynthEditor(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper | None = None, preset_helper: jdxi_editor.ui.preset.helper.JDXiPresetHelper | None = None, parent: PySide6.QtWidgets.QWidget | None = None)[source]

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

Analog Synth Editor UI.

SUB_OSC_TYPE_MAP
SYNTH_SPEC
preset_helper = None
main_window = None
analog = True
adsr_mapping
pitch_env_mapping
pwm_mapping
refresh_shortcut
filter_switch_map
osc_waveform_map
setup_ui()[source]

Set up the Analog Synth Editor UI.

_create_sections()[source]

Create the sections for the Analog Synth Editor. Each section in its own try/except so one failure does not prevent others from showing.

_build_parameter_mappings()[source]

Populate adsr_mapping, pitch_env_mapping, pwm_mapping only when the corresponding sections exist.

_init_parameter_mappings()[source]

Initialize MIDI parameter mappings.

update_filter_controls_state(mode: int)[source]

Update filter controls enabled state (delegate to section, same mechanism as Digital).

_on_filter_mode_changed(mode: int)[source]

Handle filter mode changes (callback from filter section when mode button clicked).

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

Bases: jdxi_editor.ui.editors.synth.simple.BasicEditor

Arpeggio Editor Window

EDITOR_PARAM
midi_helper
preset_helper = None
address
partial_number = 0
controls: Dict[picomidi.sysex.parameter.address.AddressParameter, jdxi_editor.ui.common.QWidget]
zone_switches: Dict[str, jdxi_editor.ui.common.QWidget]
base_widget
editor_helper
midi_requests
setup_ui()[source]
showEvent(event: PySide6.QtGui.QShowEvent) None[source]

Request current settings from the instrument when the editor is shown.

dispatch_sysex_to_area(json_sysex_data: str) None[source]

Parse SysEx JSON and update Arpeggio controls.

_build_widgets()[source]

Build widgets

_build_zone_switches() List[jdxi_editor.ui.common.QWidget][source]

Build per-zone Arpeggio Switch controls (enables arpeggiator per zone).

_build_layout_spec()[source]
class jdxi_editor.ui.editors.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
FILTER_MODE_MAP
main_layout = None
instrument_image_group: PySide6.QtWidgets.QGroupBox | None = None
instrument_title_label: PySide6.QtWidgets.QLabel | None = None
partial_number = None
current_data = None
preset_helper = None
main_window = None
synth_number = 1
adsr_parameters
pitch_env_parameters
pwm_parameters
_partial_param_control_map: Dict[int, Dict[str, jdxi_editor.ui.common.QWidget]]
refresh_shortcut
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.DrumCommonEditor(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper | None = None, preset_helper: jdxi_editor.ui.preset.helper.JDXiPresetHelper | None = None, parent: jdxi_editor.ui.windows.jdxi.instrument.JDXiInstrument | None = None)[source]

Bases: jdxi_editor.ui.editors.synth.editor.SynthEditor

Editor for JD-Xi Drum Kit parameters

instrument_image_group: PySide6.QtWidgets.QGroupBox | None = None
presets_parts_tab_widget = None
preset_helper = None
midi_helper = None
partial_number = 0
sysex_current_data = None
sysex_previous_data = None
partial_mapping
main_window = None
partial_editors
partial_tab_widget
instrument_image_label = None
instrument_title_label = None
refresh_shortcut
setup_ui() None[source]

Setup the UI components for the drum editor.

_handle_program_change(channel: int, program: int)[source]

Handle program change messages by requesting updated data

Parameters:
  • channel – int

  • program – int

_setup_partial_editors()[source]

Setup the 36 partial editors

update_partial_number(index: int)[source]

Update the current partial number based on tab index

Parameters:

index – int partial number

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

apply partial ui updates

Parameters:
  • partial_no – int

  • sysex_data – dict

  • successes – list

  • failures – list

Returns:

_update_common_controls(partial: int, sysex_data: Dict, successes: list = None, failures: list = None)[source]

Update the UI components for tone common and modify parameters.

Parameters:
  • partial – int

  • sysex_data – Dictionary containing SysEx data

  • successes – List of successful parameters

  • failures – List of failed parameters

Returns:

None

class jdxi_editor.ui.editors.EffectsCommonEditor(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper, preset_helper: jdxi_editor.ui.preset.helper.JDXiPresetHelper = None, parent=None)[source]

Bases: jdxi_editor.ui.editors.synth.simple.BasicEditor

Effects Editor Window

tab_widget = None
midi_helper
preset_helper = None
_sysex_dispatcher
EFX1_PARAMETERS
EFX2_PARAMETERS
midi_requests
delay_params = None
efx2_additional_params
base_widget
editor_helper
tabs = None
address
sysex_composer
showEvent(event: PySide6.QtGui.QShowEvent) None[source]

Request current settings from the instrument when the editor is shown.

_apply_effect_tooltips() None[source]

Set tooltips for effect controls from EffectsData.effect_tooltips.

update_flanger_rate_note_controls() None[source]

Update Flanger rate/note controls based on rate note switch.

update_phaser_rate_note_controls() None[source]

Update Phaser rate/note controls based on rate note switch.

update_efx1_labels(effect_type: int)[source]

Switch Effect 1 polymorphic stack to the page for the selected effect type.

Parameters:

effect_type – int (0=Thru, 1=Distortion, 2=Fuzz, 3=Compressor, 4=Bit Crusher)

update_efx2_labels(effect_type: int)[source]

Switch Effect 2 polymorphic stack to the page for the selected effect type.

Parameters:

effect_type – int - SysEx value (0, 5, 6, 7, 8) or combo index (0-4)

_build_effect1_common_layout_spec() jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Common Effect 1 controls (Type, Level, sends, Output Assign).

_build_effect1_layout_spec_for_type(effect_type: int) jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Build layout spec for a specific Effect 1 type (polymorphic).

_build_widgets_from_spec(spec: jdxi_editor.ui.widgets.layout.WidgetLayoutSpec) jdxi_editor.ui.widgets.group.WidgetGroups[source]

Build WidgetGroups from a layout spec (same paradigm as Arpeggiator).

_wrap_section(title: str, content: jdxi_editor.ui.common.QWidget) PySide6.QtWidgets.QGroupBox[source]

Wrap a section in a QGroupBox for the 2-column grid layout.

_create_effect1_section()[source]

Create Effect 1 section (polymorphic: stacked pages per effect type).

_build_effect2_common_layout_spec() jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Common Effect 2 controls (Type, Level, sends).

_build_effect2_layout_spec_for_type(effect_type: int) jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Build layout spec for a specific Effect 2 type (polymorphic).

_create_effect2_section()[source]

Create Effect 2 section (polymorphic: stacked pages per effect type).

_build_delay_layout_spec() jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Build layout spec for Delay tab (spec-driven widgets).

_create_delay_tab()[source]

Create Delay tab (spec-driven).

_update_delay_time_note_controls() None[source]

Enable Time [ms] or Note based on Time/Note mode switch.

_build_reverb_layout_spec() jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Build layout spec for Reverb tab (spec-driven widgets).

_create_reverb_section()[source]

Create Reverb section (spec-driven).

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

Handle parameter value changes from UI controls.

send_midi_parameter(param: picomidi.sysex.parameter.address.AddressParameter, value: int) bool[source]

Send MIDI parameter with error handling

Parameters:
  • param – AddressParameter

  • value – int value

Returns:

bool True on success, False otherwise

dispatch_sysex_to_area(json_sysex_data: str) None[source]

Thin adapter: parse → validate → dispatch

class jdxi_editor.ui.editors.VocalFXEditor(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper | None = None, preset_helper: jdxi_editor.ui.preset.helper.JDXiPresetHelper = None, parent: jdxi_editor.ui.common.QWidget | None = None)[source]

Bases: jdxi_editor.ui.editors.synth.simple.BasicEditor

Vocal Effects Window Class

preset_helper = None
address
base_widget
editor_helper
controls: Dict[picomidi.sysex.parameter.address.AddressParameter, jdxi_editor.ui.common.QWidget]
tab_widget = None
midi_requests
showEvent(event: PySide6.QtGui.QShowEvent) None[source]

Request current settings from the instrument when the editor is shown.

dispatch_sysex_to_area(json_sysex_data: str) None[source]

Parse SysEx JSON and update Vocal FX controls.

_apply_vocal_effect_tooltips() None[source]

Set tooltips for vocal effect controls from VocalEffectsData.

_build_widgets_from_spec(spec: jdxi_editor.ui.widgets.layout.WidgetLayoutSpec) jdxi_editor.ui.widgets.group.WidgetGroups[source]

Build WidgetGroups from a layout spec (same paradigm as Arpeggiator/Effects).

_build_common_layout_spec() jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Build layout spec for Common tab.

_create_common_section() jdxi_editor.ui.common.QWidget[source]

Create Common tab (spec-driven).

_update_vocal_effect_stack(index: int) None[source]

Switch Vocoder & Auto Pitch stack to the page for the selected effect type.

_create_vocal_effect_stack_section() jdxi_editor.ui.common.QWidget[source]

Create Vocoder & Auto Pitch tab with QStackedWidget (OFF/VOCODER/AUTO-PITCH).

_build_vocal_effect_layout_spec() jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Build layout spec for Vocal FX tab (Vocoder settings).

_create_vocal_effect_section() jdxi_editor.ui.common.QWidget[source]

Create Vocal FX tab (spec-driven).

_build_mixer_layout_spec() jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Build layout spec for Mixer tab.

_create_mixer_section() jdxi_editor.ui.common.QWidget[source]

Create Mixer tab (spec-driven).

_build_auto_pitch_layout_spec() jdxi_editor.ui.widgets.layout.WidgetLayoutSpec[source]

Build layout spec for Auto Pitch tab.

_create_auto_pitch_section() jdxi_editor.ui.common.QWidget[source]

Create Auto Pitch tab (spec-driven).

class jdxi_editor.ui.editors.ProgramEditor(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper | None = None, parent: jdxi_editor.ui.common.QWidget | None = None, preset_helper: jdxi_editor.ui.preset.helper.JDXiPresetHelper = None)[source]

Bases: jdxi_editor.ui.editors.synth.simple.BasicEditor

Program Editor Window

TEMPORARY_AREA_HANDLERS
program_changed
title_right_vlayout = None
program_list = None

Initialize the ProgramEditor

Parameters:
  • midi_helper – Optional[MidiIOHelper]

  • parent – Optional[QWidget]

  • preset_helper – JDXIPresetHelper

midi_helper = None
preset_helper = None
channel
midi_requests
spec
default_image = ''
instrument_icon_folder = ''
instrument_title_label
layout = None
midi_channel = 0
genre_label = None
program_name = ''
bank_combo_box = None
save_button = None
title_label = None
bank_label = None
program_label = None
genre_combo_box = None
program_preset: jdxi_editor.ui.editors.preset.widget.PresetWidget | None = None
preset_type = None
programs
_actual_preset_list
controls: Dict[picomidi.sysex.parameter.address.AddressParameter, jdxi_editor.ui.common.QWidget]
mixer_widget: jdxi_editor.ui.editors.program.mixer.section.ProgramMixer | None = None
program_group_widget: jdxi_editor.ui.editors.program.group.ProgramGroup | None = None
user_programs_widget: jdxi_editor.ui.editors.program.user_programs_widget.UserProgramsWidget | None = None
playlist_widget: jdxi_editor.ui.editors.playlist.table.PlaylistTable | None = None
playlist_editor_widget: jdxi_editor.ui.editors.playlist.editor.PlaylistEditor | None = None
setup_ui()[source]

set up ui elements

on_category_changed(_: int) None[source]

Handle category selection change - no longer needed, handled by SearchableFilterableComboBox.

on_preset_type_changed(index: int) None[source]

on_preset_type_changed

Parameters:

index – int

Handle preset type selection change Note: This delegates to PresetWidget’s on_preset_type_changed, but also updates ProgramEditor’s internal state.

set_channel_and_preset_lists(preset_type: str) None[source]

set_channel_and_preset_lists

Parameters:

preset_type

Returns:

None

_update_preset_combo_box() None[source]

Update the SearchableFilterableComboBox with current preset list. Called when preset type changes. Note: This method is now handled by PresetWidget._update_preset_combo_box(), but kept here for backward compatibility if needed.

_populate_programs(search_text: str = '') None[source]

Populate the program list with available presets. Now delegates to populate_programs() which uses _update_program_combo_box().

Parameters:

search_text – str

Returns:

None

_populate_presets(search_text: str = '') None[source]

Populate the program list with available presets. Now handled by SearchableFilterableComboBox, so this just updates the combo box.

Parameters:

search_text – str (ignored, handled by SearchableFilterableComboBox)

Returns:

None

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

  • partial_number – int

Returns:

None

Initialize synth-specific data

update_tone_name_for_synth(tone_name: str, synth_type: str) None[source]

Update the tone name.

Parameters:
  • tone_name – str

  • synth_type – str

set_current_program_name(program_name: str, synth_type: str = None) None[source]

Set the current program name in the file label

Parameters:
  • program_name – str

  • synth_type – str (optional), discarded for now

Returns:

None

start_playback()[source]

Start playback of the MIDI file.

stop_playback()[source]

Stop playback of the MIDI file.

_update_program_combo_box() None[source]

Update the SearchableFilterableComboBox with current program list. Handles both ROM banks (A-D) and user banks (E-H) with SQLite integration.

populate_programs(search_text: str = '')[source]

Populate the program list with available presets. Now handled by SearchableFilterableComboBox, so this just updates the combo box. Uses SQLite database to ensure all user bank programs are loaded correctly.

add_user_banks(filtered_list: list, bank: str, search_text: str = None) None[source]

Add user banks to the program list. Only adds generic entries for programs that don’t exist in the database. Uses SQLite database for reliable lookups. :param search_text: :param filtered_list: list of programs already loaded from database :param bank: str

_add_program_to_database(program_id: str, program_name: str)[source]

add program to database

_get_table_style() str[source]

Get custom styling for tables with rounded corners and charcoal embossed cells.

Returns:

str CSS style string

_on_user_program_loaded(program: jdxi_editor.midi.program.program.JDXiProgram) None[source]

Handle when a user program is loaded from the table.

Parameters:

program – JDXiProgram that was loaded

_on_playlist_changed() None[source]

Handle when a playlist is created, deleted, or updated. Refreshes the playlist editor combo if it exists.

_on_playlist_program_loaded(program: jdxi_editor.midi.program.program.JDXiProgram) None[source]

Handle when a program is loaded from the playlist editor. Updates UI to reflect the loaded program.

Parameters:

program – JDXiProgram that was loaded

_populate_playlist_editor_combo() None[source]

Populate the playlist editor combo (callback for playlist editor widget).

_get_parent_instrument() jdxi_editor.ui.common.QWidget | None[source]

Get the parent instrument widget for accessing MidiFileEditor.

Returns:

Optional[QWidget] parent instrument or None

on_bank_changed(_: int) None[source]

Handle bank selection change - no longer needed, handled by SearchableFilterableComboBox.

on_program_number_changed(index: int) None[source]

Handle program number selection change. :param index: int

load_program()[source]

Load the selected program based on bank and number. Delegates to ProgramGroupWidget’s load_program method.

update_current_synths(program_details: jdxi_editor.midi.program.program.JDXiProgram) None[source]

Update the current synth labels in the mixer widget. :param program_details: JDXiProgram :return: None

load_preset(program_number: int) None[source]

Load preset by program change and refresh UI.

Parameters:

program_number – Preset ID (e.g., 1 for “001”)

Returns:

None

_update_program_list() None[source]

Update the program list with available presets.

on_genre_changed(_: int) None[source]

Handle genre selection change - no longer needed, handled by SearchableFilterableComboBox.

_normalize_program_common(sysex_data: dict) dict[source]

Normalize special Program Common address case.

_get_partial_map(temporary_area: str)[source]

get partial map

dispatch_sysex_to_area(json_sysex_data: str) None[source]

Dispatch SysEx data to the appropriate area for processing.

Parameters:

json_sysex_data

Returns:

None

_handle_sliders(sysex_data: dict, temporary_area: str | None, successes: list[Any], failures: list[Any])[source]

Slider handling

get_mixer_slider_by_param(slider_param: picomidi.sysex.parameter.address.AddressParameter) jdxi_editor.ui.common.QWidget | None[source]

get mixer slider

get_mixer_slider(slider_name: str) jdxi_editor.ui.common.QWidget | None[source]

get mixer slider

_get_partial_tone_names() list[str][source]

get partial tone names

_update_common_controls(partial_number: int, sysex_data: Dict, successes: list = None, failures: list = None, temporary_area: str = 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

  • temporary_area – str TEMPORARY_PROGRAM, DIGITAL_SYNTH_1, etc.

Returns:

None

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

Update slider based on parameter and value.

Parameters:
  • param – AddressParameter

  • midi_value – int value

  • successes – list

  • failures – list

Returns:

None