Source code for pyflp.timemarker
# 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 required for pattern and playlist timemarkers."""
from __future__ import annotations
import enum
from pyflp._descriptors import EventProp
from pyflp._events import DWORD, TEXT, EventEnum, U8Event, U32Event
from pyflp._models import EventModel, ModelReprMixin
__all__ = ["TimeMarkerID", "TimeMarkerType", "TimeMarker"]
[docs]@enum.unique
class TimeMarkerID(EventEnum):
Numerator = (33, U8Event)
Denominator = (34, U8Event)
Position = (DWORD + 20, U32Event)
Name = TEXT + 13
[docs]class TimeMarkerType(enum.IntEnum):
Marker = 0
"""Normal text marker."""
Signature = 134217728
"""Used for time signature markers."""
[docs]class TimeMarker(EventModel, ModelReprMixin):
"""A marker in the timeline of an :class:`Arrangement`.
![](https://bit.ly/3gltKbt)
"""
def __str__(self) -> str:
if self.type == TimeMarkerType.Marker:
if self.name:
return f"Marker {self.name!r} @ {self.position!r}"
return f"Unnamed marker @ {self.position!r}"
time_sig = f"{self.numerator}/{self.denominator}"
if self.name:
return f"Signature {self.name!r} ({time_sig}) @ {self.position!r}"
return f"Unnamed {time_sig} signature @ {self.position!r}"
denominator: EventProp[int] = EventProp[int](TimeMarkerID.Denominator)
name = EventProp[str](TimeMarkerID.Name)
numerator = EventProp[int](TimeMarkerID.Numerator)
@property
def position(self) -> int | None:
if TimeMarkerID.Position in self.events.ids:
event = self.events.first(TimeMarkerID.Position)
if event.value < TimeMarkerType.Signature:
return event.value
return event.value - TimeMarkerType.Signature
@property
def type(self) -> TimeMarkerType | None:
"""The action with which a time marker is associated.
[![](https://bit.ly/3RDM1yn)]()
"""
if TimeMarkerID.Position in self.events.ids:
event = self.events.first(TimeMarkerID.Position)
if event.value >= TimeMarkerType.Signature:
return TimeMarkerType.Signature
return TimeMarkerType.Marker