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