From 4ea8344fba863d3ff113cf790b6327d44ced62ee Mon Sep 17 00:00:00 2001 From: Eddy Pedroni Date: Thu, 21 Aug 2025 18:56:43 +0200 Subject: Actition controller prototype --- .../src/solo_tool/midi_controller_actition.py | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 solo-tool-project/src/solo_tool/midi_controller_actition.py (limited to 'solo-tool-project/src/solo_tool/midi_controller_actition.py') diff --git a/solo-tool-project/src/solo_tool/midi_controller_actition.py b/solo-tool-project/src/solo_tool/midi_controller_actition.py new file mode 100644 index 0000000..184b9c8 --- /dev/null +++ b/solo-tool-project/src/solo_tool/midi_controller_actition.py @@ -0,0 +1,43 @@ +import mido +from collections.abc import Callable + +from . import handlers +from .solo_tool import SoloTool + +class ActitionController: + class _MidoMidiWrapper: + def __init__(self): + self._callback = None + self._inPort = mido.open_input("f_midi") + self._inPort.callback = self._midoCallback + + def setCallback(self, callback: Callable[[int, int], None]) -> None: + self._callback = callback + + def _midoCallback(msg: mido.Message) -> None: + if msg.type != "control_change": + return + if self._callback: + self._callback(msg.control, msg.channel) + + def __init__(self, midiWrapperOverride=None): + self._handlers = {} + if midiWrapperOverride: + self._midiWrapper = midiWrapperOverride + else: + self._midiWrapper = ActitionController._MidoMidiWrapper() + self._midiWrapper.setCallback(self._callback) + + def _callback(self, control: int, channel: int) -> None: + if channel != 15: + return + if control in self._handlers: + self._handlers[control]() + + def setSoloTool(self, soloTool: SoloTool) -> None: + self._handlers = { + 102: handlers.seekAbsolute(soloTool, 0.0), + 103: handlers.positionToKeyPoint(soloTool), + 104: soloTool.jump, + 105: handlers.playPause(soloTool) + } -- cgit v1.2.3