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

SynthEditor

Base class for all editor windows

Package Contents

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

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

Analog Synth Editor UI.

instrument_image_group: PySide6.QtWidgets.QGroupBox | None = None
scroll: PySide6.QtWidgets.QScrollArea | None = None
instrument_preset_group: PySide6.QtWidgets.QGroupBox | None = None
instrument_preset_layout: PySide6.QtWidgets.QVBoxLayout | None = None
instrument_preset: PySide6.QtWidgets.QWidget | None = None
instrument_preset_widget: PySide6.QtWidgets.QWidget | None = None
instrument_preset_hlayout: PySide6.QtWidgets.QHBoxLayout | None = None
amp_section: jdxi_editor.ui.editors.analog.amp.AnalogAmpSection | None = None
oscillator_section: jdxi_editor.ui.editors.analog.oscillator.AnalogOscillatorSection | None = None
filter_section: jdxi_editor.ui.editors.analog.filter.AnalogFilterSection | None = None
read_request_button = None
tab_widget = None
lfo_section = None
instrument_selection_label = None
instrument_title_label = None
preset_helper = None
wave_buttons
lfo_shape_buttons
controls: Dict[jdxi_editor.midi.data.parameter.analog.AnalogParam, PySide6.QtWidgets.QWidget]
updating_from_spinbox = False
previous_json_data = None
main_window = None
adsr_mapping
pitch_env_mapping
pwm_mapping = []
refresh_shortcut
sub_osc_type_map
filter_switch_map
osc_waveform_map
setup_ui()[source]

Set up the Analog Synth Editor UI.

setup_main_layout()[source]

set up main layout

_create_sections()[source]

Create the sections for the Analog Synth Editor.

_init_parameter_mappings()[source]

Initialize MIDI parameter mappings.

update_filter_controls_state(mode: int)[source]

Update filter controls enabled state based on mode

_on_filter_mode_changed(mode: int)[source]

Handle filter mode changes

update_filter_state(value: int)[source]

Update the filter state

Parameters:

value – int value

Returns:

None

_on_waveform_selected(waveform: jdxi_editor.midi.data.analog.oscillator.AnalogOscWave)[source]

Handle waveform button selection

Parameters:

waveform – AnalogOscWave value

Returns:

None

get_controls_as_dict()[source]

Get the current values of self.controls as a dictionary. Override to handle waveform buttons specially.

Returns:

dict A dictionary of control parameter names and their values.

_on_lfo_shape_changed(value: int)[source]

Handle LFO shape change

Parameters:

value – int value

Returns:

None

update_slider(param: jdxi_editor.midi.data.parameter.analog.AnalogParam, midi_value: int, successes: list = None, failures: list = None) None[source]

Helper function to update sliders safely.

Parameters:
  • param – AddressParameterAnalog value

  • failures – list of failed parameters

  • successes – list of successful parameters

  • midi_value – int value

Returns:

None

update_adsr_widget(param: jdxi_editor.midi.data.parameter.analog.AnalogParam, midi_value: int, successes: list = None, failures: list = None) None[source]

Helper function to update ADSR widgets.

Parameters:
  • param – AddressParameterAnalog value

  • midi_value – int value

  • failures – list of failed parameters

  • successes – list of successful parameters

Returns:

None

update_pitch_env_widget(parameter: jdxi_editor.midi.data.parameter.analog.AnalogParam, value: int, successes: list = None, failures: list = None) None[source]

Helper function to update ADSR widgets.

Parameters:
  • parameter – AddressParameterAnalog value

  • value – int value

  • failures – list of failed parameters

  • successes – list of successful parameters

Returns:

None

update_pwm_widget(parameter: jdxi_editor.midi.data.parameter.analog.AnalogParam, value: int, successes: list = None, failures: list = None) None[source]

Helper function to update PWM widgets.

Parameters:
  • parameter – AddressParameterAnalog value

  • value – int value

  • failures – list of failed parameters

  • successes – list of successful parameters

Returns:

None

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

Update sliders and combo boxes based on parsed SysEx data.

Parameters:
  • sysex_data – dict SysEx data

  • successes – list SysEx data

  • failures – list SysEx data

Returns:

None

_update_waveform_buttons(value: int)[source]

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

Parameters:

value – int value

Returns:

None

_update_lfo_shape_buttons(value: int)[source]

Update the LFO shape buttons with visual feedback.

Parameters:

value – int value

Returns:

None

_update_pw_controls_state(waveform: jdxi_editor.midi.data.analog.oscillator.AnalogOscWave)[source]

Enable/disable PW controls based on waveform

Parameters:

waveform – AnalogOscWave value

Returns:

None

create_instrument_preset_group(synth_type: str = 'Analog') PySide6.QtWidgets.QGroupBox[source]

Create the instrument preset group box with tabs for normal and cheat presets.

Parameters:

synth_type – str

Returns:

QGroupBox

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

Populate the cheat preset combo box with Digital Synth presets.

Parameters:

search_text – str Search filter text

_on_cheat_category_changed(index: int)[source]

Handle category selection change for cheat presets.

_load_cheat_preset()[source]

Load a Digital Synth preset on the Analog Synth channel (Cheat Mode).

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

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

Arpeggio Editor Window

midi_helper
preset_helper = None
address
partial_number = 0
instrument_icon_folder = 'arpeggiator'
default_image = 'arpeggiator2.png'
controls: Dict[picomidi.sysex.parameter.address.AddressParameter, PySide6.QtWidgets.QWidget]
title_label
image_label
switch_button
style_combo
grid_combo
duration_combo
velocity_slider
accent_slider
octave_combo
motif_combo
class jdxi_editor.ui.editors.DigitalSynthEditor(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper | None = None, preset_helper: jdxi_editor.jdxi.preset.helper.JDXiPresetHelper = None, synth_number: int = 1, parent: PySide6.QtWidgets.QWidget = None)[source]

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

class for Digital Synth Editor containing 3 partials

preset_changed
instrument_image_group: PySide6.QtWidgets.QGroupBox | None = None
instrument_title_label: PySide6.QtWidgets.QLabel | None = None
partial_number = None
current_data = None
midi_helper = None
preset_helper
main_window = None
controls: Dict[jdxi_editor.midi.data.parameter.digital.DigitalPartialParam | jdxi_editor.midi.data.parameter.digital.DigitalCommonParam, PySide6.QtWidgets.QWidget]
synth_number = 1
refresh_shortcut
adsr_parameters
pitch_env_parameters
pwm_parameters
setup_ui()[source]

set up user interface

_create_partial_tab_widget(container_layout: PySide6.QtWidgets.QVBoxLayout, 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 – MiodiIOHelper instance for MIDI communication

Returns:

None

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

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

Parameters:
  • partial – The partial to modify

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

  • selected – Whether the partial is selected

Returns:

None

set_partial_state(partial: jdxi_editor.midi.data.parameter.digital.DigitalPartialParam, 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

  • 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_partial_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_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(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

_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:

class jdxi_editor.ui.editors.DrumCommonEditor(midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper | None = None, preset_helper: jdxi_editor.jdxi.preset.helper.JDXiPresetHelper | None = None, parent: PySide6.QtWidgets.QWidget | 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
controls: Dict[jdxi_editor.midi.data.parameter.drum.partial.DrumPartialParam | jdxi_editor.midi.data.parameter.drum.common.DrumCommonParam, PySide6.QtWidgets.QWidget]
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_partial_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.jdxi.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
EFX1_PARAMETERS
EFX2_PARAMETERS
efx1_param_labels
efx2_param_labels
midi_requests = []
delay_params = None
efx2_additional_params
default_image = 'effects.png'
instrument_icon_folder = 'effects'
title_label
image_label
controls: Dict[jdxi_editor.midi.data.parameter.effects.effects.ReverbParam | jdxi_editor.midi.data.parameter.effects.common.AddressParameterEffectCommon | jdxi_editor.midi.data.parameter.effects.effects.Effect1Param | jdxi_editor.midi.data.parameter.effects.effects.Effect2Param, PySide6.QtWidgets.QWidget]
tabs
address
sysex_composer
showEvent(event: PySide6.QtGui.QShowEvent) None[source]

Override showEvent to request current settings from the instrument when the editor is shown. This ensures the sliders pick up the current settings from the instrument, similar to Digital 1, Digital 2, and Analog synth editors.

Parameters:

event – QShowEvent

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 Flanger rate/note controls based on rate note switch.

_update_efx1_labels(effect_type: int)[source]

Update Effect 1 parameter labels based on selected effect type.

Parameters:

effect_type – int

Returns:

_update_efx2_labels(effect_type: int)[source]

Update Effect 2 parameter labels based on selected effect type.

Parameters:

effect_type – int

_create_effect1_section()[source]

Create Effect 1 section

_create_effect2_section()[source]

Create Effect 2 section

_create_delay_tab()[source]

Create Delay tab with parameters

_create_reverb_section()[source]

Create Reverb section

_on_parameter_changed(param: picomidi.sysex.parameter.address.AddressParameter, value: int, address: jdxi_editor.midi.data.address.address.RolandSysExAddress = 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]

Dispatch SysEx data to update effects controls.

Parameters:

json_sysex_data – str JSON string containing SysEx data

Returns:

None

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

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

Vocal Effects Window Class

preset_helper = None
address
controls: Dict[picomidi.sysex.parameter.address.AddressParameter, PySide6.QtWidgets.QWidget]
title_label
image_label
default_image = 'vocal_fx.png'
instrument_icon_folder = 'vocal_fx'
tab_widget
_create_common_section() PySide6.QtWidgets.QWidget[source]

_create_common_section

Returns:

QWidget

_create_vocal_effect_section() PySide6.QtWidgets.QWidget[source]

Create general vocal effect controls section

_create_mixer_section() PySide6.QtWidgets.QWidget[source]

_create_mixer_section

Returns:

QWidget

_create_auto_pitch_section()[source]

_create_auto_pitch_section

Returns:

QWidget

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

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

Program Editor Window

program_changed
title_right_vlayout = None
program_list = None
file_label = None

Initialize the ProgramEditor

Parameters:
  • midi_helper – Optional[MidiIOHelper]

  • parent – Optional[QWidget]

  • preset_helper – JDXIPresetHelper

midi_helper = None
preset_helper = None
channel
midi_requests
default_image = 'programs.png'
instrument_icon_folder = 'programs'
instrument_title_label
layout = None
midi_channel = 0
genre_label = None
program_number_combo_box = None
program_name = ''
bank_combo_box = None
load_button = None
save_button = None
image_label = None
title_label = None
bank_label = None
program_label = None
genre_combo_box = None
preset_type = None
programs
_current_playlist_row = None
_playlist_midi_editor = None
controls: Dict[picomidi.sysex.parameter.address.AddressParameter, PySide6.QtWidgets.QWidget]
setup_ui()[source]

set up ui elements

_create_preset_selection_widget() PySide6.QtWidgets.QWidget[source]

create_preset_selection_widget

Returns:

QWidget

load_preset_by_program_change(preset_index: int) None[source]

Load a preset by program change.

Parameters:

preset_index – int

on_category_changed(_: int) None[source]

Handle category selection change.

_create_transport_group() PySide6.QtWidgets.QGroupBox[source]

_create_transport_group

Returns:

QGroupBox

Transport controls area

_create_program_selection_box() PySide6.QtWidgets.QGroupBox[source]

create_program_selection_box

Returns:

QGroupBox

edit_program_name()[source]

edit_tone_name

Returns:

None

on_preset_type_changed(index: int) None[source]

on_preset_type_changed

Parameters:

index – int

Handle preset type selection change

set_channel_and_preset_lists(preset_type: str) None[source]

set_channel_and_preset_lists

Parameters:

preset_type

Returns:

None

update_category_combo_box_categories() None[source]

update_category_combo_box_categories

Returns:

None

Update the category combo box.

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

Populate the program list with available presets.

Parameters:

search_text – str

Returns:

None

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

Populate the program list with available presets.

Parameters:

search_text – str

Returns:

None

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

  • partial_number – int

Returns:

None

Initialize synth-specific data

_create_mixer_section() PySide6.QtWidgets.QWidget[source]

_create_mixer_section

Returns:

QWidget

Create general vocal effect controls section with scrolling

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.

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

Populate the program list with available presets. 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

_create_user_programs_tab() PySide6.QtWidgets.QWidget[source]

Create the User Programs tab with a sortable, searchable table.

Returns:

QWidget containing the user programs table

_get_table_style() str[source]

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

Returns:

str CSS style string

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

Populate the user programs table from SQLite database.

Parameters:

search_text – Optional search text to filter programs

_save_user_programs_changes() None[source]

Save changes made to the user programs table (e.g., genre edits) to the database.

_create_playlist_tab() PySide6.QtWidgets.QWidget[source]

Create the Playlist tab with a table showing all playlists.

Returns:

QWidget containing the playlist table

_populate_playlist_table() None[source]

Populate the playlist table from SQLite database.

_create_new_playlist() None[source]

Create a new playlist.

_refresh_playlists() None[source]

populate programs

_delete_selected_playlist() None[source]

Delete the selected playlist.

_on_playlist_item_changed(item: PySide6.QtWidgets.QTableWidgetItem) None[source]

Handle changes to playlist name or description.

Parameters:

item – The table item that was changed

_on_playlist_selected(item: PySide6.QtWidgets.QTableWidgetItem) None[source]

Handle double-click on a playlist. Could open playlist editor or show playlist programs.

Parameters:

item – The table item that was double-clicked

_create_playlist_editor_tab() PySide6.QtWidgets.QWidget[source]

Create the Playlist Editor tab for editing playlist contents.

Returns:

QWidget containing the playlist editor

_populate_playlist_editor_combo() None[source]

Populate the playlist selection combo box.

_on_playlist_programs_selection_changed() None[source]

Handle selection change in playlist programs table.

_on_playlist_editor_playlist_changed(index: int) None[source]

Handle playlist selection change in the editor.

_populate_playlist_programs_table(playlist_id: int) None[source]

Populate the playlist programs table with programs from the selected playlist.

Parameters:

playlist_id – Playlist ID

_on_cheat_preset_changed(row: int, cheat_preset_id: str | None) None[source]

Handle cheat preset selection change.

Parameters:
  • row – Table row index

  • cheat_preset_id – Selected cheat preset ID or None

_on_playlist_program_item_changed(item: PySide6.QtWidgets.QTableWidgetItem) None[source]

Handle changes to playlist program items (e.g., MIDI file path).

Parameters:

item – The table item that was changed

_add_program_to_playlist() None[source]

Add a program to the selected playlist.

_delete_program_from_playlist() None[source]

Delete selected program(s) from the playlist.

_play_playlist_program(index) None[source]

Play the MIDI file associated with a playlist program.

Parameters:

index – QModelIndex of the play button

_on_playlist_playback_finished()[source]

Called when MIDI playback finishes. Advances to the next playlist item.

_on_playlist_program_double_clicked(item: PySide6.QtWidgets.QTableWidgetItem) None[source]

Handle double-click on a playlist program item. If the Program Name column (column 2) is clicked, show the Program Editor.

Parameters:

item – The table item that was double-clicked

_load_program_from_table_for_playlist(row: int) None[source]

Load a program from the playlist programs table and send MIDI Program Change.

Parameters:

row – Row index in the table

_load_cheat_preset(preset_id: str) None[source]

Load a cheat preset (Digital Synth preset) on the Analog Synth channel (Ch3).

Parameters:

preset_id – Preset ID (e.g., “113”)

_on_user_program_selected(item: PySide6.QtWidgets.QTableWidgetItem) None[source]

Handle double-click on a program in the user programs table. Loads the program via MIDI Program Change.

Parameters:

item – The table item that was double-clicked

_on_user_program_selection_changed() None[source]

Handle selection change in the user programs table. Loads the program via MIDI Program Change when a row is selected.

_play_user_program(index) None[source]

Callback for Play button delegate - loads and plays the program.

Parameters:

index – QModelIndex from the delegate

_load_program_from_table(row: int) None[source]

Load a program from the table and send MIDI Program Change.

Parameters:

row – Row index in the table

on_bank_changed(_: int) None[source]

Handle bank selection change.

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.

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

Update the current synth label. :param program_details: dict :return: None

load_preset(program_number: int) None[source]

load_preset

Parameters:

program_number – int

Returns:

None

Load preset data and update UI

_update_program_list() None[source]

Update the program list with available presets.

on_genre_changed(_: int) None[source]

Handle genre selection change.

Parameters:

_ – int

_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

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

class jdxi_editor.ui.editors.SynthEditor(midi_helper: object | None = None, parent: PySide6.QtWidgets.QWidget | None = None)[source]

Bases: jdxi_editor.ui.editors.synth.base.SynthBase

Base class for all editor windows

parameter_received
partial_map
sysex_current_data = None
preset_list = None
programs = None
midi_helper
cc_parameters
nrpn_parameters
nrpn_map
controls
bipolar_parameters = []
midi_requests = []
instrument_default_image = None
instrument_title_label = None
instrument_image_label = None
instrument_icon_folder = None
partial_number = None
midi_channel = None
preset_helper = None
instrument_selection_combo = None
preset_type = None
refresh_shortcut
close_shortcut
json_parser
__str__()[source]
__repr__()[source]
_init_synth_data(synth_type: str = JDXiSynth.DIGITAL_SYNTH_1, partial_number: int | None = 0)[source]

Initialize synth-specific data.

showEvent(event: PySide6.QtGui.QShowEvent) None[source]

Override showEvent to request current settings from the instrument when the editor is shown. This ensures the sliders pick up the current settings from the instrument, similar to Digital 1, Digital 2, and Analog synth editors.

Parameters:

event – QShowEvent

create_instrument_preset_group(synth_type: str = 'Analog') PySide6.QtWidgets.QGroupBox[source]

Create the instrument preset group box.

Parameters:

synth_type – str

Returns:

QGroupBox

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.

_get_preset_helper_for_current_synth()[source]

Return the appropriate preset handler based on the current synth preset_type.

_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

abstract _update_partial_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

By default has no partials, so subclass to implement partial updates

_parse_sysex_json(json_sysex_data: str) dict | None[source]

_parse_sysex_json

Parameters:

json_sysex_data – str

Returns:

dict

set_instrument_title_label(name: str, synth_type: str)[source]

set_instrument_title_label

Parameters:
  • name – str

  • synth_type – str

Returns:

None

update_combo_box_index(preset_number)[source]

Updates the QComboBox to reflect the loaded preset.

update_instrument_title()[source]

update instrument title

Returns:

update_instrument_preset(text)[source]
load_preset(preset_index)[source]

Load a preset by program change.

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

Handle program change messages by requesting updated data

_handle_control_change(channel: int, control: int, value: int)[source]

Handle program change messages by requesting updated data

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

Send MIDI CC message

load_and_set_image(image_path, secondary_image_path=None)[source]

Helper function to load and set the image on the label.

update_instrument_image()[source]

Update the instrument image based on the selected synth.

_get_instrument_selection_combo()[source]

Get the instrument selection combo box from either the widget or direct attribute. Returns None if not found.

_get_instrument_image_label()[source]

Get the instrument image label from either the widget or direct attribute. Returns None if not found.

_get_selected_instrument_text() str[source]
_parse_instrument_text(text: str) tuple[source]
_try_load_specific_or_generic_image(name: str, type_: str) bool[source]
_fallback_to_default_image(reason: str)[source]
update_instrument_image_new()[source]

Update the instrument image based on the selected synth.

update_instrument_image_old()[source]

Update the instrument image based on the selected synth.

_update_common_controls(partial_number: int, filtered_data, successes, failures)[source]
_update_modify_controls(partial_number: int, filtered_data, successes, failures)[source]