-
Notifications
You must be signed in to change notification settings - Fork 0
/
qmodisplay.py
168 lines (149 loc) · 4.33 KB
/
qmodisplay.py
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import rtmidi
import qmomidi
# These set the text in the 7-segment-display area. |raw=True| means to use the
# raw data to get odd characters, otherwise, text is translated as best
# as I can
def translateTextToMcu(text):
"""Convert ASCII text into Mackie's seven-segment display text"""
newtext = list()
for c in text:
if c.isupper():
newtext.append(ord(c) - ord('A') + 1)
elif c.islower():
newtext.append(ord(c) - ord('a') + 1)
elif c.isdigit():
newtext.append(ord(c) - ord('0') + 48)
elif c.isspace():
newtext.append(0)
elif c == '.' and len(newtext) > 0 and newtext[-1] < 64:
newtext[-1] = newtext[-1] + 64
elif c == '-':
newtext.append(45)
elif c == '_':
newtext.append(46)
return newtext
def doSevenSegment(position, value):
msg = rtmidi.MidiMessage.controllerEvent(1, position, value)
qmomidi.midiout().sendMessage(msg)
def setAssignment(text, raw=False):
if len(text) == 0:
return
if raw == False:
text = translateTextToMcu(text)
else:
text = bytes(text)
if len(text) > 0:
doSevenSegment(75, text[0])
else:
doSevenSegment(75, 0)
if len(text) > 1:
doSevenSegment(74, text[1])
else:
doSevenSegment(74, 0)
def setBars(text, raw=False):
if len(text) == 0:
return
if raw == False:
text = translateTextToMcu(text)
else:
text = bytes(text)
if len(text) > 0:
doSevenSegment(73, text[0])
else:
doSevenSegment(73, 0)
if len(text) > 1:
doSevenSegment(72, text[1])
else:
doSevenSegment(72, 0)
if len(text) > 2:
doSevenSegment(71, text[2])
else:
doSevenSegment(71, 0)
def setBeats(text, raw=False):
if len(text) == 0:
return
if raw == False:
text = translateTextToMcu(text)
text = bytes(text)
if len(text) > 0:
doSevenSegment(70, text[0])
else:
doSevenSegment(70, 0)
if len(text) > 1:
doSevenSegment(69, text[1])
else:
doSevenSegment(69, 0)
def setSubDivision(text, raw=False):
if len(text) == 0:
return
if raw == False:
text = translateTextToMcu(text)
else:
text = bytes(text)
if len(text) > 0:
doSevenSegment(68, text[0])
else:
doSevenSegment(68, 0)
if len(text) > 1:
doSevenSegment(67, teext[1])
else:
doSevenSegment(67, 0)
def setTicks(text, raw=False):
if len(text) == 0:
return
if raw == False:
text = translateTextToMcu(text)
else:
text = bytes(text)
if len(text) > 0:
doSevenSegment(66, text[0])
else:
doSevenSegment(66, 0)
if len(text) > 1:
doSevenSegment(65, text[1])
else:
doSevenSegment(65, 0)
if len(text) > 2:
doSevenSegment(64, text[2])
else:
doSevenSegment(64, 0)
# Sets the text over the whole LCD display, starting at |startpos|
def setLcdRaw(text, startpos=0):
command = [ 0x00, 0x00, 0x66, 0x14 ] # SysEx without xF0
command.append(0x12) # LCD
command.append(startpos)
max = 112 - startpos
if len(text) > max:
text = text[:max]
for c in text:
command.append(ord(c))
# Don't bother with xF7 terminator
msg = rtmidi.MidiMessage.createSysExMessage(bytes(command))
qmomidi.midiout().sendMessage(msg)
# Sets the text over the whole LCD display, starting at |row, column|
# This is basically a broken out setLcdRaw()
def setLcdRC(text, row=0, column=0):
setLcdRaw(text, row * 0x38 + column)
# Sets the text for a single LCD Panel, with |panel| from 1 to 8
def setLcdPanel(panel, textTop='', textBottom=''):
posTop = (panel - 1) * 7
posBottom = posTop + 0x38
if len(textTop) > 7:
textTop = textTop[:7]
else:
while len(textTop) < 7:
textTop = textTop + ' '
if len(textBottom) > 7:
textBottom = textBottom[:7]
else:
while len(textBottom) < 7:
textBottom = textBottom + ' '
setLcdRaw(textTop, posTop)
setLcdRaw(textBottom, posBottom)
if __name__ == "__main__":
setLcdPanel(1, 'Hello', 'World')
setLcdPanel(1, 'Hello12345', 'World67890')
setTicks("12")
setTicks("1.2")
setTicks("AB")
setTicks(b'\x00\x01\x02', True)