-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFlashingButtonElement.py
More file actions
executable file
·122 lines (98 loc) · 3.21 KB
/
FlashingButtonElement.py
File metadata and controls
executable file
·122 lines (98 loc) · 3.21 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
120
121
122
# emacs-mode: -*- python-*-
import Live
from _Framework.ButtonElement import ButtonElement
from _Framework.InputControlElement import InputControlElement
from _Framework.NotifyingControlElement import NotifyingControlElement
COLOR_MAP = [0, 1, 2, 3, 4, 5, 127]
MIDI_NOTE_TYPE = 0
MIDI_CC_TYPE = 1
MIDI_PB_TYPE = 2
MIDI_MSG_TYPES = (MIDI_NOTE_TYPE,
MIDI_CC_TYPE,
MIDI_PB_TYPE)
MIDI_NOTE_ON_STATUS = 144
MIDI_NOTE_OFF_STATUS = 128
MIDI_CC_STATUS = 176
MIDI_PB_STATUS = 224
class FlashingButtonElement(ButtonElement):
__module__ = __name__
__doc__ = ' Special button class that can be configured with custom on- and off-values, some of which flash at specified intervals called by _Update_Display'
def __init__(self, is_momentary, msg_type, channel, identifier, name, cs):
ButtonElement.__init__(self, is_momentary, msg_type, channel, identifier)
#self._flash_state = 0
self._color = 0
self._on_value = 0
self._off_value = 127
self._is_enabled = True
self._is_notifying = False
self._force_next_value = False
self.name = name
self._parameter = None
self._script = cs
self._report_input = True
def set_on_off_values(self, on_value, off_value):
assert (on_value in range(128))
assert (off_value in range(128))
self._last_sent_message = None
self._on_value = on_value
self._off_value = off_value
def set_on_value(self, value):
assert (value in range(128))
self._last_sent_message = None
self._on_value = value
def set_off_value(self, value):
assert (value in range(128))
self._last_sent_message = None
self._off_value = value
def set_force_next_value(self):
self._force_next_value = True
def set_enabled(self, enabled):
self._is_enabled = enabled
self._request_rebuild()
def turn_on(self):
self.send_value(self._on_value)
def turn_off(self):
self.send_value(self._off_value)
def reset(self):
self.send_value(0)
def receive_value(self, value):
self._last_sent_message = None
ButtonElement.receive_value(self, value)
def send_value(self, value, force_send=False): #commented this because of ButtonElement==NoneType errors in log
if type(self) != type(None):
assert (value is not None)
assert isinstance(value, int)
assert (value in range(128))
if force_send or ((value != self._last_sent_value) and self._is_being_forwarded):
data_byte1 = self._original_identifier
if value in range(1, 127):
data_byte2 = COLOR_MAP[(value - 1) % 6]
elif value == 127:
data_byte2 = COLOR_MAP[6]
else:
data_byte2 = 127
self._color = 127
status_byte = self._original_channel
if (self._msg_type == MIDI_NOTE_TYPE):
status_byte += MIDI_NOTE_ON_STATUS
elif (self._msg_type == MIDI_CC_TYPE):
status_byte += MIDI_CC_STATUS
else:
assert False
self.send_midi(tuple([status_byte,
data_byte1,
data_byte2]))
self._last_sent_message = [value]
if self._report_output:
is_input = True
self._report_value(value, (not is_input))
#self._flash_state = round((value -1)/7)
def script_wants_forwarding(self):
if not self._is_enabled:
return False
else:
return InputControlElement.script_wants_forwarding(self)
def flash(self, timer):
pass
# local variables:
# tab-width: 4