diff options
author | Nat <natcl@hotmail.com> | 2007-09-13 15:55:52 (GMT) |
---|---|---|
committer | Nat <natcl@hotmail.com> | 2007-09-13 15:55:52 (GMT) |
commit | e12dbff4dda5aafbaac98f75f0467ef00dc06c32 (patch) | |
tree | 52f74f5a699ca1a2827b333e76a7225b7d768256 /TamTamMini.activity/Mini/MiniSequencer.py | |
parent | b94ccdfd2329ed2d1128a4392e2f67b1e6b704da (diff) |
Activity split
Diffstat (limited to 'TamTamMini.activity/Mini/MiniSequencer.py')
-rw-r--r-- | TamTamMini.activity/Mini/MiniSequencer.py | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/TamTamMini.activity/Mini/MiniSequencer.py b/TamTamMini.activity/Mini/MiniSequencer.py new file mode 100644 index 0000000..991ee13 --- /dev/null +++ b/TamTamMini.activity/Mini/MiniSequencer.py @@ -0,0 +1,139 @@ +import pygtk +pygtk.require( '2.0' ) +import gtk +import gobject +import time +import common.Config as Config +from common.Util.CSoundNote import CSoundNote +from common.Util.CSoundClient import new_csound_client +from common.Util.NoteDB import Note +from common.Util.NoteDB import PARAMETER + +class MiniSequencer: + def __init__( self, recordButtonState, recordOverSensitivity ): + self.notesList = [] + self.sequencer = [] + self.pitchs = [] + self.beat = 4 + self.volume = 0.5 + self.tempo = Config.PLAYER_TEMPO + self.checkOk = 0 + self.tick = 0 + self.id = 1000 + self.csnd = new_csound_client() + self.startLooking = 0 + self.recordState = 0 + self.startPoint = 0 + self.recordButtonState = recordButtonState + self.recordOverSensitivity = recordOverSensitivity + self.playbackTimeout = None + self.playState = 0 + + def setTempo( self, tempo ): + self.tempo = tempo + gobject.source_remove( self.playBackTimeout ) + self.playState = 0 + + def handleRecordButton( self, widget, data=None ): + if not self.startLooking: + if widget.get_active() == True and not self.recordState: + self.button = 1 + self.recordOverSensitivity( 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.clearSequencer() + self.startLooking = 1 + self.startPlayback() + + def handleOverButton( self, widget, data=None ): + if not self.startLooking: + if widget.get_active() == True and not self.recordState: + self.button = 2 + self.startLooking = 1 + self.startPlayback() + + def clearSequencer( self, widget=None ): + for n in self.notesList: + self.csnd.loopDelete(n) + self.notesList = [] + + 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.startLooking: + self.sequencer = [] + self.pitchs = [] + self.recordState = 1 + self.startLooking = 0 + self.recordButtonState(self.button, True) + self.startPoint = int(self.csnd.loopGetTick()) + if self.startPoint == 0: + self.startPoint = self.beat * Config.TICKS_PER_BEAT - 1 + if self.recordState: + self.pitchs.append( note.pitch ) + self.sequencer.append( note ) + + def quantize( self, onset ): + if ( onset % 3 ) == 0: + return onset + elif ( onset % 3 ) == 1: + return ( onset // 3 ) * 3 + elif ( onset % 3 ) == 2: + return ( ( onset // 3 ) + 1 ) * 3 + + def adjustDuration( self, pitch, onset ): + if pitch in self.pitchs: + offset = int(self.csnd.loopGetTick()) + for note in self.sequencer: + if note.pitch == pitch and note.onset == onset: + if offset > note.onset: + note.duration = ( offset - note.onset ) + 4 + else: + note.duration = ( (offset+(self.beat*Config.TICKS_PER_BEAT)) - note.onset ) + 4 + note.onset = self.quantize( note.onset ) + n = Note(0, note.trackId, self.id, note) + self.notesList.append(n) + self.id = self.id + 1 + self.csnd.loopPlay(n,1) #add as active + + self.pitchs.remove( pitch ) + + def adjustSequencerVolume(self, volume): + self.volume = volume + for n in self.notesList: + self.csnd.loopUpdate(n, PARAMETER.AMPLITUDE, n.cs.amplitude*self.volume, 1) + + def handleClock( self ): + currentTick = int(self.csnd.loopGetTick()) + t = currentTick / 3 + if self.tick != t: + self.tick = t + if self.startLooking: + if self.tick in self.beats: + self.recordButtonState(self.button, True) + if self.tick in self.upBeats: + self.recordButtonState(self.button, False) + + if self.recordState: + if currentTick < self.startPoint: + self.checkOk = 1 + if currentTick >= self.startPoint and self.checkOk: + self.checkOk = 0 + self.recordState = 0 + self.recordButtonState(self.button, False) + + return True |