-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathboard.py
More file actions
119 lines (99 loc) · 3.2 KB
/
board.py
File metadata and controls
119 lines (99 loc) · 3.2 KB
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
from .led import LEDController
from .footswitch import FootSwitchEventBus, Layout, FootSwitch, EventType
from .session import Session
from functools import partial
import logging
import Live
logger = logging.getLogger(__name__)
class Mode:
def __init__(self, leds: LEDController):
self.leds = leds
def activate(self):
self.leds.activate()
def deactivate(self):
self.leds.deactivate()
def set_layout_changed_callback(self, callback):
pass
def get_layout(self):
raise NotImplementedError()
def set_track(self, track: Live.Track.Track):
raise NotImplementedError()
class Board:
def __init__(self, leds: LEDController, footswitch_events: FootSwitchEventBus):
self._leds = leds
self._modes = []
self._current_mode = None
self._current_mode_layout = None
self._mode_led_values = [20, 21, 22]
for val in self._mode_led_values:
self._leds.off(val)
self._footswitch_events = footswitch_events
l = Layout()
l.listen(FootSwitch.UP, EventType.PRESS, self._prev_mode)
l.listen(FootSwitch.DOWN, EventType.PRESS, self._next_mode)
self._footswitch_events.install(l)
self._current_track = None
self._session = Session()
self._session.add_callback(self._tracks_updated)
self._tracks_updated()
def add_mode(self, mode: Mode):
mode.set_layout_changed_callback(partial(self._refresh_layout, len(self._modes)))
self._modes.append(mode)
if self._current_track is not None:
mode.set_track(self._current_track)
if self._current_mode is None:
self._next_mode()
def _next_mode(self, *a):
logger.info("Next mode")
if len(self._modes) == 0:
return
if self._current_mode is None:
mode = 0
else:
mode = self._current_mode + 1
if mode == len(self._modes):
mode = 0
self._set_mode(mode)
def _prev_mode(self, *a):
logger.info("Previous mode")
if len(self._modes) == 0:
return
if self._current_mode is None:
mode = len(self._modes) - 1
else:
mode = self._current_mode - 1
if mode == -1:
mode = len(self._modes) - 1
self._set_mode(mode)
def _set_mode(self, ind):
if self._current_mode == ind:
logger.info("Not changing mode. It's already set.")
return
if self._current_mode is not None:
self._modes[self._current_mode].deactivate()
self._footswitch_events.uninstall(self._modes[self._current_mode].get_layout())
if self._current_mode < len(self._mode_led_values):
self._leds.off(self._mode_led_values[self._current_mode])
self._modes[ind].activate()
self._install_mode_layout(ind)
self._current_mode = ind
if self._current_mode < len(self._mode_led_values):
self._leds.on(self._mode_led_values[self._current_mode])
def _set_track(self, track):
if track == self._current_track:
return
self._current_track = track
for mode in self._modes:
mode.set_track(track)
def _tracks_updated(self):
for track in self._session.get_tracks():
self._set_track(track)
# just use the first track for now
break
def _refresh_layout(self, ind):
if self._current_mode == ind:
self._footswitch_events.uninstall(self._current_mode_layout)
self._install_mode_layout(ind)
def _install_mode_layout(self, ind):
self._current_mode_layout = self._modes[ind].get_layout()
self._footswitch_events.install(self._current_mode_layout)