16 | 16 |
scale_label: label.Label
|
17 | 17 |
notes_label: label.Label
|
18 | 18 |
|
|
19 |
_notes_dirty: bool
|
|
20 |
|
19 | 21 |
def __init__(self, *args):
|
20 | 22 |
super().__init__(*args)
|
21 | 23 |
|
22 | 24 |
self.keys = [Key(self.keyboard, i) for i in range(48)]
|
23 | 25 |
self.notes = {}
|
24 | 26 |
self.notes_expiring = {}
|
|
27 |
|
|
28 |
self._notes_dirty = False
|
25 | 29 |
|
26 | 30 |
self.scale_label = label.Label(FONT_10, text="", color=0xffffff, anchor_point=(0, 0), anchored_position=(0, 0))
|
27 | 31 |
self.notes_label = label.Label(FONT_10, text="", color=0xffffff, anchor_point=(0, 0), anchored_position=(10, 12))
|
|
47 | 51 |
def update_scale(self):
|
48 | 52 |
for key in self.keys:
|
49 | 53 |
key.update_scale()
|
50 | |
self.update_display()
|
|
54 |
|
|
55 |
self.scale_label.text = self.keyboard.scale.format()
|
51 | 56 |
|
52 | 57 |
def tick(self, ticks_ms: int):
|
53 | 58 |
for note in self.notes_expiring.values():
|
54 | 59 |
note.update_expiry(ticks_ms)
|
55 | |
|
56 | |
def update_display(self):
|
57 | |
self.scale_label.text = self.keyboard.scale.format()
|
58 | |
|
59 | |
active = [pitch for pitch in self.notes]
|
60 | |
active.sort()
|
61 | |
self.notes_label.text = ' '.join(self.keyboard.scale.label(p) for p in active)
|
62 | 60 |
|
63 | 61 |
def update_pixels(self, pixels: NeoPixel):
|
64 | 62 |
pixels.fill(0)
|
|
66 | 64 |
|
67 | 65 |
for key in self.keys:
|
68 | 66 |
pixels[led_map[key.i]] = key.update_color()
|
|
67 |
|
|
68 |
if self._notes_dirty:
|
|
69 |
active = [pitch for pitch in self.notes]
|
|
70 |
active.sort()
|
|
71 |
self.notes_label.text = ' '.join(self.keyboard.scale.label(p) for p in active)
|
|
72 |
self._notes_dirty = False
|
69 | 73 |
|
70 | 74 |
def key_event(self, i: int, pressed: bool) -> bool:
|
71 | 75 |
if pressed:
|
|
95 | 99 |
else:
|
96 | 100 |
key.on_release()
|
97 | 101 |
|
98 | |
self.update_display()
|
|
102 |
self._notes_dirty = True
|
|
103 |
|
99 | 104 |
return pressed
|
100 | 105 |
|
101 | 106 |
|
|
132 | 137 |
))
|
133 | 138 |
|
134 | 139 |
def enter(self):
|
135 | |
super().enter()
|
136 | 140 |
self.entered = supervisor.ticks_ms()
|
137 | 141 |
self.pressed_something = False
|
|
142 |
self.update_display()
|
|
143 |
super().enter()
|
|
144 |
|
|
145 |
def update_display(self):
|
|
146 |
base = self.keyboard.modes["base"]
|
|
147 |
self.scale_label.text = base.scale_label.text
|
|
148 |
|
|
149 |
def update_pixels(self, pixels: NeoPixel):
|
|
150 |
base = self.keyboard.modes["base"]
|
|
151 |
base.update_pixels(pixels)
|
|
152 |
super().update_pixels(pixels)
|
138 | 153 |
|
139 | 154 |
def key_event(self, i: int, pressed: bool) -> bool:
|
140 | 155 |
base = self.keyboard.modes["base"]
|
|
146 | 161 |
self.keyboard.mode = self.keyboard.modes["menu"]
|
147 | 162 |
return False
|
148 | 163 |
|
149 | |
self.keyboard.mode = self.keyboard.modes["base"]
|
|
164 |
self.keyboard.mode = base
|
150 | 165 |
return False
|
151 | 166 |
|
152 | 167 |
if not pressed:
|
|
156 | 171 |
key = base.keys[i]
|
157 | 172 |
self.keyboard.settings.get("scale_root").value = key._pitch
|
158 | 173 |
self.keyboard.settings.dispatch("scale_root")
|
159 | |
base.update_display()
|
160 | 174 |
self.pressed_something = True
|
161 | 175 |
return False
|
162 | 176 |
|
163 | 177 |
if i == Key.PREV_I:
|
164 | 178 |
self.keyboard.settings.get("scale_name").press_prev()
|
165 | 179 |
self.keyboard.settings.dispatch("scale_name")
|
166 | |
base.update_display()
|
167 | 180 |
self.pressed_something = True
|
168 | 181 |
return False
|
169 | 182 |
|
170 | 183 |
if i == Key.NEXT_I:
|
171 | 184 |
self.keyboard.settings.get("scale_name").press_next()
|
172 | 185 |
self.keyboard.settings.dispatch("scale_name")
|
173 | |
base.update_display()
|
174 | 186 |
self.pressed_something = True
|
175 | 187 |
return False
|
176 | |
|
177 | |
def update_display(self):
|
178 | |
base = self.keyboard.modes["base"]
|
179 | |
self.scale_label.text = base.scale_label.text
|