annotate bcf2000.py @ 2350:72c589cb96d1

looknig for a bug
author drewp@bigasterisk.com
date Sat, 03 Jun 2023 15:45:27 -0700
parents 02eb0e99bba5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
2013
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
9
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
10 class BCF2000(object):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
11
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
12 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
13 85 : "slider5", 86 : "slider6", 87 : "slider7", 88 : "slider8",
2013
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
14
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
15 1 : "knob1", 2 : "knob2", 3 : "knob3", 4 : "knob4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
16 5 : "knob5", 6 : "knob6", 7 : "knob7", 8 : "knob8",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
17
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
18 33 : "button-knob1", 34 : "button-knob2",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
19 35 : "button-knob3", 36 : "button-knob4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
20 37 : "button-knob5", 38 : "button-knob6",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
21 39 : "button-knob7", 40 : "button-knob8",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
22
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
23 65 : "button-upper1", 66 : "button-upper2",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
24 67 : "button-upper3", 68 : "button-upper4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
25 69 : "button-upper5", 70 : "button-upper6",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
26 71 : "button-upper7", 72 : "button-upper8",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
27 73 : "button-lower1", 74 : "button-lower2",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
28 75 : "button-lower3", 76 : "button-lower4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
29 77 : "button-lower5", 78 : "button-lower6",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
30 79 : "button-lower7", 80 : "button-lower8",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
31 89 : "button-corner1", 90 : "button-corner2",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
32 91 : "button-corner3", 92 : "button-corner4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
33 }
400
b2858c2d4a4d aft() has smooth arg; workaround for CC writing poor subterms
Drew Perttula <drewp@bigasterisk.com>
parents: 388
diff changeset
34
839
ff9c72cfb023 midi port update
drewp@bigasterisk.com
parents: 470
diff changeset
35 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
36 """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
37 once as C0D0. It should be autodetected"""
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
38 self.devPath = dev
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
39 self.dev = None
2013
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
40 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
41 self.reopen()
2012
0bb08e887166 bcf2000 python 3 support
drewp@bigasterisk.com
parents: 1873
diff changeset
42 self.packet = b""
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
43 loop = LoopingCall(self.poll)
359
bd8a89743226 KC optimizations, hw sliders now follow the active row
Drew Perttula <drewp@bigasterisk.com>
parents: 350
diff changeset
44 loop.start(.01)
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
45
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
46 def poll(self):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
47 try:
2012
0bb08e887166 bcf2000 python 3 support
drewp@bigasterisk.com
parents: 1873
diff changeset
48 newData = self.dev.read(3)
386
551f06733559 bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents: 362
diff changeset
49 except (IOError, AttributeError):
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
50 return
2012
0bb08e887166 bcf2000 python 3 support
drewp@bigasterisk.com
parents: 1873
diff changeset
51 if newData is None:
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
52 return
2012
0bb08e887166 bcf2000 python 3 support
drewp@bigasterisk.com
parents: 1873
diff changeset
53 self.packet += newData
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
54 if len(self.packet) == 3:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
55 p = self.packet
2012
0bb08e887166 bcf2000 python 3 support
drewp@bigasterisk.com
parents: 1873
diff changeset
56 self.packet = b""
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
57 self.packetReceived(p)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
58
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
59 def packetReceived(self, packet):
2012
0bb08e887166 bcf2000 python 3 support
drewp@bigasterisk.com
parents: 1873
diff changeset
60 b0, which, value = packet
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
61 if b0 != 0xb0:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
62 return
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
63 if which in self.control:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
64 name = self.control[which]
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
65 if name.startswith("button-"):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
66 value = value > 0
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
67 self.lastValue[name] = value
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
68 self.valueIn(name, value)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
69 else:
1873
f001d689b3e2 more py3 and typing fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 839
diff changeset
70 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
71
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
72 def reopen(self):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
73 if self.dev is not None:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
74 try:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
75 self.dev.close()
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
76 except IOError:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
77 pass
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
78
387
48af0ea86ff4 bcf2000: forget last slider values on reopen
David McClosky <dmcc@bigasterisk.com>
parents: 386
diff changeset
79 self.lastValue.clear()
2012
0bb08e887166 bcf2000 python 3 support
drewp@bigasterisk.com
parents: 1873
diff changeset
80 self.dev = open(self.devPath, "rb+", buffering=0)
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
81 twisted.internet.fdesc.setNonBlocking(self.dev)
2013
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
82
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
83 def valueIn(self, name, value):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
84 """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
85 from the hardware"""
1873
f001d689b3e2 more py3 and typing fixes
Drew Perttula <drewp@bigasterisk.com>
parents: 839
diff changeset
86 print("slider %s to %s" % (name, value))
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
87 if name == 'slider1':
2013
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
88 for x in range(2, 8 + 1):
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
89 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
90 self.valueOut('slider%d' % x, v2)
2013
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
91 for x in range(1, 8 + 1):
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
92 self.valueOut('button-upper%s' % x, value > x * 15)
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
93 self.valueOut('button-lower%s' % x, value > (x * 15 + 7))
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
94
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
95 def valueOut(self, name, value):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
96 """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
97 if self.dev is None:
551f06733559 bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents: 362
diff changeset
98 return
551f06733559 bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents: 362
diff changeset
99
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
100 value = int(value)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
101 if self.lastValue.get(name) == value:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
102 return
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
103 self.lastValue[name] = value
2013
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
104 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
105 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
106 if name.startswith('button-'):
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
107 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
108 #print "bcf: write %s %s" % (name, value)
2012
0bb08e887166 bcf2000 python 3 support
drewp@bigasterisk.com
parents: 1873
diff changeset
109 self.dev.write(bytes([0xb0, which[0], int(value)]))
386
551f06733559 bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents: 362
diff changeset
110
551f06733559 bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents: 362
diff changeset
111 def close(self):
551f06733559 bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents: 362
diff changeset
112 self.dev.close()
551f06733559 bcf2000 and kc: sliders can be turned off
David McClosky <dmcc@bigasterisk.com>
parents: 362
diff changeset
113 self.dev = None
350
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
114
2013
02eb0e99bba5 reformat
drewp@bigasterisk.com
parents: 2012
diff changeset
115
350
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()