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

"""
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] self.key = key
[docs] self.label = label
[docs] self.icon = icon
[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] self.key = key
[docs] self.label = label
[docs] self.icon = icon
[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] self.key = key
[docs] self.label = label
[docs] self.icon = icon
[docs] class AnalogFilterMode(Enum): """Filter mode types"""
[docs] BYPASS = 0x00
[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] self.key = key
[docs] self.label = label
[docs] self.icon = icon
[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] self.key = key
[docs] self.label = label
[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