Source code for jdxi_editor.midi.data.digital.oscillator

"""
Digital Oscillator
"""

from enum import Enum, IntEnum

from jdxi_editor.midi.data.base.oscillator import OscillatorWidgetTypes
from jdxi_editor.midi.wave.form import (
    OSC_WAVE_NOISE,
    OSC_WAVE_PCM,
    OSC_WAVE_SAW,
    OSC_WAVE_SINE,
    OSC_WAVE_SQUARE,
    OSC_WAVE_SUPER_SAW,
    OSC_WAVE_TRIANGLE,
    Waveform,
)
from jdxi_editor.midi.wave.spec import WaveOscBehavior


[docs] class DigitalOscPcmWaveGain(IntEnum): """Wave gain values in dB"""
[docs] DB_MINUS_6 = 0 # -6 dB
[docs] DB_0 = 1 # 0 dB
[docs] DB_PLUS_6 = 2 # +6 dB
[docs] DB_PLUS_12 = 3 # +12 dB
[docs] class WaveShape: """Types of Digital Oscillator Waves"""
[docs] ADSR: str = "adsr"
[docs] UPSAW: str = "upsaw"
[docs] SQUARE: str = "square"
[docs] PWSQU: str = "pwsqu"
[docs] TRIANGLE: str = "triangle"
[docs] SINE: str = "sine"
[docs] SAW: str = "saw"
[docs] SPSAW: str = "spsaw"
[docs] PCM: str = "pcm"
[docs] NOISE: str = "noise"
[docs] LPF_FILTER: str = "lpf_filter"
[docs] HPF_FILTER: str = "hpf_filter"
[docs] BYPASS_FILTER: str = "bypass_filter"
[docs] BPF_FILTER: str = "bpf_filter"
[docs] FILTER_SINE: str = "filter_sine"
[docs] class WaveForm: """Types of Digital Oscillator Waves"""
[docs] ADSR: str = "ADSR"
[docs] UPSAW: str = "UpSaw"
[docs] SQUARE: str = "Square"
[docs] PWSQU: str = "PWSqu"
[docs] TRIANGLE: str = "Triangle"
[docs] SINE: str = "Sine"
[docs] SAW: str = "Saw"
[docs] SPSAW: str = "Sp-Saw"
[docs] PCM: str = "PCM"
[docs] NOISE: str = "Noise"
[docs] LPF_FILTER: str = "LPF Filter"
[docs] HPF_FILTER: str = "HPF Filter"
[docs] BYPASS_FILTER: str = "ByPass Filter"
[docs] BPF_FILTER: str = "Band Pass Filter"
[docs] FILTER_SINE: str = "Filter Sine"
[docs] class DigitalWaveOsc(WaveOscBehavior, IntEnum): """Oscillator waveform types"""
[docs] SAW = 0
[docs] SQUARE = 1
[docs] PW_SQUARE = 2 # Pulse Width Square
[docs] TRI = 3
[docs] SINE = 4
[docs] NOISE = 5
[docs] SUPER_SAW = 6
[docs] PCM = 7
[docs] class DigitalWaveform(Enum): """Waveform types available on the JD-Xi"""
[docs] SAW = 0x00 # Sawtooth wave
[docs] SQUARE = 0x01 # Square wave
[docs] PW_SQUARE = 0x02 # Pulse width square wave
[docs] TRIANGLE = 0x03 # Triangle wave
[docs] SINE = 0x04 # Sine wave
[docs] NOISE = 0x05 # Noise
[docs] SUPER_SAW = 0x06 # Super saw
[docs] PCM = 0x07 # PCM waveform
@property
[docs] def display_name(self) -> str: """Get digital name for waveform""" names = { DigitalWaveform.SAW: "SAW", DigitalWaveform.SQUARE: "SQR", DigitalWaveform.PW_SQUARE: "PW.SQR", DigitalWaveform.TRIANGLE: "TRI", DigitalWaveform.SINE: "SIN", DigitalWaveform.NOISE: "NOISE", DigitalWaveform.SUPER_SAW: "S.SAW", DigitalWaveform.PCM: "PCM", } return names[self]
@property
[docs] def midi_value(self) -> int: """Get MIDI value for waveform""" values = { Waveform.SAW: OSC_WAVE_SAW, Waveform.SQUARE: OSC_WAVE_SQUARE, Waveform.TRIANGLE: OSC_WAVE_TRIANGLE, Waveform.SINE: OSC_WAVE_SINE, Waveform.NOISE: OSC_WAVE_NOISE, Waveform.SUPER_SAW: OSC_WAVE_SUPER_SAW, Waveform.PCM: OSC_WAVE_PCM, } return values[self]
@classmethod
[docs] def from_midi_value(cls, value: int) -> Waveform: """Create Waveform from MIDI value""" for waveform in cls: if waveform.midi_value == value: return waveform raise ValueError(f"Invalid waveform value: {value}")
[docs] class DigitalOscillatorWidgetTypes(OscillatorWidgetTypes): """Base class for Oscillator Widgets"""
[docs] PCM_WAVE: str = "pcm_wave"
[docs] PCM_WAVE_GAIN: str = "pcm_wave_gain"
[docs] PCM_WAVE_NUMBER: str = "pcm_wave_number"
[docs] SUPER_SAW_DETUNE: str = "super_saw_detune"