123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #!/usr/bin/python
- from padhelper import PadHelper, _Event
- from simplemidi.options import *
- from simplemidi.midimessage import *
- from simplemidi.utils import *
- from threading import Thread, Lock
- import time
- class SyncEvent(_Event):
- def __init__(self, evt):
- _Event.__init__(self, 0, (evt.tick, evt.evt))
- self.startTime=time.time()
-
- def __eq__(self, x):
- return x.tick==evt.tick and x.evt==self.evt
- class SyncPadHelper(PadHelper):
-
- _DEFAULT_PARAMS=dictAssign(PadHelper._DEFAULT_PARAMS, {
- 'forward_all_input': True
- })
-
- def __init__(self, adapter, path, params):
- param=initParams(SyncPadHelper._DEFAULT_PARAMS, params)
- PadHelper.__init__(self, adapter, path, params)
- self.lockQueue=Queue()
- self.forwardAllKey=param['forward_all_input']
-
-
- """
- def send(self, evt) :
- if evt.track==self.padTrack :
- if evt.type==MidiType.NOTE_ON:
- if (evt.key+self.padTranslate) in self.ledbuttons:
- self[evt.key+self.padTranslate]=evt.evt.velocity
- if evt.evt.velocity==1:
- self.lockQueue
- else:
- MidiPlayer.send(self, evt)
- """
-
- def _findNoteEnd(self, istart, evt):
- for i in range(istart+1, len(self.events)):
- e=self.events[i]
- if e.type==MidiType.NOTE_ON and e.key==evt.key and e.evt.velocity==0:
- return e.transpose(self.transposeNote)
- return None
-
- def inputMessage(self, delta, msg):
- channel=msg.channel
- if msg.getType()==MidiType.NOTE_ON:
- x=self.lockQueue.peek()
- msg.key-=self.padTranslate
- if x!=None:
- if x.channel==msg.channel and x.key+self.transposeNote==(msg.key):
- self.lockQueue.dequeue()
- self.port.send(msg)
-
- elif self.forwardAllKey: self.port.send(msg)
-
- elif self.forwardAllKey: self.port.send(msg)
-
- elif msg.getType()==MidiType.NOTE_OFF:
- msg.key-=self.padTranslate
- self.port.send(msg)
-
- elif self.forwardAllKey:
- self.port.send(msg)
-
-
- def waitForEvent(self, evt):
- tick=evt.tick
- #DEBUG("waiting "+str(tick-self.tick)+" ticks for: ",evt)
- if tick<=0: return
- while not self.lockQueue.isEmpty():
- time.sleep(0.001)
- t=self.tick2time(tick-self.tick)
- time.sleep(t)
- self.tick=tick
-
-
- def play(self):
- self._load_track_event()
- self.tick=0
- self.startTime=time.time()
- for i in range(len(self.events)):
- evt=self.events[i].transpose(self.transposeNote)
- self.waitForEvent(evt)
-
- #self.addToQueue(i,3)
-
-
- if evt.track==self.padTrack and evt.type==MidiType.NOTE_ON:
- self[evt.key+self.padTranslate+self.transposeNote]=evt.evt.velocity
- if evt.evt.velocity==1:
- end=self._findNoteEnd(i, self.events[i])
- self.lockQueue.enqueue(evt)
- else:
- self.send(evt)
-
|