diff options
author | Nat <natcl@hotmail.com> | 2007-07-19 03:52:11 (GMT) |
---|---|---|
committer | Nat <natcl@hotmail.com> | 2007-07-19 03:52:11 (GMT) |
commit | 0c51f7abf29eb0b8534e6e47e4fddba7c0164142 (patch) | |
tree | b8a8612a7044aa89f7524f2624bc7a3ea66db56d /miniTamTam | |
parent | ff470209a9bb85095bb837f465f1c5d3cd9f1c93 (diff) | |
parent | 00178f104ce1c9a0cf449046b1e5d9a9dbf94b46 (diff) |
Merge branch 'master' of git+ssh://natcl@dev.laptop.org/git/projects/tamtam
Diffstat (limited to 'miniTamTam')
-rw-r--r-- | miniTamTam/GenRythm.py | 12 | ||||
-rw-r--r-- | miniTamTam/KeyboardStandAlone.py | 89 | ||||
-rwxr-xr-x | miniTamTam/Loop.py | 7 | ||||
-rw-r--r-- | miniTamTam/miniTamTamMain.py | 112 |
4 files changed, 138 insertions, 82 deletions
diff --git a/miniTamTam/GenRythm.py b/miniTamTam/GenRythm.py index 5e4a873..a9d8f70 100644 --- a/miniTamTam/GenRythm.py +++ b/miniTamTam/GenRythm.py @@ -4,8 +4,10 @@ import Config from Generation.GenerationConstants import GenerationConstants from Generation.Utils import * +from Util import Instrument + class GenRythm: - def drumRythmSequence(self, instrument, nbeats, density, regularity ): + def drumRythmSequence(self, instrumentName, nbeats, density, regularity ): rythmSequence = [] binSelection = [] downBeats = [] @@ -14,28 +16,28 @@ class GenRythm: countDown = 0 onsetTime = None - if Config.INSTRUMENTS[ instrument ].instrumentRegister == Config.PUNCH: + if Instrument.INST[instrumentName].register == 'punch': registerDensity = 0.5 downBeatRecurence = 4 downBeats = [x for x in GenerationConstants.DRUM_PUNCH_ACCENTS[ nbeats ]] for downBeat in downBeats: upBeats.append( downBeat + Config.TICKS_PER_BEAT / 2 ) - if Config.INSTRUMENTS[ instrument ].instrumentRegister == Config.LOW: + if Instrument.INST[instrumentName].register == 'low': registerDensity =1 downBeatRecurence = 4 downBeats = [x for x in GenerationConstants.DRUM_LOW_ACCENTS[ nbeats ]] for downBeat in downBeats: upBeats.append( downBeat + Config.TICKS_PER_BEAT / 2 ) - if Config.INSTRUMENTS[ instrument ].instrumentRegister == Config.MID: + if Instrument.INST[instrumentName].register == 'mid': registerDensity = .75 downBeatRecurence = 1 downBeats = [x for x in GenerationConstants.DRUM_MID_ACCENTS[ nbeats ]] for downBeat in downBeats: upBeats.append( downBeat + Config.TICKS_PER_BEAT / 4 ) - if Config.INSTRUMENTS[ instrument ].instrumentRegister == Config.HIGH: + if Instrument.INST[instrumentName].register == 'high': registerDensity = 1.5 downBeatRecurence = 1 downBeats = [x for x in GenerationConstants.DRUM_HIGH_ACCENTS[ nbeats ]] diff --git a/miniTamTam/KeyboardStandAlone.py b/miniTamTam/KeyboardStandAlone.py index b783070..fcbca15 100644 --- a/miniTamTam/KeyboardStandAlone.py +++ b/miniTamTam/KeyboardStandAlone.py @@ -7,9 +7,12 @@ from Generation.GenerationConstants import GenerationConstants from Util.NoteDB import Note from Util.CSoundNote import CSoundNote from Util.CSoundClient import new_csound_client +from Util import Instrument KEY_MAP_PIANO = Config.KEY_MAP_PIANO +#log = file('/home/olpc/log.tamtam','w') + class KeyboardStandAlone: def __init__( self, recordingFunction, adjustDurationFunction, getCurrentTick, getPlayState, loop ): self.csnd = new_csound_client() @@ -58,53 +61,53 @@ class KeyboardStandAlone: self.trackCount += 1 # If the pressed key is in the keymap if KEY_MAP_PIANO.has_key(key): - # CsoundNote parameters + def playkey(pitch,duration,instrument): + # Create and play the note + self.key_dict[key] = CSoundNote(onset = 0, + pitch = pitch, + amplitude = volume, + pan = 0.5, + duration = duration, + trackId = track, + instrumentId = instrument.instrumentId, + reverbSend = self.reverb, + tied = True, + mode = 'mini') + self.csnd.play(self.key_dict[key], 0.3) + if self.getPlayState(): + recOnset = self.csnd.loopGetTick() + self.onset_dict[key] = recOnset + self.recording( CSoundNote( + onset = recOnset, + pitch = pitch, + amplitude = volume, + pan = 0.5, + duration = 100, + trackId = 0, + decay = .1, + instrumentId = instrument.instrumentId, + reverbSend = self.reverb, + tied = False, + mode = 'mini')) + + instrumentName = self.instrument + #print >>log, 'instrumentName:', instrumentName pitch = KEY_MAP_PIANO[key] - duration = -1 - instrument = self.instrument - - if event.state == gtk.gdk.MOD1_MASK: - pitch = pitch+5 - if instrument[ 0: 4 ] == 'drum': - if GenerationConstants.DRUMPITCH.has_key( pitch ): - pitch = GenerationConstants.DRUMPITCH[ pitch ] + if instrumentName in Instrument.KIT: + #print >>log, 'kit_element: ', Config.KIT_ELEMENT[pitch] + playkey(36,100, Instrument.KIT[instrumentName][ Config.KIT_ELEMENT[pitch] ] ) - if Config.INSTRUMENTS[instrument].kit != None: - instrument = Config.INSTRUMENTS[instrument].kit[pitch].name - pitch = 36 - duration = 100 + else: + if event.state == gtk.gdk.MOD1_MASK: + pitch += 5 - if Config.INSTRUMENTS[instrument].csoundInstrumentId == Config.INST_PERC: #Percussions resonance - duration = 60 + instrument = Instrument.INST[ instrumentName ] + if instrument.csoundInstrumentName == 'inst_perc': #Percussions resonance + playkey( pitch, 60, instrument) + else: + playkey( pitch, -1, instrument) - # Create and play the note - self.key_dict[key] = CSoundNote(onset = 0, - pitch = pitch, - amplitude = volume, - pan = 0.5, - duration = duration, - trackId = track, - instrumentId = Config.INSTRUMENTS[instrument].instrumentId, - reverbSend = self.reverb, - tied = True, - mode = 'mini') - self.csnd.play(self.key_dict[key], 0.3) - if self.getPlayState(): - recOnset = self.csnd.loopGetTick() - self.onset_dict[key] = recOnset - self.recording( CSoundNote( - onset = recOnset, - pitch = pitch, - amplitude = volume, - pan = 0.5, - duration = 100, - trackId = 0, - decay = .1, - instrumentId = Config.INSTRUMENTS[instrument].instrumentId, - reverbSend = self.reverb, - tied = False, - mode = 'mini')) def onKeyRelease(self,widget,event): key = event.hardware_keycode @@ -120,7 +123,7 @@ class KeyboardStandAlone: if KEY_MAP_PIANO.has_key(key): csnote = self.key_dict[key] - if Config.INSTRUMENTSID[ csnote.instrumentId ].csoundInstrumentId == Config.INST_TIED: + if Instrument.INST_byId[ csnote.instrumentId ].csoundInstrumentName == 'inst_tied': csnote.duration = .5 csnote.decay = 0.7 #csnote.amplitude = 1 diff --git a/miniTamTam/Loop.py b/miniTamTam/Loop.py index 4beee57..deb1cad 100755 --- a/miniTamTam/Loop.py +++ b/miniTamTam/Loop.py @@ -6,6 +6,7 @@ from Util.CSoundNote import CSoundNote from Util.CSoundClient import new_csound_client from Util.NoteDB import Note from Util.NoteDB import PARAMETER +from Util import Instrument from Generation.GenerationConstants import GenerationConstants class Loop: @@ -49,10 +50,10 @@ class Loop: pitch = i[1] gain = i[2]*self.volume duration = i[3] - if Config.INSTRUMENTS[instrument].kit != None: + if instrument in Instrument.DRUM: if GenerationConstants.DRUMPITCH.has_key(pitch): pitch = GenerationConstants.DRUMPITCH[pitch] - instrument = Config.INSTRUMENTS[instrument].kit[pitch].name + instrument = Instrument.DRUM[ KIT_ELEMENT[pitch] ].name pitch = 36 return CSoundNote( onset = onset, pitch = pitch, @@ -60,7 +61,7 @@ class Loop: pan = 0.5, duration = duration, trackId = 0, - instrumentId = Config.INSTRUMENTS[instrument].instrumentId, + instrumentId = Instrument.INST[instrument].instrumentId, reverbSend = reverb, tied = False, mode = 'mini') diff --git a/miniTamTam/miniTamTamMain.py b/miniTamTam/miniTamTamMain.py index d17d333..4355abf 100644 --- a/miniTamTam/miniTamTamMain.py +++ b/miniTamTam/miniTamTamMain.py @@ -34,6 +34,7 @@ from RythmGenerator import * from SynthLab.SynthLabWindow import SynthLabWindow from Util.Trackpad import Trackpad from Util.InstrumentPanel import InstrumentPanel +from Util import Instrument Tooltips = Config.Tooltips @@ -67,7 +68,7 @@ class miniTamTamMain(SubActivity): self.loop = Loop(self.beat, sqrt( self.instVolume*0.01 )) self.csnd.loopSetTempo(self.tempo) self.noteList = [] - time.sleep(0.001) + time.sleep(0.001) # why? self.trackpad = Trackpad( self ) for i in range(21): self.csnd.setTrackVolume( 100, i ) @@ -95,7 +96,7 @@ class miniTamTamMain(SubActivity): self.loopSettingsPopup.set_modal(True) self.loopSettingsPopup.add_events( gtk.gdk.BUTTON_PRESS_MASK ) self.loopSettingsPopup.connect("button-release-event", lambda w,e:self.doneLoopSettingsPopup() ) - self.loopSettings = LoopSettings( self.loopSettingsPopup ) + self.loopSettings = LoopSettings( self.loopSettingsPopup, self.loopSettingsPlayStop, self.loopSettingsChannel ) self.loopSettingsPopup.add( self.loopSettings ) @@ -108,6 +109,7 @@ class miniTamTamMain(SubActivity): self.synthLabWindow = None + self.beatPickup = True #self.regenerate() @@ -121,7 +123,7 @@ class miniTamTamMain(SubActivity): self.network.connectMessage( Net.HT_TEMPO_UPDATE, self.processHT_TEMPO_UPDATE ) self.network.connectMessage( Net.PR_SYNC_QUERY, self.processPR_SYNC_QUERY ) self.network.connectMessage( Net.PR_TEMPO_QUERY, self.processPR_TEMPO_QUERY ) - self.network.connectMessage( Net.PR_TEMPO_CHANGE, self.processPR_TEMPO_CHANGE ) + self.network.connectMessage( Net.PR_REQUEST_TEMPO_CHANGE, self.processPR_REQUEST_TEMPO_CHANGE ) # data packing classes self.packer = xdrlib.Packer() @@ -139,8 +141,10 @@ class miniTamTamMain(SubActivity): if os.path.isfile("FORCE_SHARE"): # HOST r = random.random() - print "::::: Sharing as TTDBG%f :::::" % r - self.activity.set_title(_gettext("TTDBG%f" % r)) + #print "::::: Sharing as TTDBG%f :::::" % r + #self.activity.set_title(_gettext("TTDBG%f" % r)) + print "::::: Sharing as TamTam :::::" + self.activity.set_title(_gettext("TamTam")) self.activity.connect( "shared", self.shared ) self.activity.share() elif self.activity._shared_activity: # PEER @@ -246,6 +250,9 @@ class miniTamTamMain(SubActivity): beatSliderBox.pack_start(self.beatSliderBoxImgTop, False, padding=10) beatSliderBox.pack_start(self.beatSlider, True, 20) self.tooltips.set_tip(self.beatSlider,Tooltips.BEAT) + + self.delayedTempo = 0 # used to store tempo updates while the slider is active + self.tempoSliderActive = False tempoSliderBox = gtk.VBox() self.tempoSliderBoxImgTop = gtk.Image() @@ -255,6 +262,7 @@ class miniTamTamMain(SubActivity): tempoSlider.set_inverted(True) tempoSlider.set_size_request(15,320) self.tempoAdjustmentHandler = self.tempoAdjustment.connect("value_changed" , self.handleTempoSliderChange) + tempoSlider.connect("button-press-event", self.handleTempoSliderPress) tempoSlider.connect("button-release-event", self.handleTempoSliderRelease) tempoSliderBox.pack_start(self.tempoSliderBoxImgTop, False, padding=10) tempoSliderBox.pack_start(tempoSlider, True) @@ -325,17 +333,51 @@ class miniTamTamMain(SubActivity): self.rightBox.pack_start(slidersBox, True) self.rightBox.pack_start(geneButtonBox, True) + def loopSettingsChannel(self, channel, value): + self.csnd.setChannel(channel, value) + + def loopSettingsPlayStop(self, state): + if not state: + self.csnd.inputMessage(Config.CSOUND_PLAY_LS_NOTE) + else: + self.csnd.inputMessage(Config.CSOUND_STOP_LS_NOTE) + def doneLoopSettingsPopup(self): if self.loopSettingsBtn.get_active(): self.loopSettingsBtn.set_active(False) def handleLoopSettingsBtn(self, widget, data=None): if widget.get_active(): + + chooser = gtk.FileChooserDialog(title='Edit SoundFile Preference',action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) + + #filter = gtk.FileFilter() + #filter.add_pattern('*.wav') + #chooser.set_filter(filter) + chooser.set_current_folder(Config.PREF_DIR) + + for f in chooser.list_shortcut_folder_uris(): + chooser.remove_shortcut_folder_uri(f) + + if chooser.run() == gtk.RESPONSE_OK: + try: + tempName = chooser.get_filename() + soundName = os.path.split(tempName)[1] + except IOError: + print 'ERROR: failed to load Sound from file %s' % chooser.get_filename() + chooser.destroy() + + self.loopSettings.set_name(soundName) self.loopSettingsPopup.show() - self.loopSettingsPopup.move( 600, 400 ) + self.loopSettingsPopup.move( 600, 200 ) + self.timeoutLoad = gobject.timeout_add(1000, self.load_ls_instrument, soundName) else: self.loopSettingsPopup.hide() - + + def load_ls_instrument(self, name): + self.csnd.load_ls_instrument(name) + gobject.source_remove( self.timeoutLoad ) + def drawInstrumentButtons(self): self.instrumentPanelBox = gtk.HBox() # InstrumentPanel(elf.setInstrument,self.playInstrumentNote, False, self.micRec, self.synthRec) @@ -424,7 +466,9 @@ class miniTamTamMain(SubActivity): def handleGenerationSliderRelease(self, widget, event): self.regularity = widget.get_adjustment().value + self.beatPickup = False self.regenerate() + self.beatPickup = True def pickupNewBeat(self): self.beat = random.randint(2, 12) @@ -451,22 +495,27 @@ class miniTamTamMain(SubActivity): self.regenerate() self.beatPickup = True + def handleTempoSliderPress(self, widget, event): + self.tempoSliderActive = True + def handleTempoSliderRelease(self, widget, event): - #self.tempo = int(widget.get_adjustment().value) - #self.csnd.loopSetTempo(self.tempo) - #self.sequencer.tempo = widget.get_adjustment().value - #self.drumFillin.setTempo(self.tempo) - pass + self.tempoSliderActive = False + if self.network.isPeer() and self.delayedTempo != 0: + if self.tempo != self.delayedTempo: + self.tempoAdjustment.handler_block( self.tempoAdjustmentHandler ) + self.tempoAdjustment.set_value( self.delayedTempo ) + self._updateTempo( self.delayedTempo ) + self.tempoAdjustment.handler_unblock( self.tempoAdjustmentHandler ) + self.delayedTempo = 0 + self.sendSyncQuery() def handleTempoSliderChange(self,adj): - print "handleTempoSliderChange" if self.network.isPeer(): - pass - #self.requestTempoChange(val) + self.requestTempoChange(int(adj.value)) else: - self._updateTempo( int(adj.value), True ) + self._updateTempo( int(adj.value) ) - def _updateTempo( self, val, propagate = False ): + def _updateTempo( self, val ): if self.network.isHost(): t = time.time() @@ -537,7 +586,7 @@ class miniTamTamMain(SubActivity): #data is drum1kit, drum2kit, or drum3kit #print 'HANDLE: Generate Button' self.rythmInstrument = data - instrumentId = Config.INSTRUMENTS[data].instrumentId + instrumentId = Instrument.INST[data].instrumentId for (o,n) in self.noteList : self.csnd.loopUpdate(n, NoteDB.PARAMETER.INSTRUMENT, instrumentId, -1) self.drumFillin.setInstrument( self.rythmInstrument ) @@ -568,7 +617,7 @@ class miniTamTamMain(SubActivity): pan = 0.5, duration = 20, trackId = 1, - instrumentId = Config.INSTRUMENTS[instrument].instrumentId, + instrumentId = Instrument.INST[instrument].instrumentId, reverbSend = 0, tied = False, mode = 'mini'), @@ -604,11 +653,6 @@ class miniTamTamMain(SubActivity): r = str(random.randrange(1,11)) self.playInstrumentNote('guidice' + r) - def getInstrumentList(self): - cleanInstrumentList = [instrument for instrument in Config.INSTRUMENTS.keys() if instrument[0:4] != 'drum' and instrument[0:3] != 'mic' and instrument[0:3] != 'lab' and instrument[0:4] != 'guid'] - cleanInstrumentList.sort(lambda g,l: cmp(Config.INSTRUMENTS[g].category, Config.INSTRUMENTS[l].category) ) - return cleanInstrumentList + ['drum1kit', 'drum2kit', 'drum3kit'] - def onActivate( self, arg ): self.csnd.loopPause() self.csnd.loopClear() @@ -664,7 +708,10 @@ class miniTamTamMain(SubActivity): def buddy_joined( self, activity, buddy ): print "buddy joined " + str(buddy) - print buddy.props.ip4_address + try: + print buddy.props.ip4_address + except: + print "bad ip4_address" if self.network.isHost(): # TODO how do I figure out if this buddy is me? if buddy.props.ip4_address: @@ -698,7 +745,7 @@ class miniTamTamMain(SubActivity): def requestTempoChange( self, val ): self.packer.pack_int(val) - self.network.sendAll( Net.PR_TEMPO_CHANGE, self.packer.get_buffer() ) + self.network.send( Net.PR_REQUEST_TEMPO_CHANGE, self.packer.get_buffer() ) self.packer.reset() #-- Handlers ----------------------------------------------------------- @@ -726,13 +773,15 @@ class miniTamTamMain(SubActivity): self.syncQueryStart.pop(hash) def processHT_TEMPO_UPDATE( self, sock, message, data ): - #print "got tempo update" self.unpacker.reset(data) - self.tempoAdjustment.signal_handler_block( self.tempoAdjustmentHandler ) val = self.unpacker.unpack_int() + if self.tempoSliderActive: + self.delayedTempo = val + return + self.tempoAdjustment.handler_block( self.tempoAdjustmentHandler ) self.tempoAdjustment.set_value( val ) self._updateTempo( val ) - self.tempoAdjustment.signal_handler_unblock( self.tempoAdjustmentHandler ) + self.tempoAdjustment.handler_unblock( self.tempoAdjustmentHandler ) self.sendSyncQuery() def processPR_SYNC_QUERY( self, sock, message, data ): @@ -745,8 +794,9 @@ class miniTamTamMain(SubActivity): self.network.send( Net.HT_TEMPO_UPDATE, self.packer.get_buffer(), to = sock ) self.packer.reset() - def processPR_TEMPO_CHANGE( self, sock, message, data ): - print "got tempo change" + def processPR_REQUEST_TEMPO_CHANGE( self, sock, message, data ): + if self.tempoSliderActive: + return self.unpacker.reset(data) val = self.unpacker.unpack_int() self.tempoAdjustment.set_value( val ) |