Source code for jdxi_editor.core.synth.factory

"""
Synth Factory
"""

from typing import Union

from decologr import Decologr as log

from jdxi_editor.core.synth.analog import AnalogSynthData
from jdxi_editor.core.synth.digital import DigitalSynthData
from jdxi_editor.core.synth.drum import DrumSynthData
from jdxi_editor.core.synth.type import JDXiSynth
from jdxi_editor.midi.channel.channel import MidiChannel
from jdxi_editor.midi.data.address.address import (
    JDXiSysExAddressStartMSB,
    JDXiSysExOffsetProgramLMB,
    JDXiSysExOffsetSuperNATURALLMB,
    JDXiSysExOffsetTemporaryToneUMB,
)
from jdxi_editor.midi.data.parameter.analog.address import AnalogParam
from jdxi_editor.midi.data.parameter.digital import (
    DigitalCommonParam,
    DigitalPartialParam,
)
from jdxi_editor.midi.data.parameter.drum.addresses import DRUM_GROUP_MAP
from jdxi_editor.midi.data.parameter.drum.common import DrumCommonParam
from jdxi_editor.midi.data.parameter.drum.partial import DrumPartialParam
from jdxi_editor.midi.sysex.request.midi_requests import MidiRequests
from jdxi_editor.ui.preset.tone.lists import JDXiUIPreset


[docs] def create_synth_data( synth_type: str, partial_number: int = 0 ) -> Union[AnalogSynthData, DrumSynthData, DigitalSynthData, None]: """ Factory function to create synth data based on the synth type and partial number. :param synth_type: str :param partial_number: int :return: JDXISynthData """ if synth_type == JDXiSynth.DRUM_KIT: address_lmb = DRUM_GROUP_MAP.get(partial_number) return DrumSynthData( midi_requests=MidiRequests.DRUMS_BD1_RIM_BD2_CLAP_BD3, midi_channel=MidiChannel.DRUM_KIT, presets=JDXiUIPreset.Drum.ENUMERATED, preset_list=JDXiUIPreset.Drum.PROGRAM_CHANGE, preset_type=synth_type, instrument_icon_folder="drum_kits", instrument_default_image="drums.png", window_title="Drum Kit", display_prefix="DR", msb=JDXiSysExAddressStartMSB.TEMPORARY_TONE, umb=JDXiSysExOffsetTemporaryToneUMB.DRUM_KIT, lmb=address_lmb, partial_number=partial_number, common_parameters=DrumCommonParam, partial_parameters=DrumPartialParam, ) if synth_type in [JDXiSynth.DIGITAL_SYNTH_1, JDXiSynth.DIGITAL_SYNTH_2]: address_lmb = JDXiSysExOffsetSuperNATURALLMB.digital_partial_offset( partial_number ) if synth_type == JDXiSynth.DIGITAL_SYNTH_1: synth_number = 1 digital_partial_address_umb = ( JDXiSysExOffsetTemporaryToneUMB.DIGITAL_SYNTH_1 ) midi_channel = MidiChannel.DIGITAL_SYNTH_1 midi_requests = MidiRequests.DIGITAL1 elif synth_type == JDXiSynth.DIGITAL_SYNTH_2: synth_number = 2 digital_partial_address_umb = ( JDXiSysExOffsetTemporaryToneUMB.DIGITAL_SYNTH_2 ) midi_channel = MidiChannel.DIGITAL_SYNTH_2 midi_requests = MidiRequests.DIGITAL2 else: # --- Default to Synth 1 synth_type = JDXiSynth.DIGITAL_SYNTH_1 synth_number = 1 digital_partial_address_umb = ( JDXiSysExOffsetTemporaryToneUMB.DIGITAL_SYNTH_1 ) midi_channel = MidiChannel.DIGITAL_SYNTH_1 midi_requests = MidiRequests.DIGITAL1 return DigitalSynthData( midi_requests=midi_requests, midi_channel=midi_channel, presets=JDXiUIPreset.Digital.ENUMERATED, preset_list=JDXiUIPreset.Digital.PROGRAM_CHANGE, preset_type=synth_type, instrument_icon_folder="digital_synths", instrument_default_image="jdxi_vector.png", window_title=f"Digital Synth {synth_number}", display_prefix=f"D{synth_number}", msb=JDXiSysExAddressStartMSB.TEMPORARY_TONE, umb=digital_partial_address_umb, lmb=address_lmb, synth_number=synth_number, partial_number=partial_number, common_parameters=DigitalCommonParam, partial_parameters=DigitalPartialParam, ) elif synth_type == JDXiSynth.ANALOG_SYNTH: return AnalogSynthData( midi_requests=[MidiRequests.PROGRAM_COMMON, MidiRequests.ANALOG], midi_channel=MidiChannel.ANALOG_SYNTH, presets=JDXiUIPreset.Analog.ENUMERATED, preset_list=JDXiUIPreset.Analog.PROGRAM_CHANGE, preset_type=synth_type, instrument_icon_folder="analog_synths", instrument_default_image="analog.png", window_title="Analog Synth", display_prefix="AN", msb=JDXiSysExAddressStartMSB.TEMPORARY_TONE, umb=JDXiSysExOffsetTemporaryToneUMB.ANALOG_SYNTH, lmb=JDXiSysExOffsetProgramLMB.COMMON, common_parameters=AnalogParam, ) else: log.warning(f"synth type: {synth_type} not implemented")