syncpadhelper.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/usr/bin/python
  2. from padhelper import PadHelper, _Event
  3. from simplemidi.options import *
  4. from simplemidi.midimessage import *
  5. from simplemidi.utils import *
  6. from threading import Thread, Lock
  7. import time
  8. class SyncEvent(_Event):
  9. def __init__(self, evt):
  10. _Event.__init__(self, 0, (evt.tick, evt.evt))
  11. self.startTime=time.time()
  12. def __eq__(self, x):
  13. return x.tick==evt.tick and x.evt==self.evt
  14. class SyncPadHelper(PadHelper):
  15. _DEFAULT_PARAMS=dictAssign(PadHelper._DEFAULT_PARAMS, {
  16. 'forward_all_input': True
  17. })
  18. def __init__(self, adapter, path, params):
  19. param=initParams(SyncPadHelper._DEFAULT_PARAMS, params)
  20. PadHelper.__init__(self, adapter, path, params)
  21. self.lockQueue=Queue()
  22. self.forwardAllKey=param['forward_all_input']
  23. """
  24. def send(self, evt) :
  25. if evt.track==self.padTrack :
  26. if evt.type==MidiType.NOTE_ON:
  27. if (evt.key+self.padTranslate) in self.ledbuttons:
  28. self[evt.key+self.padTranslate]=evt.evt.velocity
  29. if evt.evt.velocity==1:
  30. self.lockQueue
  31. else:
  32. MidiPlayer.send(self, evt)
  33. """
  34. def _findNoteEnd(self, istart, evt):
  35. for i in range(istart+1, len(self.events)):
  36. e=self.events[i]
  37. if e.type==MidiType.NOTE_ON and e.key==evt.key and e.evt.velocity==0:
  38. return e.transpose(self.transposeNote)
  39. return None
  40. def inputMessage(self, delta, msg):
  41. channel=msg.channel
  42. if msg.getType()==MidiType.NOTE_ON:
  43. x=self.lockQueue.peek()
  44. msg.key-=self.padTranslate
  45. if x!=None:
  46. if x.channel==msg.channel and x.key+self.transposeNote==(msg.key):
  47. self.lockQueue.dequeue()
  48. self.port.send(msg)
  49. elif self.forwardAllKey: self.port.send(msg)
  50. elif self.forwardAllKey: self.port.send(msg)
  51. elif msg.getType()==MidiType.NOTE_OFF:
  52. msg.key-=self.padTranslate
  53. self.port.send(msg)
  54. elif self.forwardAllKey:
  55. self.port.send(msg)
  56. def waitForEvent(self, evt):
  57. tick=evt.tick
  58. #DEBUG("waiting "+str(tick-self.tick)+" ticks for: ",evt)
  59. if tick<=0: return
  60. while not self.lockQueue.isEmpty():
  61. time.sleep(0.001)
  62. t=self.tick2time(tick-self.tick)
  63. time.sleep(t)
  64. self.tick=tick
  65. def play(self):
  66. self._load_track_event()
  67. self.tick=0
  68. self.startTime=time.time()
  69. for i in range(len(self.events)):
  70. evt=self.events[i].transpose(self.transposeNote)
  71. self.waitForEvent(evt)
  72. #self.addToQueue(i,3)
  73. if evt.track==self.padTrack and evt.type==MidiType.NOTE_ON:
  74. self[evt.key+self.padTranslate+self.transposeNote]=evt.evt.velocity
  75. if evt.evt.velocity==1:
  76. end=self._findNoteEnd(i, self.events[i])
  77. self.lockQueue.enqueue(evt)
  78. else:
  79. self.send(evt)