from dataclasses import dataclass, field
from typing import Dict, Optional, Union
from picomidi.constant import Midi
from picomidi.sysex.parameter.address import AddressParameter
from jdxi_editor.jdxi.synth.instrument_display import InstrumentDisplayConfig
from jdxi_editor.jdxi.synth.midi_config import MidiSynthConfig
from jdxi_editor.midi.data.address.address import (
Address,
AddressOffsetProgramLMB,
RolandSysExAddress,
)
from jdxi_editor.midi.data.parameter.analog import AnalogParam
from jdxi_editor.midi.data.parameter.digital import DigitalCommonParam
from jdxi_editor.midi.data.parameter.drum.common import DrumCommonParam
@dataclass
[docs]
class JDXISynthData(MidiSynthConfig, InstrumentDisplayConfig):
"""Synth Data"""
[docs]
address: RolandSysExAddress = field(init=False)
[docs]
common_parameters: Optional[
Union[DrumCommonParam, AnalogParam, DigitalCommonParam]
] = None
[docs]
def __post_init__(self) -> None:
"""Post Init"""
self.address = RolandSysExAddress(
msb=self.msb, umb=self.umb, lmb=self.lmb, lsb=Midi.VALUE.ZERO
)
@property
[docs]
def group_map(self) -> Dict[int, Address]:
"""
Group Map
:return: Dict[int, AddressOffsetProgramLMB] The group map
Default: Only common address (override in subclasses).
"""
return {0: AddressOffsetProgramLMB.COMMON}
[docs]
def get_partial_lmb(self, partial_number: int) -> AddressOffsetProgramLMB:
"""
Resolve the address for a given partial number.
:param partial_number: int The partial number
:return: AddressOffsetProgramLMB The address offset
"""
return self.group_map.get(partial_number, AddressOffsetProgramLMB.COMMON)