Source code for mutwo.parameters.tempos
"""Submodule for the parameter tempo.
"""
import typing
from mutwo import parameters
from mutwo.utilities import constants
__all__ = ("TempoPoint",)
TempoInBeatsPerMinute = float
TempoRangeInBeatsPerMinute = typing.Tuple[TempoInBeatsPerMinute, TempoInBeatsPerMinute]
TempoOrTempoRangeInBeatsPerMinute = typing.Union[
TempoInBeatsPerMinute, TempoRangeInBeatsPerMinute
]
[docs]class TempoPoint(parameters.abc.Parameter):
def __init__(
self,
tempo_or_tempo_range_in_beats_per_minute: TempoOrTempoRangeInBeatsPerMinute,
reference: constants.Real = 1,
textual_indication: typing.Optional[str] = None,
):
self.tempo_or_tempo_range_in_beats_per_minute = (
tempo_or_tempo_range_in_beats_per_minute
)
self.reference = reference
self.textual_indication = textual_indication
def __repr__(self) -> str:
return "{}(BPM: {}, reference: {})".format(
type(self).__name__, self.tempo_in_beats_per_minute, self.reference
)
def __eq__(self, other: object) -> bool:
attributes_to_compare = (
"tempo_in_beats_per_minute",
"reference",
"textual_indication",
)
try:
comparision_tuple = tuple(
getattr(other, attribute) for attribute in attributes_to_compare
)
except AttributeError:
return False
return all(
tuple(
getattr(self, attribute) == value_of_other
for attribute, value_of_other in zip(
attributes_to_compare, comparision_tuple
)
)
)
@property
def tempo_in_beats_per_minute(self) -> TempoInBeatsPerMinute:
if isinstance(self.tempo_or_tempo_range_in_beats_per_minute, tuple):
return self.tempo_or_tempo_range_in_beats_per_minute[0]
else:
return self.tempo_or_tempo_range_in_beats_per_minute
@property
def absolute_tempo_in_beat_per_minute(self) -> float:
return self.tempo_in_beats_per_minute * self.reference