diff options
Diffstat (limited to 'miniTamTam/RythmPlayer.py')
-rw-r--r-- | miniTamTam/RythmPlayer.py | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/miniTamTam/RythmPlayer.py b/miniTamTam/RythmPlayer.py new file mode 100644 index 0000000..8b339e9 --- /dev/null +++ b/miniTamTam/RythmPlayer.py @@ -0,0 +1,104 @@ +import pygtk +pygtk.require( '2.0' ) +import gtk +import gobject +import time +import Config +from Util.CSoundNote import CSoundNote +from Util.CSoundClient import new_csound_client + +class RythmPlayer: + def __init__( self, recordButtonState ): + self.notesList = [] + self.sequencer = [] + self.pitchs = [] + self.tempo = 120 + self.tickDuration = 60. / self.tempo / 12. + self.tick = 15 + self.csnd = new_csound_client() + self.sequencerPlayback = 0 + self.startLooking = 0 + self.recordState = 0 + self.recordButtonState = recordButtonState + self.playbackTimeout = None + self.beat = 4 + self.playState = 0 + + def setTempo( self, tempo ): + self.tempo = tempo + self.tickDuration = 60. / self.tempo / 12. + gobject.source_remove( self.playBackTimeout ) + self.playState = 0 + self.startPlayback() + + def handleRecordButton( self, widget, data=None ): + if not self.startLooking: + if widget.get_active() == True: + self.beats = [i*4 for i in range(self.beat)] + self.upBeats = [i+2 for i in self.beats] + self.realTick = [i for i in range(self.beat*4)] + self.startLooking = 1 + self.startPlayback() + + def getPlayState( self ): + return self.playState + + def startPlayback( self ): + if not self.playState: + self.playbackTimeout = gobject.timeout_add( int(60000/self.tempo/12), self.handleClock ) + self.handleClock() + self.playState = 1 + + def stopPlayback( self ): + if self.playbackTimeout != None: + gobject.source_remove( self.playbackTimeout ) + self.playbackTimeout = None + self.playState = 0 + + def recording( self, note ): + if self.recordState: + self.pitchs.append( note.pitch ) + self.sequencer.append( note ) + + def adjustDuration( self, pitch, onset ): + if pitch in self.pitchs: + offset = self.csnd.loopGetTick() / 3 + for note in self.sequencer: + if note.pitch == pitch and note.onset == onset: + if offset > note.onset: + note.duration = ( offset - note.onset ) * 3 + 3 + else: + note.duration = ( (offset+(self.beat*4)) - note.onset ) * 3 + 3 + theNote = (note.onset, note) + #sc_loop_addScoreEvent15( theNote ) + self.pitchs.remove( pitch ) + + def handleClock( self ): + t = self.csnd.loopGetTick() / 3 + if self.tick != t: + self.tick = t +# if self.sequencer and self.sequencerPlayback: +# for note in self.sequencer: +# if self.realTick[note.onset] == self.tick: +# self.csnd.sendText(note.getText(self.tickDuration,0)) #play + + if self.startLooking: + self.sequencerPlayback = 0 + if self.tick in self.beats: + self.recordButtonState(True) + if self.tick in self.upBeats: + self.recordButtonState(False) + if self.tick == 0: + self.sequencer = [] + self.pitchs = [] + self.recordState = 1 + self.startLooking = 0 + + if self.tick >= (4 * self.beat - 1): + if self.recordState: + self.recordState = 0 + self.sequencerPlayback = 1 + self.recordButtonState(False) + + return True + |