"""
MOD LFO section of the digital partial editor.
"""
from typing import Callable
from PySide6.QtWidgets import QGroupBox, QHBoxLayout, QTabWidget, QVBoxLayout, QWidget
from jdxi_editor.jdxi.style import JDXiStyle
from jdxi_editor.midi.data.parameter.digital.partial import (
DigitalPartialParam,
)
from jdxi_editor.ui.windows.jdxi.dimensions import JDXiDimensions
[docs]
class DigitalModLFOSection(QWidget):
"""MOD LFO section for the digital partial editor."""
def __init__(
self,
create_parameter_slider: Callable,
create_parameter_combo_box: Callable,
on_parameter_changed: Callable,
controls: dict,
):
super().__init__()
"""
Initialize the DigitalModLFOSection
:param create_parameter_slider: Callable
:param create_parameter_combo_box: Callable
:param on_parameter_changed: Callable
:param controls: dict
"""
[docs]
self._create_parameter_slider = create_parameter_slider
[docs]
self._create_parameter_combo_box = create_parameter_combo_box
[docs]
self._on_parameter_changed = on_parameter_changed
[docs]
self.controls = controls
self.setStyleSheet(JDXiStyle.ADSR)
self._init_ui()
[docs]
def _init_ui(self):
mod_lfo_layout = QVBoxLayout()
self.setLayout(mod_lfo_layout)
# Shape and sync controls
shape_row_layout = QHBoxLayout()
shape_row_layout.addStretch()
self.mod_lfo_shape = self._create_parameter_combo_box(
DigitalPartialParam.MOD_LFO_SHAPE,
"Shape",
["TRI", "SIN", "SAW", "SQR", "S&H", "RND"],
)
shape_row_layout.addWidget(self.mod_lfo_shape)
self.mod_lfo_sync = self._create_parameter_combo_box(
DigitalPartialParam.MOD_LFO_TEMPO_SYNC_SWITCH,
"Sync",
["OFF", "ON"],
)
shape_row_layout.addWidget(self.mod_lfo_sync)
self.mod_lfo_note = self._create_parameter_combo_box(
DigitalPartialParam.MOD_LFO_TEMPO_SYNC_NOTE,
"Note",
["1/1", "1/2", "1/4", "1/8", "1/16"],
)
shape_row_layout.addWidget(self.mod_lfo_note)
shape_row_layout.addStretch()
mod_lfo_layout.addLayout(shape_row_layout)
# Create tab widget for Rate/Rate Ctrl and Depths
mod_lfo_controls_tab_widget = QTabWidget()
mod_lfo_layout.addWidget(mod_lfo_controls_tab_widget)
# --- Rate and Rate Ctrl Controls Tab ---
rate_widget = QWidget()
rate_layout = QHBoxLayout()
rate_layout.addStretch()
rate_widget.setLayout(rate_layout)
rate_widget.setMinimumHeight(JDXiDimensions.EDITOR_MINIMUM_HEIGHT)
# Rate and Rate Ctrl controls
rate_layout.addWidget(
self._create_parameter_slider(
DigitalPartialParam.MOD_LFO_RATE, "Rate", vertical=True
)
)
rate_layout.addWidget(
self._create_parameter_slider(
DigitalPartialParam.MOD_LFO_RATE_CTRL, "Rate Ctrl", vertical=True
)
)
rate_layout.addStretch()
mod_lfo_controls_tab_widget.addTab(rate_widget, "Rate and Rate Ctrl")
# --- Depths Tab ---
depths_widget = QWidget()
depths_layout = QHBoxLayout()
depths_layout.addStretch()
depths_widget.setLayout(depths_layout)
depths_widget.setMinimumHeight(JDXiDimensions.EDITOR_MINIMUM_HEIGHT)
depths_layout.addWidget(
self._create_parameter_slider(
DigitalPartialParam.MOD_LFO_PITCH_DEPTH, "Pitch", vertical=True
)
)
depths_layout.addWidget(
self._create_parameter_slider(
DigitalPartialParam.MOD_LFO_FILTER_DEPTH, "Filter", vertical=True
)
)
depths_layout.addWidget(
self._create_parameter_slider(
DigitalPartialParam.MOD_LFO_AMP_DEPTH, "Amp", vertical=True
)
)
depths_layout.addWidget(
self._create_parameter_slider(
DigitalPartialParam.MOD_LFO_PAN, "Pan", vertical=True
)
)
depths_layout.addStretch()
mod_lfo_controls_tab_widget.addTab(depths_widget, "Depths")
mod_lfo_layout.addStretch()