diff options
Diffstat (limited to 'solo-tool-project/src/solo_tool/midi_controller_actition.py')
-rw-r--r-- | solo-tool-project/src/solo_tool/midi_controller_actition.py | 43 |
1 files changed, 43 insertions, 0 deletions
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) + } |