Source code for jdxi_editor.ui.preset.manager

from decologr import Decologr as log

from jdxi_editor.core.synth.type import JDXiSynth
from jdxi_editor.midi.channel.channel import MidiChannel
from jdxi_editor.ui.preset.tone.lists import JDXiUIPreset


[docs] class JDXiPresetManager:
[docs] _instance = None
"""Singleton class to manage presets.""" def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(JDXiPresetManager, cls).__new__(cls) return cls._instance def __init__(self) -> None: # --- Initialize tone-related attributes
[docs] self.current_preset_number = 1
[docs] self.current_preset_index = self.current_preset_number - 1
[docs] self.current_preset_name = "Init Tone"
[docs] self.current_preset_names = { JDXiSynth.DIGITAL_SYNTH_1: "Init Tone", JDXiSynth.DIGITAL_SYNTH_2: "Init Tone", JDXiSynth.ANALOG_SYNTH: "Init Tone", JDXiSynth.DRUM_KIT: "Init Tone", }
[docs] self.preset_channel_map = { MidiChannel.ANALOG_SYNTH: JDXiUIPreset.Analog.ENUMERATED, MidiChannel.DIGITAL_SYNTH_1: JDXiUIPreset.Digital.ENUMERATED, MidiChannel.DIGITAL_SYNTH_2: JDXiUIPreset.Digital.ENUMERATED, MidiChannel.DRUM_KIT: JDXiUIPreset.Drum.ENUMERATED, }
[docs] self.preset_synth_map = { JDXiSynth.ANALOG_SYNTH: JDXiUIPreset.Analog.ENUMERATED, JDXiSynth.DIGITAL_SYNTH_1: JDXiUIPreset.Digital.ENUMERATED, JDXiSynth.DIGITAL_SYNTH_2: JDXiUIPreset.Digital.ENUMERATED, JDXiSynth.DRUM_KIT: JDXiUIPreset.Drum.ENUMERATED, }
[docs] def get_preset_name_by_type_and_index( self, synth_type: JDXiSynth, preset_index: int ) -> str: """ Get the name of the currently selected preset :param synth_type: JDXISynth The type of synth :param preset_index: int The index of the preset :return: str The name of the preset """ try: presets = self.preset_synth_map.get( synth_type, JDXiUIPreset.Digital.ENUMERATED ) preset_name = presets[preset_index] log.message(f"preset_name: {preset_name}") return preset_name except IndexError: return "Index Error for current preset"
[docs] def get_presets_for_synth(self, synth: JDXiSynth) -> JDXiUIPreset: """ Get the available presets for the given synth type. :param synth: JDXISynth The type of synth :return: JDXIPresets The available presets """ presets = self.preset_synth_map.get(synth, JDXiUIPreset.Digital.ENUMERATED) return presets
[docs] def get_presets_for_channel(self, channel: MidiChannel) -> JDXiUIPreset: """ Get the available presets for the given channel. :param channel: MidiChannel The MIDI channel :return: JDXIPresets The available presets """ presets = self.preset_channel_map.get(channel, JDXiUIPreset.Digital.ENUMERATED) return presets
[docs] def set_current_preset_name(self, preset_name: str): """ Set the current global tone name. :param preset_name: str The name of the preset """ self.current_preset_name = preset_name self._update_display()
[docs] def set_preset_name_by_type(self, preset_type: str, preset_name: str): """ Set the preset name for a specific tone type. :param preset_type: str The type of preset :param preset_name: str The name of the preset """ if preset_type in self.current_preset_names: self.current_preset_names[preset_type] = preset_name self._update_display()
[docs] def get_preset_name_by_type(self, tone_type: JDXiSynth) -> str: """ Get the tone name for a specific tone type. :param tone_type: JDXISynth The type of tone :return: str The name of the tone """ return self.current_preset_names.get(tone_type, "Unknown Tone")
[docs] def reset_all_presets(self): """Reset all tone names to 'Init Tone'.""" self.current_preset_number = 1 self.current_preset_name = "Init Tone" for tone_type in self.current_preset_names: self.current_preset_names[tone_type] = "Init Tone" self._update_display()
[docs] def _update_display(self): """Update the digital.""" # Implementation for updating the digital pass