Mercurial > code > home > repos > light9
comparison bcf2000.py @ 1873:f001d689b3e2
more py3 and typing fixes
Ignore-this: 3180bd966cac69de56b86ef6a308cad4
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Mon, 27 May 2019 06:20:38 +0000 |
parents | ff9c72cfb023 |
children | 0bb08e887166 |
comparison
equal
deleted
inserted
replaced
1872:5ebdb55e2ee6 | 1873:f001d689b3e2 |
---|---|
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 from __future__ import division | 2 |
3 import math | 3 import math |
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 | 8 |
8 class BCF2000(object): | 9 class BCF2000(object): |
9 | 10 |
10 control = {81 : "slider1", 82 : "slider2", 83 : "slider3", 84 : "slider4", | 11 control = {81 : "slider1", 82 : "slider2", 83 : "slider3", 84 : "slider4", |
11 85 : "slider5", 86 : "slider6", 87 : "slider7", 88 : "slider8", | 12 85 : "slider5", 86 : "slider6", 87 : "slider7", 88 : "slider8", |
33 def __init__(self, dev="/dev/snd/midiC2D0"): | 34 def __init__(self, dev="/dev/snd/midiC2D0"): |
34 """device was usually /dev/snd/midiC1D0 but then it showed up | 35 """device was usually /dev/snd/midiC1D0 but then it showed up |
35 once as C0D0. It should be autodetected""" | 36 once as C0D0. It should be autodetected""" |
36 self.devPath = dev | 37 self.devPath = dev |
37 self.dev = None | 38 self.dev = None |
38 self.lastValue = {} # control name : value | 39 self.lastValue: Dict[str, int] = {} # control name : value |
39 self.reopen() | 40 self.reopen() |
40 self.packet = "" | 41 self.packet = "" |
41 loop = LoopingCall(self.poll) | 42 loop = LoopingCall(self.poll) |
42 loop.start(.01) | 43 loop.start(.01) |
43 | 44 |
45 try: | 46 try: |
46 bytes = self.dev.read(3) | 47 bytes = self.dev.read(3) |
47 except (IOError, AttributeError): | 48 except (IOError, AttributeError): |
48 return | 49 return |
49 if len(bytes) == 0: | 50 if len(bytes) == 0: |
50 print "midi stall, reopen slider device" | 51 print("midi stall, reopen slider device") |
51 self.reopen() | 52 self.reopen() |
52 return | 53 return |
53 self.packet += bytes | 54 self.packet += bytes |
54 if len(self.packet) == 3: | 55 if len(self.packet) == 3: |
55 p = self.packet | 56 p = self.packet |
65 if name.startswith("button-"): | 66 if name.startswith("button-"): |
66 value = value > 0 | 67 value = value > 0 |
67 self.lastValue[name] = value | 68 self.lastValue[name] = value |
68 self.valueIn(name, value) | 69 self.valueIn(name, value) |
69 else: | 70 else: |
70 print "unknown control %s to %s" % (which, value) | 71 print("unknown control %s to %s" % (which, value)) |
71 | 72 |
72 def reopen(self): | 73 def reopen(self): |
73 if self.dev is not None: | 74 if self.dev is not None: |
74 try: | 75 try: |
75 self.dev.close() | 76 self.dev.close() |
81 twisted.internet.fdesc.setNonBlocking(self.dev) | 82 twisted.internet.fdesc.setNonBlocking(self.dev) |
82 | 83 |
83 def valueIn(self, name, value): | 84 def valueIn(self, name, value): |
84 """override this with your handler for when events come in | 85 """override this with your handler for when events come in |
85 from the hardware""" | 86 from the hardware""" |
86 print "slider %s to %s" % (name, value) | 87 print("slider %s to %s" % (name, value)) |
87 if name == 'slider1': | 88 if name == 'slider1': |
88 for x in range(2,8+1): | 89 for x in range(2,8+1): |
89 v2 = int(64 + 64 * math.sin(x / 3 + value / 10)) | 90 v2 = int(64 + 64 * math.sin(x / 3 + value / 10)) |
90 self.valueOut('slider%d' % x, v2) | 91 self.valueOut('slider%d' % x, v2) |
91 for x in range(1,8+1): | 92 for x in range(1,8+1): |
99 | 100 |
100 value = int(value) | 101 value = int(value) |
101 if self.lastValue.get(name) == value: | 102 if self.lastValue.get(name) == value: |
102 return | 103 return |
103 self.lastValue[name] = value | 104 self.lastValue[name] = value |
104 which = [k for k,v in self.control.items() if v == name] | 105 which = [k for k,v in list(self.control.items()) if v == name] |
105 assert len(which) == 1, "unknown control name %r" % name | 106 assert len(which) == 1, "unknown control name %r" % name |
106 if name.startswith('button-'): | 107 if name.startswith('button-'): |
107 value = value * 127 | 108 value = value * 127 |
108 #print "bcf: write %s %s" % (name, value) | 109 #print "bcf: write %s %s" % (name, value) |
109 self.dev.write(chr(0xb0) + chr(which[0]) + chr(int(value))) | 110 self.dev.write(chr(0xb0) + chr(which[0]) + chr(int(value))) |