Source code for pyflp.controller

# PyFLP - An FL Studio project file (.flp) parser
# Copyright (C) 2022 demberto
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version. This program is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details. You should have received a copy of the
# GNU General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.

"""Contains the types used by MIDI and remote ("internal") controllers."""

from __future__ import annotations

import enum
from typing import cast

import construct as c

from pyflp._events import DATA, EventEnum, StructEventBase
from pyflp._models import EventModel, ModelReprMixin

__all__ = ["RemoteController"]


class MIDIControllerEvent(StructEventBase):
    STRUCT = c.Struct("_u1" / c.GreedyBytes)


class RemoteControllerEvent(StructEventBase):
    STRUCT = c.Struct(
        "_u1" / c.Optional(c.Bytes(2)),  # 2
        "_u2" / c.Optional(c.Byte),  # 3
        "_u3" / c.Optional(c.Byte),  # 4
        "parameter_data" / c.Optional(c.Int16ul),  # 6
        "destination_data" / c.Optional(c.Int16sl),  # 8
        "_u4" / c.Optional(c.Bytes(8)),  # 16
        "_u5" / c.Optional(c.Bytes(4)),  # 20
    ).compile()


[docs]@enum.unique class ControllerID(EventEnum): MIDI = (DATA + 18, MIDIControllerEvent) Remote = (DATA + 19, RemoteControllerEvent)
[docs]class RemoteController(EventModel, ModelReprMixin): """![](https://bit.ly/3S0i4Zf) *New in FL Studio v3.3.0*. """ @property def parameter(self) -> int | None: """The ID of the plugin parameter to which controller is linked to.""" if ( value := cast(StructEventBase, self.events.first(ControllerID.Remote))["parameter_data"] is not None ): return value & 0x7FFF @property def controls_vst(self) -> bool | None: """Whether `parameter` is linked to a VST plugin. None when linked to a plugin parameter on an insert slot. """ if ( value := cast(StructEventBase, self.events.first(ControllerID.Remote))["parameter_data"] is not None ): return (value & 0x8000) > 0