from pyseq import * import time import sys SOURCE=[("mondrian", 0)] TARGETS={} TARGETS[0]=[("timidity", 0)] # default target, port; required TARGETS[1]=[("external rhodes", 0), ("timidity", 0)] # channel 1 TARGETS[2]=[("external bass", 0), ("timidity", 0)] # channel 2 TARGETS[10]=[("external drums", 0), ("timidity", 0)] # channel 10 class MidiRouter(PySeq): def __init__(self): PySeq.__init__(self, "MidiRouter") clin, dummy=getClients(SND_SEQ_PORT_CAP_SUBS_READ) clout, dummy=getClients(SND_SEQ_PORT_CAP_SUBS_WRITE) self.iport=self.createInPort() cl, pt=self.findMatch(clin, SOURCE) if cl!=None: self.connectFrom(self.iport, cl, pt) else: self.warn('no matching client: %s' % `SOURCE`) self.oports={} for k in TARGETS.keys(): self.oports[k]=self.createOutPort() cl, pt=self.findMatch(clout, TARGETS[k]) if cl!=None: self.connectTo(self.oports[k], cl, pt) else: self.warn('no matching client: %s' % `TARGETS[k]`) def findMatch(self, cls, lst): for subname, pt in lst: subname=subname.lower() for clid, clname, pts in cls: clname=clname.lower() pts=[p[0] for p in pts] if clname.find(subname)>=0: if pt in pts: return clid, pt else: self.warn('clname: desired port %d not available' % pt) return clid, pts[0] return None, None def warn(self, s): sys.stderr.write(s+'\n') def callback(self, ev): try: ch=dat.getData().channel+1 except: ch=0 ev.sendNow(self, self.oports[ch]) return 1 if __name__=='__main__': mr=MidiRouter() MidiThread(mr).start() while 1: time.sleep(1)