Source code for jdxi_editor.midi.data.digital.oscillator
"""Digital Oscillator"""
from enum import Enum, IntEnum
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,
)
[docs]
class DigitalOscWave(IntEnum):
"""Oscillator waveform types"""
@property
[docs]
def display_name(self) -> str:
"""Get display name for the waveform"""
return {
self.SAW: "SAW",
self.SQUARE: "SQR",
self.PW_SQUARE: "PWM",
self.TRIANGLE: "TRI",
self.SINE: "SINE",
self.NOISE: "NOISE",
self.SUPER_SAW: "S-SAW",
self.PCM: "PCM",
}[self]
@property
[docs]
def description(self) -> str:
"""Get full description of the waveform"""
return {
self.SAW: "Sawtooth",
self.SQUARE: "Square",
self.PW_SQUARE: "Pulse Width Square",
self.TRIANGLE: "Triangle",
self.SINE: "Sine",
self.NOISE: "Noise",
self.SUPER_SAW: "Super Saw",
self.PCM: "PCM Wave",
}[self]
[docs]
class DigitalWaveform(Enum):
"""Waveform types available on the JD-Xi"""
@property
[docs]
def display_name(self) -> str:
"""Get display 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}")