Mercurial > code > home > repos > light9
comparison bcf2000.py @ 2013:02eb0e99bba5
reformat
Ignore-this: c3c95bdb8f0c67cb898b9eba71d7d97
author | drewp@bigasterisk.com |
---|---|
date | Mon, 10 Jun 2019 02:28:19 +0000 |
parents | 0bb08e887166 |
children |
comparison
equal
deleted
inserted
replaced
2012:0bb08e887166 | 2013:02eb0e99bba5 |
---|---|
4 import twisted.internet.fdesc | 4 import twisted.internet.fdesc |
5 from twisted.internet import reactor | 5 from twisted.internet import reactor |
6 from twisted.internet.task import LoopingCall | 6 from twisted.internet.task import LoopingCall |
7 from typing import Dict | 7 from typing import Dict |
8 | 8 |
9 | |
9 class BCF2000(object): | 10 class BCF2000(object): |
10 | 11 |
11 control = {81 : "slider1", 82 : "slider2", 83 : "slider3", 84 : "slider4", | 12 control = {81 : "slider1", 82 : "slider2", 83 : "slider3", 84 : "slider4", |
12 85 : "slider5", 86 : "slider6", 87 : "slider7", 88 : "slider8", | 13 85 : "slider5", 86 : "slider6", 87 : "slider7", 88 : "slider8", |
13 | 14 |
14 1 : "knob1", 2 : "knob2", 3 : "knob3", 4 : "knob4", | 15 1 : "knob1", 2 : "knob2", 3 : "knob3", 4 : "knob4", |
15 5 : "knob5", 6 : "knob6", 7 : "knob7", 8 : "knob8", | 16 5 : "knob5", 6 : "knob6", 7 : "knob7", 8 : "knob8", |
16 | 17 |
17 33 : "button-knob1", 34 : "button-knob2", | 18 33 : "button-knob1", 34 : "button-knob2", |
18 35 : "button-knob3", 36 : "button-knob4", | 19 35 : "button-knob3", 36 : "button-knob4", |
34 def __init__(self, dev="/dev/snd/midiC2D0"): | 35 def __init__(self, dev="/dev/snd/midiC2D0"): |
35 """device was usually /dev/snd/midiC1D0 but then it showed up | 36 """device was usually /dev/snd/midiC1D0 but then it showed up |
36 once as C0D0. It should be autodetected""" | 37 once as C0D0. It should be autodetected""" |
37 self.devPath = dev | 38 self.devPath = dev |
38 self.dev = None | 39 self.dev = None |
39 self.lastValue: Dict[str, int] = {} # control name : value | 40 self.lastValue: Dict[str, int] = {} # control name : value |
40 self.reopen() | 41 self.reopen() |
41 self.packet = b"" | 42 self.packet = b"" |
42 loop = LoopingCall(self.poll) | 43 loop = LoopingCall(self.poll) |
43 loop.start(.01) | 44 loop.start(.01) |
44 | 45 |
76 pass | 77 pass |
77 | 78 |
78 self.lastValue.clear() | 79 self.lastValue.clear() |
79 self.dev = open(self.devPath, "rb+", buffering=0) | 80 self.dev = open(self.devPath, "rb+", buffering=0) |
80 twisted.internet.fdesc.setNonBlocking(self.dev) | 81 twisted.internet.fdesc.setNonBlocking(self.dev) |
81 | 82 |
82 def valueIn(self, name, value): | 83 def valueIn(self, name, value): |
83 """override this with your handler for when events come in | 84 """override this with your handler for when events come in |
84 from the hardware""" | 85 from the hardware""" |
85 print("slider %s to %s" % (name, value)) | 86 print("slider %s to %s" % (name, value)) |
86 if name == 'slider1': | 87 if name == 'slider1': |
87 for x in range(2,8+1): | 88 for x in range(2, 8 + 1): |
88 v2 = int(64 + 64 * math.sin(x / 3 + value / 10)) | 89 v2 = int(64 + 64 * math.sin(x / 3 + value / 10)) |
89 self.valueOut('slider%d' % x, v2) | 90 self.valueOut('slider%d' % x, v2) |
90 for x in range(1,8+1): | 91 for x in range(1, 8 + 1): |
91 self.valueOut('button-upper%s' % x, value > x*15) | 92 self.valueOut('button-upper%s' % x, value > x * 15) |
92 self.valueOut('button-lower%s' % x, value > (x*15+7)) | 93 self.valueOut('button-lower%s' % x, value > (x * 15 + 7)) |
93 | 94 |
94 def valueOut(self, name, value): | 95 def valueOut(self, name, value): |
95 """call this to send an event to the hardware""" | 96 """call this to send an event to the hardware""" |
96 if self.dev is None: | 97 if self.dev is None: |
97 return | 98 return |
98 | 99 |
99 value = int(value) | 100 value = int(value) |
100 if self.lastValue.get(name) == value: | 101 if self.lastValue.get(name) == value: |
101 return | 102 return |
102 self.lastValue[name] = value | 103 self.lastValue[name] = value |
103 which = [k for k,v in list(self.control.items()) if v == name] | 104 which = [k for k, v in list(self.control.items()) if v == name] |
104 assert len(which) == 1, "unknown control name %r" % name | 105 assert len(which) == 1, "unknown control name %r" % name |
105 if name.startswith('button-'): | 106 if name.startswith('button-'): |
106 value = value * 127 | 107 value = value * 127 |
107 #print "bcf: write %s %s" % (name, value) | 108 #print "bcf: write %s %s" % (name, value) |
108 self.dev.write(bytes([0xb0, which[0], int(value)])) | 109 self.dev.write(bytes([0xb0, which[0], int(value)])) |
109 | 110 |
110 def close(self): | 111 def close(self): |
111 self.dev.close() | 112 self.dev.close() |
112 self.dev = None | 113 self.dev = None |
113 | 114 |
115 | |
114 if __name__ == '__main__': | 116 if __name__ == '__main__': |
115 b = BCF2000() | 117 b = BCF2000() |
116 reactor.run() | 118 reactor.run() |