annotate bcf2000.py @ 355:4e60444605f6

add dmx_usb_module
author drewp@bigasterisk.com
date Wed, 13 Jun 2007 06:01:22 +0000
parents c7478a778992
children bd8a89743226
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
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
2 from __future__ import division
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
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
7
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
8 class BCF2000(object):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
9
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
10 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
11 85 : "slider5", 86 : "slider6", 87 : "slider7", 88 : "slider8",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
12
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
13 1 : "knob1", 2 : "knob2", 3 : "knob3", 4 : "knob4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
14 5 : "knob5", 6 : "knob6", 7 : "knob7", 8 : "knob8",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
15
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
16 33 : "button-knob1", 34 : "button-knob2",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
17 35 : "button-knob3", 36 : "button-knob4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
18 37 : "button-knob5", 38 : "button-knob6",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
19 39 : "button-knob7", 40 : "button-knob8",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
20
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
21 65 : "button-upper1", 66 : "button-upper2",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
22 67 : "button-upper3", 68 : "button-upper4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
23 69 : "button-upper5", 70 : "button-upper6",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
24 71 : "button-upper7", 72 : "button-upper8",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
25 73 : "button-lower1", 74 : "button-lower2",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
26 75 : "button-lower3", 76 : "button-lower4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
27 77 : "button-lower5", 78 : "button-lower6",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
28 79 : "button-lower7", 80 : "button-lower8",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
29 89 : "button-corner1", 90 : "button-corner2",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
30 91 : "button-corner3", 92 : "button-corner4",
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
31 }
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
32
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
33 def __init__(self, dev="/dev/snd/midiC1D0"):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
34 self.devPath = dev
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
35 self.dev = None
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
36 self.reopen()
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
37 self.lastValue = {} # control name : value
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
38 self.packet = ""
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
39 loop = LoopingCall(self.poll)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
40 loop.start(.02)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
41
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
42 def poll(self):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
43 try:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
44 bytes = self.dev.read(3)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
45 except IOError, e:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
46 return
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
47 if len(bytes) == 0:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
48 print "midi stall, reopen slider device"
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
49 self.reopen()
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
50 return
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
51 self.packet += bytes
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
52 if len(self.packet) == 3:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
53 p = self.packet
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
54 self.packet = ""
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
55 self.packetReceived(p)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
56
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
57 return
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 while 1:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
60 packet = self.dev.read(3)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
61 while len(packet) < 3:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
62 if len(packet) == 0:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
63 self.reopen()
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
64 packet += self.dev.read(3 - len(packet))
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
65
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
66 def packetReceived(self, packet):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
67 b0, which, value = [ord(b) for b in packet]
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
68 if b0 != 0xb0:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
69 return
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
70 if which in self.control:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
71 name = self.control[which]
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
72 if name.startswith("button-"):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
73 value = value > 0
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
74 self.lastValue[name] = value
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
75 self.valueIn(name, value)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
76 else:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
77 print "unknown control %s to %s" % (which, value)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
78
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
79 def reopen(self):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
80 if self.dev is not None:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
81 try:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
82 self.dev.close()
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
83 except IOError:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
84 pass
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
85
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
86 self.dev = open(self.devPath, "r+")
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
87 twisted.internet.fdesc.setNonBlocking(self.dev)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
88
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
89 def valueIn(self, name, value):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
90 """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
91 from the hardware"""
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
92 print "slider %s to %s" % (name, value)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
93 if name == 'slider1':
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
94 for x in range(2,8+1):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
95 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
96 self.valueOut('slider%d' % x, v2)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
97 for x in range(1,8+1):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
98 self.valueOut('button-upper%s' % x, value > x*15)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
99 self.valueOut('button-lower%s' % x, value > (x*15+7))
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
100
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
101 def valueOut(self, name, value):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
102 """call this to send an event to the hardware"""
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
103 value = int(value)
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
104 if self.lastValue.get(name) == value:
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
105 return
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
106 self.lastValue[name] = value
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
107 which = [k for k,v in self.control.items() if v == name]
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
108 assert len(which) == 1, "unknown control name %r" % name
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
109 if isinstance(value, bool):
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
110 value = value * 127
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
111 self.dev.write(chr(0xb0) + chr(which[0]) + chr(int(value)))
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
112
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
113
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
114 if __name__ == '__main__':
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
115 b = BCF2000()
c7478a778992 junky first pass at bcf2000 for keyboardcomposer
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
116 reactor.run()