padhelper.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #!/usr/bin/python
  2. from simplemidi.midiplayer import MidiPlayer, _Event, sortTime
  3. from simplemidi.midiio import MidiOutputPort
  4. from simplemidi.midimessage import MidiType, MidiMessage, NoteOn, NoteOff, MidiVoiceMessage
  5. from pad import Pad
  6. from simplemidi.options import *
  7. import time
  8. from simplemidi.midieventtrigger import *
  9. class PadHelper(MidiPlayer, Pad):
  10. _DEFAULT_PARAMS=dictAssign(MidiPlayer._DEFAULT_PARAMS,
  11. Pad._DEFAULT_PARAMS,{
  12. 'port_in': {
  13. 'client_name' : 'Pad Helper',
  14. 'port_name' : 'Pad In'
  15. },
  16. 'port_out': {
  17. 'client_name' : 'Pad Helper',
  18. 'port_name' : 'Pad Out'
  19. },
  20. 'port_sound_out': {
  21. 'client_name' : 'MidiPlayer'
  22. },
  23. 'pad_track': -1,
  24. 'pad_translate' : 0,
  25. 'n_color' : 1
  26. })
  27. def __init__(self, adapter, path, params):
  28. param=initParams(PadHelper._DEFAULT_PARAMS, params)
  29. Pad.__init__(self, adapter, param)
  30. MidiPlayer.__init__(self, path, param)
  31. self.padTrack = param['pad_track']
  32. self.padTranslate=param['pad_translate']
  33. self.nColor=param['n_color']
  34. if self.padTrack==-1:
  35. if self.nTotalTracks>1: self.padTrack=1
  36. else: self.padTrack=0
  37. def setPadTrack(self, n):
  38. self.padTrack=n
  39. self._load_track_event()
  40. def setNKColor(self, n):
  41. self.nColor=n
  42. self._load_track_event()
  43. def setPadTranslate(self, n):
  44. self.padTranslate=n
  45. def onNoteOn(self, ch, idx, val):
  46. self.port.noteOn(ch, idx-self.padTranslate, val)
  47. def onNoteOff(self, ch, idx, val):
  48. self.port.noteOff(ch, idx-self.padTranslate, val)
  49. def send(self, evt) :
  50. if evt.track==self.padTrack :
  51. if evt.type==MidiType.NOTE_ON:
  52. if (evt.key+self.padTranslate+self.transposeNote) in self.ledbuttons: self[evt.key+self.padTranslate+self.transposeNote]=evt.evt.velocity
  53. else:
  54. MidiPlayer.send(self, evt)
  55. def __note_to_notify(self, track, evt, delta, value):
  56. ch=evt.channel
  57. key=evt.key
  58. return _Event(track, ( evt.tick-delta, NoteOn.new(1, key, value)))
  59. #return _Event(track, ( evt.tick-delta, NoteOn.new(ch, key, value)))
  60. def __notify_off(self, track, evt):
  61. return self.__note_to_notify(track, evt, 0, 0)
  62. def __notify_on(self, track, evt):
  63. return self.__note_to_notify(track, evt, 0, 1)
  64. def __notify_croche(self, track, evt):
  65. return self.__note_to_notify(track, evt, self.tickCroche(), 5)
  66. def __notify_noire(self, track, evt):
  67. return self.__note_to_notify(track, evt, self.tickNoire(), 3)
  68. def __notify_blanche(self, track, evt):
  69. return self.__note_to_notify(track, evt, self.tickBlanche(), 4)
  70. def _load_track_event(self):
  71. self.events=[]
  72. track=self.padTrack
  73. for evt in self.tracks[track]:
  74. e=_Event(track, evt)
  75. if e.type==MidiType.NOTE_ON:
  76. if self.nColor>=0:
  77. self.events.append(self.__notify_on(track,e))
  78. if self.nColor>=1:
  79. self.events.append(self.__notify_croche(track,e))
  80. if self.nColor>=2:
  81. self.events.append(self.__notify_noire(track,e))
  82. if self.nColor>=3:
  83. self.events.append(self.__notify_blanche(track,e))
  84. if e.type==MidiType.NOTE_OFF:
  85. self.events.append(self.__notify_off(track,e))
  86. for track in range(len(self.tracks)):
  87. if track==self.padTrack: continue
  88. for evt in self.tracks[track]:
  89. self.events.append(_Event(track, evt))
  90. self.events.sort(key=sortTime)
  91. def onControlChange(self, ch, key, value):
  92. if ( ch==1 and key==56):
  93. rmin=0.25
  94. rmax=4
  95. if value==0: ratio=rmin
  96. else: ratio=(value/127.0)*(rmax-rmin)+rmin
  97. self.setBpmRatio(ratio)
  98. DEBUG("BPM ratio: %.0f" % ratio, " BPM: %.0f" % (self.bpm*ratio))
  99. def play(self):
  100. self._load_track_event()
  101. self.tick=0
  102. self.startTime=time.time()
  103. for evt in self.events:
  104. evt=evt.transpose(self.transposeNote)
  105. self.waitForEvent(evt)
  106. #if evt.track==self.padTrack and evt.type==MidiType.NOTE_ON:
  107. # self[evt.key+self.padTranslate]=evt.evt.velocity
  108. self.send(evt)