Mercurial > code > home > repos > light9
annotate bcf2000.py @ 1995:8a618476e2fa
checkpoint show data
Ignore-this: f0937fc9e197b9009800bd5625e3957e
author | drewp@bigasterisk.com |
---|---|
date | Sun, 09 Jun 2019 21:06:29 +0000 |
parents | f001d689b3e2 |
children | 0bb08e887166 |
rev | line source |
---|---|
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 #!/usr/bin/python |
1873
f001d689b3e2
more py3 and typing fixes
Drew Perttula <drewp@bigasterisk.com>
parents:
839
diff
changeset
|
2 |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 import math |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 import twisted.internet.fdesc |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
5 from twisted.internet import reactor |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
6 from twisted.internet.task import LoopingCall |
1873
f001d689b3e2
more py3 and typing fixes
Drew Perttula <drewp@bigasterisk.com>
parents:
839
diff
changeset
|
7 from typing import Dict |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
8 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
9 class BCF2000(object): |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
10 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
11 control = {81 : "slider1", 82 : "slider2", 83 : "slider3", 84 : "slider4", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 85 : "slider5", 86 : "slider6", 87 : "slider7", 88 : "slider8", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
13 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
14 1 : "knob1", 2 : "knob2", 3 : "knob3", 4 : "knob4", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
15 5 : "knob5", 6 : "knob6", 7 : "knob7", 8 : "knob8", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
16 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
17 33 : "button-knob1", 34 : "button-knob2", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
18 35 : "button-knob3", 36 : "button-knob4", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
19 37 : "button-knob5", 38 : "button-knob6", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
20 39 : "button-knob7", 40 : "button-knob8", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
21 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
22 65 : "button-upper1", 66 : "button-upper2", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
23 67 : "button-upper3", 68 : "button-upper4", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
24 69 : "button-upper5", 70 : "button-upper6", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
25 71 : "button-upper7", 72 : "button-upper8", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
26 73 : "button-lower1", 74 : "button-lower2", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
27 75 : "button-lower3", 76 : "button-lower4", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
28 77 : "button-lower5", 78 : "button-lower6", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
29 79 : "button-lower7", 80 : "button-lower8", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
30 89 : "button-corner1", 90 : "button-corner2", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
31 91 : "button-corner3", 92 : "button-corner4", |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
32 } |
400
b2858c2d4a4d
aft() has smooth arg; workaround for CC writing poor subterms
Drew Perttula <drewp@bigasterisk.com>
parents:
388
diff
changeset
|
33 |
839 | 34 def __init__(self, dev="/dev/snd/midiC2D0"): |
400
b2858c2d4a4d
aft() has smooth arg; workaround for CC writing poor subterms
Drew Perttula <drewp@bigasterisk.com>
parents:
388
diff
changeset
|
35 """device was usually /dev/snd/midiC1D0 but then it showed up |
b2858c2d4a4d
aft() has smooth arg; workaround for CC writing poor subterms
Drew Perttula <drewp@bigasterisk.com>
parents:
388
diff
changeset
|
36 once as C0D0. It should be autodetected""" |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
37 self.devPath = dev |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
38 self.dev = None |
1873
f001d689b3e2
more py3 and typing fixes
Drew Perttula <drewp@bigasterisk.com>
parents:
839
diff
changeset
|
39 self.lastValue: Dict[str, int] = {} # control name : value |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
40 self.reopen() |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
41 self.packet = "" |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
42 loop = LoopingCall(self.poll) |
359
bd8a89743226
KC optimizations, hw sliders now follow the active row
Drew Perttula <drewp@bigasterisk.com>
parents:
350
diff
changeset
|
43 loop.start(.01) |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
44 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
45 def poll(self): |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
46 try: |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
47 bytes = self.dev.read(3) |
386
551f06733559
bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents:
362
diff
changeset
|
48 except (IOError, AttributeError): |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
49 return |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
50 if len(bytes) == 0: |
1873
f001d689b3e2
more py3 and typing fixes
Drew Perttula <drewp@bigasterisk.com>
parents:
839
diff
changeset
|
51 print("midi stall, reopen slider device") |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
52 self.reopen() |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
53 return |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
54 self.packet += bytes |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
55 if len(self.packet) == 3: |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
56 p = self.packet |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
57 self.packet = "" |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
58 self.packetReceived(p) |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
59 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
60 def packetReceived(self, packet): |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
61 b0, which, value = [ord(b) for b in packet] |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
62 if b0 != 0xb0: |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
63 return |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
64 if which in self.control: |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
65 name = self.control[which] |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
66 if name.startswith("button-"): |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
67 value = value > 0 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
68 self.lastValue[name] = value |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
69 self.valueIn(name, value) |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
70 else: |
1873
f001d689b3e2
more py3 and typing fixes
Drew Perttula <drewp@bigasterisk.com>
parents:
839
diff
changeset
|
71 print("unknown control %s to %s" % (which, value)) |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
72 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
73 def reopen(self): |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
74 if self.dev is not None: |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
75 try: |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
76 self.dev.close() |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
77 except IOError: |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
78 pass |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
79 |
387
48af0ea86ff4
bcf2000: forget last slider values on reopen
David McClosky <dmcc@bigasterisk.com>
parents:
386
diff
changeset
|
80 self.lastValue.clear() |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
81 self.dev = open(self.devPath, "r+") |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
82 twisted.internet.fdesc.setNonBlocking(self.dev) |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
83 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
84 def valueIn(self, name, value): |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
85 """override this with your handler for when events come in |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
86 from the hardware""" |
1873
f001d689b3e2
more py3 and typing fixes
Drew Perttula <drewp@bigasterisk.com>
parents:
839
diff
changeset
|
87 print("slider %s to %s" % (name, value)) |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
88 if name == 'slider1': |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
89 for x in range(2,8+1): |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
90 v2 = int(64 + 64 * math.sin(x / 3 + value / 10)) |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
91 self.valueOut('slider%d' % x, v2) |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
92 for x in range(1,8+1): |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
93 self.valueOut('button-upper%s' % x, value > x*15) |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
94 self.valueOut('button-lower%s' % x, value > (x*15+7)) |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
95 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
96 def valueOut(self, name, value): |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
97 """call this to send an event to the hardware""" |
386
551f06733559
bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents:
362
diff
changeset
|
98 if self.dev is None: |
551f06733559
bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents:
362
diff
changeset
|
99 return |
551f06733559
bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents:
362
diff
changeset
|
100 |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
101 value = int(value) |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
102 if self.lastValue.get(name) == value: |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
103 return |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
104 self.lastValue[name] = value |
1873
f001d689b3e2
more py3 and typing fixes
Drew Perttula <drewp@bigasterisk.com>
parents:
839
diff
changeset
|
105 which = [k for k,v in list(self.control.items()) if v == name] |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
106 assert len(which) == 1, "unknown control name %r" % name |
470
68e1655eaa2c
fix bcf2000 valueOut when you pass an int 0,1 to a button
drewp@bigasterisk.com
parents:
425
diff
changeset
|
107 if name.startswith('button-'): |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
108 value = value * 127 |
362
fc87327e29c4
CC now attaches to hardware sliders and knobs. tres cool. KC gets a --sliders option to enable the sliders
Drew Perttula <drewp@bigasterisk.com>
parents:
359
diff
changeset
|
109 #print "bcf: write %s %s" % (name, value) |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
110 self.dev.write(chr(0xb0) + chr(which[0]) + chr(int(value))) |
386
551f06733559
bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents:
362
diff
changeset
|
111 |
551f06733559
bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents:
362
diff
changeset
|
112 def close(self): |
551f06733559
bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents:
362
diff
changeset
|
113 self.dev.close() |
551f06733559
bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents:
362
diff
changeset
|
114 self.dev = None |
350
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
115 |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
116 if __name__ == '__main__': |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
117 b = BCF2000() |
c7478a778992
junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
118 reactor.run() |