import typing
import rpp # type: ignore
from mutwo.converters.frontends import reaper_constants
from mutwo import converters
from mutwo import events
from mutwo import parameters
from mutwo.utilities import tools
__all__ = ("ReaperFileConverter", "ReaperMarkerConverter")
[docs]class ReaperFileConverter(converters.abc.Converter):
def __init__(self):
self.reaper_project = self.create_reaper_project()
[docs] @staticmethod
def create_reaper_project() -> rpp.Element:
return rpp.Element(
tag="REAPER_PROJECT",
attrib=["0.1", "6.16/linux-x86_64", "1607708341"],
children=[],
)
[docs] def add_track(self, name: str = "") -> rpp.Element:
track = rpp.Element(
tag="TRACK",
children=[["NAME", name], rpp.Element(tag="FXCHAIN", children=[],),],
)
self.reaper_project.append(track)
return track
[docs] def get_track(self, name: str) -> rpp.Element:
for track in self.reaper_project.findall(".//TRACK"):
current_trackname = track.find(".//NAME")
if current_trackname[1] == name:
return track
[docs] @staticmethod
def add_fx(
track: rpp.Element, fx_info: reaper_constants.VstInfo, name: str = ""
) -> rpp.Element:
fx = rpp.Element(
tag="VST", attrib=[name, fx_info.filename], children=fx_info.binary
)
fxchain = track.find(".//FXCHAIN")
fxchain.append(fx)
return fx
[docs] @staticmethod
def get_all_fx(track) -> typing.List[rpp.Element]:
fxchain = track.find(".//FXCHAIN")
return fxchain.findall(".//VST")
[docs] @staticmethod
def add_parameter_envelope(
track: rpp.Element,
fx: rpp.Element,
parameter_name: str,
envelope_events: events.basic.SequentialEvent,
) -> rpp.Element:
"""events need a value attribute"""
envelope = rpp.Element(
tag="PARMENV",
attrib=[parameter_name, "0", "1", "0.5"],
children=[
["ACT", "1", "-1"],
["VIS", "1", "1", "1"],
["DEFSHAPE", "0", "-1", "-1"],
],
)
envelope_points = [
["PT", time, event.value, 0]
for time, event in zip(envelope_events.absolute_times, envelope_events)
]
envelope.extend(envelope_points)
fxchain = track.find(".//FXCHAIN")
tools.insert_next_to(fxchain, fx, 1, envelope)
return envelope
[docs] def convert(self, event: events.abc.Event):
with open(self.path, "w") as file:
rpp.dump(self.reaper_project, file)
[docs]class ReaperMarkerConverter(converters.abc.EventConverter):
"""Make Reaper Marker entries."""
def __init__(
self,
simple_event_to_marker_name: typing.Callable[
[events.basic.SimpleEvent], str
] = lambda simple_event: simple_event.name, # type: ignore
simple_event_to_marker_color: typing.Callable[
[events.basic.SimpleEvent], str
] = lambda simple_event: simple_event.color, # type: ignore
):
self._simple_event_to_marker_name = simple_event_to_marker_name
self._simple_event_to_marker_color = simple_event_to_marker_color
def _convert_simple_event(
self,
simple_event: events.basic.SimpleEvent,
absolute_entry_delay: parameters.abc.DurationType,
) -> typing.Tuple[str, ...]:
try:
marker_name = self._simple_event_to_marker_name(simple_event)
marker_color = self._simple_event_to_marker_color(simple_event)
except AttributeError:
return tuple([])
return ("{} {} {}".format(absolute_entry_delay, marker_name, marker_color),)
[docs] def convert(self, event_to_convert: events.abc.Event) -> str:
reaper_marker = tuple(
"MARKER {} {}".format(nth_marker, marker_data)
for nth_marker, marker_data in enumerate(
self._convert_event(event_to_convert, 0)
)
)
return "\n".join(reaper_marker)