"""
Analog Spec File
"""
from enum import Enum
from typing import Any
from jdxi_editor.midi.data.analog.filter import (
AnalogFilterType,
AnalogFilterTypeString,
)
from jdxi_editor.midi.data.analog.lfo import AnalogLFOWaveShape
from jdxi_editor.midi.data.analog.oscillator import AnalogSubOscType, AnalogWaveOsc
from jdxi_editor.midi.data.control_change.analog import AnalogControlChange, AnalogRPN
from jdxi_editor.midi.data.digital.oscillator import WaveForm
from jdxi_editor.midi.data.parameter.analog.address import AnalogParam
from jdxi_editor.midi.data.parameter.analog.name import AnalogDisplayName
from jdxi_editor.midi.data.parameter.analog.option import AnalogDisplayOptions
from jdxi_editor.midi.data.parameter.analog.values import AnalogDisplayValues
from jdxi_editor.midi.data.parameter.base.filter_mode import FilterModeType
from jdxi_editor.midi.data.parameter.base.spec import (
AmpSpec,
DisplaySpec,
FilterSpec,
MidiSynthSpec,
WaveSpec,
)
from jdxi_editor.midi.data.parameter.digital.spec import (
GroupBoxDefinitionMixin,
TabDefinitionMixin,
)
from jdxi_editor.ui.adsr.type import ADSRType
from jdxi_editor.ui.style import JDXiUIIconRegistry
[docs]
class AnalogTab(TabDefinitionMixin, Enum):
"""Analog tab class"""
[docs]
PRESETS = ("presets", "Presets", JDXiUIIconRegistry.MUSIC_NOTE_MULTIPLE)
[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]
COMMON = ("common", "Common", JDXiUIIconRegistry.COG_OUTLINE)
def __init__(self, key: str, label: str, icon: Any):
[docs]
class AnalogFilterTab(TabDefinitionMixin, Enum):
"""Definition of Analog 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 AnalogAmpTab(TabDefinitionMixin, Enum):
"""Definition of Analog 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 AnalogFilterMode(Enum):
"""Filter mode types"""
[docs]
LPF = 0x01 # Low-pass filter
@property
[docs]
def display_name(self) -> str:
"""Get digital name for filter mode"""
names = {
0: "BYPASS",
1: "LPF",
}
return names.get(self.value, "???")
[docs]
class AnalogOscillatorTab(TabDefinitionMixin, Enum):
"""Definition of Analog Oscillator Section Tabs"""
[docs]
PITCH = ("pitch", "Pitch", JDXiUIIconRegistry.MUSIC_NOTE)
[docs]
TUNING = ("tuning", "Tuning", JDXiUIIconRegistry.MUSIC_NOTE)
[docs]
PULSE_WIDTH = ("pulse_width", "Pulse Width", WaveForm.SQUARE)
def __init__(self, key: str, label: str, icon: Any):
[docs]
class AnalogAmp(AmpSpec):
"""Analog Amp"""
[docs]
ADSR: ADSRType = ADSRType
[docs]
Tab: AnalogAmpTab = AnalogAmpTab
[docs]
class AnalogFilterModeType(FilterModeType):
"""Analog FilterModeType has only bypass and lpf"""
pass
[docs]
class AnalogFilter(FilterSpec):
"""Analog Filter"""
[docs]
FilterType: AnalogFilterType = AnalogFilterType
[docs]
FilterTypeString: AnalogFilterTypeString = AnalogFilterTypeString
[docs]
Mode: AnalogFilterMode = (
AnalogFilterMode # Alias so base can use SYNTH_SPEC.Filter.Mode
)
[docs]
ModeType: AnalogFilterModeType = AnalogFilterModeType
[docs]
ADSR: ADSRType = ADSRType
[docs]
Tab: AnalogFilterTab = AnalogFilterTab
[docs]
class AnalogGroupBox(GroupBoxDefinitionMixin, Enum):
"""Definition of Analog Group Boxes"""
[docs]
ENVELOPE = ("envelope", "Envelope")
[docs]
PULSE_WIDTH = ("pulse_width", "Pulse Width")
[docs]
PITCH_ENVELOPE = ("pitch_envelope", "Pitch Envelope")
[docs]
TUNING = ("tuning", "Tuning")
[docs]
CONTROLS = ("controls", "Controls")
[docs]
COMMON = ("common", "Common")
def __init__(self, key: str, label: str):
[docs]
class AnalogWave(WaveSpec):
"""Analog Wave"""
[docs]
LFO: AnalogLFOWaveShape = AnalogLFOWaveShape
[docs]
Osc: AnalogWaveOsc = AnalogWaveOsc
[docs]
SubOsc: AnalogSubOscType = AnalogSubOscType
[docs]
WaveType: WaveForm = WaveForm
[docs]
Tab: AnalogOscillatorTab = AnalogOscillatorTab
[docs]
class AnalogDisplay(DisplaySpec):
"""Analog Display class"""
[docs]
Name: AnalogDisplayName = AnalogDisplayName
[docs]
Values: AnalogDisplayValues = AnalogDisplayOptions
[docs]
Options: AnalogDisplayOptions = AnalogDisplayOptions
[docs]
class AnalogLFO:
"""Digital LFO"""
[docs]
Shape: AnalogLFOWaveShape = AnalogLFOWaveShape
[docs]
Tab = None # Analog LFO has no Tabs
[docs]
class JDXiMidiAnalog(MidiSynthSpec):
"""Analog Class"""
[docs]
Param: AnalogParam = AnalogParam
[docs]
Display: AnalogDisplay = AnalogDisplay
[docs]
Wave: AnalogWave = AnalogWave
[docs]
Filter: AnalogFilter = AnalogFilter
[docs]
Amp: AnalogAmp = AnalogAmp
[docs]
Tab: AnalogTab = AnalogTab
[docs]
GroupBox: AnalogGroupBox = AnalogGroupBox
[docs]
ControlChange: AnalogControlChange = AnalogControlChange
[docs]
RPN: AnalogRPN = AnalogRPN
[docs]
LFO: AnalogLFO = AnalogLFO