Source code for jdxi_editor.midi.data.parameter.digital.spec

"""
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] ADSR: str = "Envelope"
[docs] PWM: str = "PWM"
[docs] TUNING: str = "Tuning"
[docs] class TabKey(Protocol): """tab ley"""
[docs] value: str
@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"""
[docs] key: str
[docs] label: str
[docs] icon: Any
@property
[docs] def attr_name(self) -> str: return f"{self.key}_tab"
[docs] class GroupBoxDefinitionMixin: """Group Box Widget Definition"""
[docs] key: str
[docs] label: str
@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] self.key = key
[docs] self.label = label
[docs] self.icon = icon
[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] self.key = key
[docs] self.label = label
[docs] self.icon = icon
[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] self.key = key
[docs] self.label = label
[docs] self.icon = icon
[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] self.key = key
[docs] self.label = label
[docs] self.icon = icon
[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] self.key = key
[docs] self.label = label
[docs] self.icon = icon
[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] self.key = key
[docs] self.label = label
[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