jdxi_editor.ui.editors.base.lfo =============================== .. py:module:: jdxi_editor.ui.editors.base.lfo Submodules ---------- .. toctree:: :maxdepth: 1 /autoapi/jdxi_editor/ui/editors/base/lfo/behavior/index /autoapi/jdxi_editor/ui/editors/base/lfo/group/index /autoapi/jdxi_editor/ui/editors/base/lfo/layout/index /autoapi/jdxi_editor/ui/editors/base/lfo/section/index /autoapi/jdxi_editor/ui/editors/base/lfo/widgets/index Classes ------- .. autoapisummary:: jdxi_editor.ui.editors.base.lfo.LFOBehavior jdxi_editor.ui.editors.base.lfo.LFOGroup jdxi_editor.ui.editors.base.lfo.LFOSliderGroup jdxi_editor.ui.editors.base.lfo.LFOSwitchGroup jdxi_editor.ui.editors.base.lfo.BaseLFOSection Package Contents ---------------- .. py:class:: LFOBehavior Bases: :py:obj:`Protocol` Base class for protocol classes. Protocol classes are defined as:: class Proto(Protocol): def meth(self) -> int: ... Such classes are primarily used with static type checkers that recognize structural subtyping (static duck-typing), for example:: class C: def meth(self) -> int: return 0 def func(x: Proto) -> int: return x.meth() func(C()) # Passes static type check See PEP 544 for details. Protocol classes decorated with @typing.runtime_checkable act as simple-minded runtime protocols that check only the presence of given attributes, ignoring their type signatures. Protocol classes can be generic, they are defined as:: class GenProto(Protocol[T]): def meth(self) -> T: ... .. py:method:: build_widgets() -> None .. py:method:: setup_ui() -> None .. py:class:: LFOGroup LFO Groups .. py:attribute:: label :type: str :value: 'LFO' .. py:attribute:: slider :type: LFOSliderGroup .. py:attribute:: switch :type: LFOSwitchGroup .. py:attribute:: combo :type: None .. py:class:: LFOSliderGroup Slider Group .. py:attribute:: DEPTH :type: str :value: 'depth' .. py:attribute:: RATE_FADE :type: str :value: 'rate_fade' .. py:class:: LFOSwitchGroup LFO Switch Group .. py:attribute:: SWITCH_ROW :type: str :value: 'switch_row_widgets' .. py:class:: BaseLFOSection(icons_row_type: str = IconType.ADSR, analog: bool = False, send_midi_parameter: Callable = None, address: jdxi_editor.midi.data.address.address.JDXiSysExAddress = None, midi_helper: jdxi_editor.midi.io.helper.MidiIOHelper = None) Bases: :py:obj:`jdxi_editor.ui.widgets.editor.section_base.SectionBaseWidget` Abstract base class for LFO sections. All LFOs (Analog, Digital, Mod) use _create_shape_row() for exclusive wave shape selection. .. py:attribute:: SKIP_BASE_SETUP_UI :value: True .. py:attribute:: SYNTH_SPEC :type: jdxi_editor.midi.data.parameter.digital.spec.JDXiMidiDigital | jdxi_editor.midi.data.parameter.analog.spec.JDXiMidiAnalog :value: None .. py:attribute:: rate_tab_label :type: str :value: 'Rate' .. py:attribute:: depths_tab_label :type: str :value: 'Depths' .. py:attribute:: widgets :type: jdxi_editor.ui.editors.base.lfo.widgets.LFOWidgets | None :value: None .. py:attribute:: wave_shape_param :type: list | None :value: None .. py:attribute:: send_midi_parameter :type: Callable | None :value: None Send MIDI parameter with error handling :param address: RolandSysExAddress :param param: AddressParameter the parameter to send :param value: int value to send :return: bool True on success, False otherwise .. py:attribute:: wave_shapes .. py:attribute:: lfo_shape_buttons :type: dict[int, PySide6.QtWidgets.QPushButton] .. py:method:: generate_mode_button_specs() -> list generate_mode_button_specs, was generate_wave_shapes .. py:method:: _setup_ui() Main construction pipeline .. py:method:: build_widgets() Build LFO widgets (switches, depth, rate). Shape row is created in _setup_ui() via _create_shape_row(), not _create_waveform_buttons(). .. py:method:: _build_widgets() -> jdxi_editor.ui.editors.base.lfo.widgets.LFOWidgets Create widgets from SLIDER_GROUPS['controls'] (sliders, switches, combos). .. py:method:: _build_analog_layout(layout) .. py:method:: _build_digital_layout(layout) .. py:method:: _build_layout_spec() Build layout spec