"""
Digital Spec File
"""
from enum import Enum
from typing import Any, Protocol
from jdxi_editor.midi.data.digital import DigitalWaveOsc
from jdxi_editor.midi.data.digital.filter import (
DigitalFilterMode,
DigitalFilterModeType,
DigitalFilterType,
)
from jdxi_editor.midi.data.digital.lfo import DigitalLFOShape
from jdxi_editor.midi.data.digital.oscillator import WaveForm
from jdxi_editor.midi.data.parameter.base.spec import (
AmpSpec,
DisplaySpec,
FilterSpec,
MidiSynthSpec,
WaveSpec,
)
from jdxi_editor.midi.data.parameter.digital import (
DigitalCommonParam,
DigitalModifyParam,
DigitalPartialParam,
)
from jdxi_editor.midi.data.parameter.digital.name import DigitalDisplayName
from jdxi_editor.midi.data.parameter.digital.option import DigitalDisplayOptions
from jdxi_editor.midi.data.parameter.digital.tone_modify import (
DigitalModifyNames,
DigitalModifyOptions,
)
from jdxi_editor.midi.data.parameter.digital.values import DigitalDisplayValues
from jdxi_editor.ui.adsr.type import ADSRType
from jdxi_editor.ui.style import JDXiUIIconRegistry
[docs]
class DigitalGroup:
"""Digital GroupBox Name Definitions"""
[docs]
class TabKey(Protocol):
"""tab ley"""
@property
[docs]
def label(self) -> str: ...
@property
[docs]
def icon(self) -> str: ...
@property
[docs]
def attr_name(self) -> str: ...
[docs]
class TabDefinitionMixin:
"""Tab Widget Definition"""
@property
[docs]
def attr_name(self) -> str:
return f"{self.key}_tab"
[docs]
class GroupBoxDefinitionMixin:
"""Group Box Widget Definition"""
@property
[docs]
def attr_name(self) -> str:
return f"{self.key}_group"
[docs]
class DigitalTab(TabDefinitionMixin, Enum):
"""Definition of Digital Editor-Level Tabs"""
[docs]
PRESETS = ("presets", "Presets", JDXiUIIconRegistry.MUSIC_NOTE_MULTIPLE)
[docs]
PARTIAL_1 = ("partial_1", "Partial 1", "mdi.numeric-1-circle-outline")
[docs]
PARTIAL_2 = ("partial_2", "Partial 2", "mdi.numeric-2-circle-outline")
[docs]
PARTIAL_3 = ("partial_3", "Partial 3", "mdi.numeric-3-circle-outline")
[docs]
COMMON = ("common", "Common", JDXiUIIconRegistry.COG_OUTLINE)
[docs]
MISC = ("misc", "Misc", JDXiUIIconRegistry.DOTS_HORIZONTAL)
[docs]
OSCILLATOR = ("oscillator", "Oscillator", JDXiUIIconRegistry.Wave.Icon.TRIANGLE)
[docs]
FILTER = ("filter", "Filter", JDXiUIIconRegistry.FILTER)
[docs]
AMP = ("amp", "Amp", JDXiUIIconRegistry.AMPLIFIER)
[docs]
LFO = ("lfo", "LFO", JDXiUIIconRegistry.Wave.Icon.SINE)
[docs]
MODLFO = ("mod_lfo", "Mod LFO", JDXiUIIconRegistry.Wave.Icon.WAVEFORM)
def __init__(self, key: str, label: str, icon: Any):
[docs]
class DigitalLFOTab(TabDefinitionMixin, Enum):
"""Definition of Digital LFO Section Tabs"""
[docs]
RATE = ("rate", "Rate", JDXiUIIconRegistry.CLOCK)
[docs]
DEPTHS = ("depths", "Depths", JDXiUIIconRegistry.Wave.Icon.WAVEFORM)
def __init__(self, key: str, label: str, icon: Any):
[docs]
class DigitalLFO:
"""Digital LFO"""
[docs]
Shape: DigitalLFOShape = DigitalLFOShape
[docs]
Tab: DigitalLFOTab = DigitalLFOTab
[docs]
class DigitalFilterTab(TabDefinitionMixin, Enum):
"""Definition of Digital Filter Section Tabs"""
[docs]
CONTROLS = ("controls", "Controls", JDXiUIIconRegistry.TUNE)
[docs]
ADSR = ("adsr", "ADSR", WaveForm.ADSR)
def __init__(self, key: str, label: str, icon: Any):
[docs]
class DigitalAmpTab(TabDefinitionMixin, Enum):
"""Definition of Digital Amp Section Tabs"""
[docs]
CONTROLS = ("controls", "Controls", JDXiUIIconRegistry.TUNE)
[docs]
ADSR = ("adsr", "ADSR", WaveForm.ADSR)
def __init__(self, key: str, label: str, icon: Any):
[docs]
class DigitalOscillatorTab(TabDefinitionMixin, Enum):
"""Definition of Digital Oscillator Section Tabs"""
[docs]
TUNING = ("tuning", "Tuning", JDXiUIIconRegistry.TUNE)
[docs]
PULSE_WIDTH = ("pulse_width", "Pulse Width", WaveForm.SQUARE)
[docs]
PITCH = ("pitch_env", "Pitch Env", WaveForm.ADSR)
[docs]
PCM = ("pcm", "PCM", WaveForm.PCM)
[docs]
ADSR = ("adsr", "ADSR", WaveForm.ADSR)
def __init__(self, key: str, label: str, icon: Any):
[docs]
class DigitalGroupBox(GroupBoxDefinitionMixin, Enum):
"""Definition of Digital Group Boxes"""
[docs]
ENVELOPE = ("envelope", "Envelope")
[docs]
PULSE_WIDTH = ("pulse_width", "Pulse Width")
[docs]
PITCH_ENVELOPE = ("pitch_envelope", "Pitch Envelope")
[docs]
PCM_WAVE = ("pcm_wave", "PCM Wave")
[docs]
TUNING = ("tuning", "Tuning")
[docs]
CONTROLS = ("controls", "Controls")
[docs]
COMMON = ("common", "Common")
def __init__(self, key: str, label: str):
[docs]
class DigitalAmp(AmpSpec):
"""Digital Amp"""
[docs]
ADSR: ADSRType = ADSRType
[docs]
Tab: DigitalAmpTab = DigitalAmpTab
[docs]
class DigitalFilter(FilterSpec):
"""Digital Filter"""
[docs]
Mode: DigitalFilterMode = DigitalFilterMode
[docs]
ModeType: DigitalFilterModeType = DigitalFilterModeType
[docs]
FilterType: DigitalFilterType = DigitalFilterType
[docs]
ADSR: ADSRType = ADSRType
[docs]
Tab: DigitalFilterTab = DigitalFilterTab
[docs]
class DigitalWave(WaveSpec):
"""Digital Wave"""
[docs]
LFO: DigitalLFOShape = DigitalLFOShape
[docs]
Osc: DigitalWaveOsc = DigitalWaveOsc
[docs]
SubOsc = None # No sub-oscillator for the digital synth
[docs]
WaveType: WaveForm = WaveForm
[docs]
Tab: DigitalOscillatorTab = DigitalOscillatorTab
[docs]
OscillatorTab: DigitalOscillatorTab = DigitalOscillatorTab # Alias for clarity
[docs]
class DigitalToneModifyDisplay(DisplaySpec):
"""Digital Tone Modify Display names and options"""
[docs]
Names: DigitalModifyNames = DigitalModifyNames
[docs]
Options: DigitalModifyOptions = DigitalModifyOptions
[docs]
class DigitalDisplay(DisplaySpec):
"""Digital Display class"""
[docs]
Name: DigitalDisplayName = DigitalDisplayName
[docs]
Options: DigitalDisplayOptions = DigitalDisplayOptions
[docs]
Values: DigitalDisplayValues = DigitalDisplayValues
[docs]
class JDXiMidiDigital(MidiSynthSpec):
"""Digital Spec Class"""
[docs]
Param: DigitalPartialParam = DigitalPartialParam
[docs]
Common: DigitalCommonParam = DigitalCommonParam
[docs]
Display: DigitalDisplay = DigitalDisplay
[docs]
ModifyParam: DigitalModifyParam = DigitalModifyParam
[docs]
ModifyDisplay: DigitalToneModifyDisplay = DigitalToneModifyDisplay
[docs]
Wave: DigitalWave = DigitalWave
[docs]
Filter: DigitalFilter = DigitalFilter
[docs]
LFO: DigitalLFO = DigitalLFO
[docs]
Amp: DigitalAmp = DigitalAmp
[docs]
Tab: DigitalTab = DigitalTab
[docs]
GroupBox: DigitalGroupBox = DigitalGroupBox