Uses pyserial and py-libmpdclient.
#!/usr/local/bin/python import serial,time,mpdclient class RetryingMpdController: def __init__(self,**kw): self.mpd_kw = kw self.reconnect() def reconnect(self): self.mpd = mpdclient.MpdController(**self.mpd_kw) print "connecting to mpd" def __getattr__(self,attr): def retrying_method(*args): func = getattr(self.mpd,attr) try: func(*args) except mpdclient.MpdError: self.reconnect() func(*args) return retrying_method class Pedals: """ connect RTS to DSR and CTS like so (pin numbers are for 9-pin serial port): pin 7 RTS -->-----------+ | left / | pin 6 DSR <-------/ o---+ | right / | pin 8 CTS <-------/ o---+ """ def __init__(self,*actions): self.ser = serial.Serial(port="/dev/ttyS0",rtscts=1) self.ser.setRTS(1) self.prev = False,False self.actions = actions def poll(self): pedals = self.ser.getDSR(),self.ser.getCTS() for which in range(2): if pedals[which] and not self.prev[which]: self.actions[which]() self.prev = pedals class Playback: def __init__(self): self.mpd = RetryingMpdController(host='localhost',port=6600) def rewind(self,secs=2): pos,length,frac = self.mpd.getSongPosition() self.mpd.seek(seconds=pos-secs) def pause(self): self.mpd.pause() play = Playback() ped = Pedals(play.rewind, play.pause) print "monitoring pedals (press ctrl-c to exit)..." while 1: ped.poll() time.sleep(.01)a>