aboutsummaryrefslogtreecommitdiffstats
path: root/solo-tool-project/src/solo_tool/midi_controller_actition.py
blob: 9c423ac9048a43da0fb9048c2d7754830f595061 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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(self, 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)
        }