Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TamTamMini.activity/Mini/MiniSequencer.py
diff options
context:
space:
mode:
Diffstat (limited to 'TamTamMini.activity/Mini/MiniSequencer.py')
-rw-r--r--TamTamMini.activity/Mini/MiniSequencer.py139
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