Changeset - 0bb08e887166
[Not reviewed]
default
0 1 0
drewp@bigasterisk.com - 6 years ago 2019-06-10 02:19:59
drewp@bigasterisk.com
bcf2000 python 3 support
Ignore-this: 2f78d9c590846a357876afc5116aaa5d
1 file changed with 8 insertions and 10 deletions:
0 comments (0 inline, 0 general)
bcf2000.py
Show inline comments
 
@@ -35,33 +35,31 @@ class BCF2000(object):
 
        """device was usually /dev/snd/midiC1D0 but then it showed up
 
        once as C0D0. It should be autodetected"""
 
        self.devPath = dev
 
        self.dev = None
 
        self.lastValue: Dict[str, int] = {} # control name : value
 
        self.reopen()
 
        self.packet = ""
 
        self.packet = b""
 
        loop = LoopingCall(self.poll)
 
        loop.start(.01)
 

	
 
    def poll(self):
 
        try:
 
            bytes = self.dev.read(3)
 
            newData = self.dev.read(3)
 
        except (IOError, AttributeError):
 
            return
 
        if len(bytes) == 0:
 
            print("midi stall, reopen slider device")
 
            self.reopen()
 
        if newData is None:
 
            return
 
        self.packet += bytes
 
        self.packet += newData
 
        if len(self.packet) == 3:
 
            p = self.packet
 
            self.packet = ""
 
            self.packet = b""
 
            self.packetReceived(p)
 

	
 
    def packetReceived(self, packet):
 
        b0, which, value = [ord(b) for b in packet]
 
        b0, which, value = packet
 
        if b0 != 0xb0:
 
            return
 
        if which in self.control:
 
            name = self.control[which]
 
            if name.startswith("button-"):
 
                value = value > 0
 
@@ -75,13 +73,13 @@ class BCF2000(object):
 
            try:
 
                self.dev.close()
 
            except IOError:
 
                pass
 

	
 
        self.lastValue.clear()
 
        self.dev = open(self.devPath, "r+")
 
        self.dev = open(self.devPath, "rb+", buffering=0)
 
        twisted.internet.fdesc.setNonBlocking(self.dev)
 
                    
 
    def valueIn(self, name, value):
 
        """override this with your handler for when events come in
 
        from the hardware"""
 
        print("slider %s to %s" % (name, value))
 
@@ -104,13 +102,13 @@ class BCF2000(object):
 
        self.lastValue[name] = value
 
        which = [k for k,v in list(self.control.items()) if v == name]
 
        assert len(which) == 1, "unknown control name %r" % name
 
        if name.startswith('button-'):
 
            value = value * 127
 
        #print "bcf: write %s %s" % (name, value)
 
        self.dev.write(chr(0xb0) + chr(which[0]) + chr(int(value)))
 
        self.dev.write(bytes([0xb0, which[0], int(value)]))
 

	
 
    def close(self):
 
        self.dev.close()
 
        self.dev = None
 

	
 
if __name__ == '__main__':
0 comments (0 inline, 0 general)