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()