diff options
author | James <olpc@xo-05-28-3A.localdomain> | 2007-08-25 20:21:51 (GMT) |
---|---|---|
committer | James <olpc@xo-05-28-3A.localdomain> | 2007-08-25 20:21:51 (GMT) |
commit | 0b9902909b213aabb734b6020d9294aaab81e100 (patch) | |
tree | 9004d03b2f2472f08a25471f8e6dfa2014166ba6 /Util | |
parent | fc0511ebe83c9bcc3ba33644eb72f37d1dc86b38 (diff) | |
parent | d87a4d57e074047eb7e71d6297a7f7e518aefa9f (diff) |
merged
Diffstat (limited to 'Util')
-rw-r--r-- | Util/CSoundClient.py | 26 | ||||
-rw-r--r-- | Util/CSoundNote.py | 46 | ||||
-rw-r--r-- | Util/NoteDB.py | 30 | ||||
-rw-r--r-- | Util/ThemeWidgets.py | 135 |
4 files changed, 193 insertions, 44 deletions
diff --git a/Util/CSoundClient.py b/Util/CSoundClient.py index 8f4df73..d5a3e37 100644 --- a/Util/CSoundClient.py +++ b/Util/CSoundClient.py @@ -26,7 +26,8 @@ class _CSoundClientPlugin: ATTACK, \ DECAY, \ FILTERTYPE, \ - FILTERCUTOFF ) = range(12) + FILTERCUTOFF, \ + INSTRUMENT2 ) = range(13) def __init__(self): sc_initialize( Config.PLUGIN_UNIVORC, Config.PLUGIN_DEBUG, @@ -204,6 +205,8 @@ class _CSoundClientPlugin: sc_loop_updateEvent( (page<<16)+id, self.FILTERTYPE, value, cmd) elif (parameter == NoteDB.PARAMETER.FILTERCUTOFF): sc_loop_updateEvent( (page<<16)+id, self.FILTERCUTOFF, value, cmd) + elif (parameter == NoteDB.PARAMETER.INSTRUMENT2): + sc_loop_updateEvent( (page<<16)+id, self.INSTRUMENT2, value, cmd) else: if (Config.DEBUG > 0): print 'ERROR: loopUpdate(): unsupported parameter change' @@ -234,11 +237,12 @@ class _CSoundClientPlugin: csnote.filterCutoff, csnote.tied, csnote.instrumentId, - csnote.mode) + csnote.mode, + csnote.instrumentId2 ) def _csnote_to_array1( self, storage, onset, pitch, amplitude, pan, duration, trackId, attack, decay, reverbSend, filterType, filterCutoff, - tied, instrumentId, mode): + tied, instrumentId, mode, instrumentId2 = -1): rval=storage instrument = Config.INSTRUMENTSID[instrumentId] @@ -262,6 +266,7 @@ class _CSoundClientPlugin: if duration < 0: duration = -1 else: +<<<<<<< HEAD:Util/CSoundClient.py if mode == 'mini': instrument_id_offset = 0 elif mode == 'edit': @@ -275,6 +280,7 @@ class _CSoundClientPlugin: instrument_id_offset = 0 else: instrument_id_offset = 100 + rval[0] = (instrument.csoundInstrumentId + \ (trackId+1) + instrument_id_offset) + trackId * 0.01 rval[1] = onset @@ -291,6 +297,20 @@ class _CSoundClientPlugin: rval[12]= instrument.loopStart rval[13]= instrument.loopEnd rval[14]= instrument.crossDur + + if instrumentId2 != -1: + instrument2 = Config.INSTRUMENTSID[instrumentId2] + csInstrumentId2 = (instrument2.csoundInstrumentId + 100) * 0.0001 + rval[15] = Config.INSTRUMENT_TABLE_OFFSET + instrumentId2 + csInstrumentId2 + rval[16] = instrument2.loopStart + rval[17] = instrument2.loopEnd + rval[18] = instrument2.crossDur + else: + rval[15] = -1 + rval[16] = 0 + rval[17] = 0 + rval[18] = 0 + return rval _Client = None diff --git a/Util/CSoundNote.py b/Util/CSoundNote.py index d41fc11..7b2019e 100644 --- a/Util/CSoundNote.py +++ b/Util/CSoundNote.py @@ -1,23 +1,23 @@ import Config -from Generation.GenerationConstants import GenerationConstants class CSoundNote : def __init__( self, - onset, - pitch, - amplitude, - pan, - duration, - trackId, - instrumentId = Config.INSTRUMENTS["flute"].instrumentId, - attack = 0.002, - decay = 0.098, - reverbSend = 0.1, - filterType = 0, + onset, + pitch, + amplitude, + pan, + duration, + trackId, + instrumentId = Config.INSTRUMENTS["flute"].instrumentId, + attack = 0.005, + decay = 0.098, + reverbSend = 0.1, + filterType = 0, filterCutoff = 1000, tied = False, - mode = 'edit' ): - + mode = 'edit', + instrumentId2 = -1 ): + self.onset = onset self.pitch = pitch self.amplitude = amplitude @@ -34,6 +34,14 @@ class CSoundNote : self.filterCutoff = filterCutoff self.tied = tied self.mode = mode + self.instrumentId2 = instrumentId2 + + def clone( self ): + return CSoundNote( self.onset, self.pitch, self.amplitude, self.pan, + self.duration, self.trackId, self.instrumentId, + self.attack, self.decay, self.reverbSend, + self.filterType, self.filterCutoff, self.tied, + self.mode, self.instrumentId2 ) def __getstate__unused(self): return {'onset': self.onset, @@ -67,13 +75,3 @@ class CSoundNote : self.tied = dict['tied'] self.mode = dict['mode'] self.nchanges = 0 - - def clone( self ): - return CSoundNote( self.onset, self.pitch, self.amplitude, self.pan, - self.duration, self.trackId, self.instrumentId, - self.attack, self.decay, self.reverbSend, - self.filterType, self.filterCutoff, self.tied, - self.mode ) - - - diff --git a/Util/NoteDB.py b/Util/NoteDB.py index f6ec5de..2cdf9c9 100644 --- a/Util/NoteDB.py +++ b/Util/NoteDB.py @@ -14,8 +14,9 @@ class PARAMETER: ATTACK, \ DECAY, \ FILTERTYPE, \ - FILTERCUTOFF \ - = range(13) #python-stye enum + FILTERCUTOFF, \ + INSTRUMENT2 \ + = range(14) #python-stye enum class Note: def __init__( self, page, track, id, cs ): @@ -30,7 +31,7 @@ class Page: self.ticks = beats*Config.TICKS_PER_BEAT self.color = color - + if not instruments: self.instruments = [ Config.INSTRUMENTS["kalimba"].instrumentId for i in range(Config.NUMBER_OF_TRACKS-1) ] + [ Config.INSTRUMENTS["drum1kit"].instrumentId ] else: @@ -213,7 +214,7 @@ class NoteDB: i += 1 self.tune = self.tune[:at] + sorted + self.tune[at:] - + #self._updateBeatsBefore( low ) for l in self.pageListeners: @@ -242,9 +243,9 @@ class NoteDB: self.deleteNotes( dstream + [-1] ) if len(ustream): self.updateNotes( ustream + [-1] ) - + self.pages[page].beats = value - self.pages[page].ticks = ticks + self.pages[page].ticks = ticks #self._updateBeatsBefore(self.tune.index(page)) elif parameter == PARAMETER.PAGE_COLOR: self.pages[page].color = value @@ -302,7 +303,7 @@ class NoteDB: # for i in range(ind, len(self.tune)): # self.beatsBefore[self.tune[ind]] = beats # beats += self.pages[self.tune[ind]].beats - + #======================================================= @@ -322,6 +323,19 @@ class NoteDB: if len(stream): self.updateNotes( stream + [-1] ) + def setInstrument2( self, pages, track, instrumentId ): + stream = [] + for page in pages: + #self.pages[page].instruments[track] = instrumentId + notes = self.getNotesByTrack( page, track ) + sub = [] + for note in notes: + sub.append( note.id ) + sub.append( instrumentId ) + if len(sub): + stream += [ page, track, PARAMETER.INSTRUMENT2, len(sub)//2 ] + sub + if len(stream): + self.updateNotes( stream + [-1] ) #======================================================= # Note Functions @@ -482,6 +496,8 @@ class NoteDB: self.noteD[page][track][id].cs.filterType = value elif parameter == PARAMETER.FILTERCUTOFF: self.noteD[page][track][id].cs.filterCutoff = value + elif parameter == PARAMETER.INSTRUMENT2: + self.noteD[page][track][id].cs.instrumentId2 = value for par in self.parasiteList.keys(): self.parasiteD[page][track][par][id].updateParameter( parameter, value ) diff --git a/Util/ThemeWidgets.py b/Util/ThemeWidgets.py index 1771edc..06828ca 100644 --- a/Util/ThemeWidgets.py +++ b/Util/ThemeWidgets.py @@ -3,6 +3,7 @@ pygtk.require( '2.0' ) import gtk from sugar.graphics.combobox import ComboBox +from sugar.graphics.palette import Palette, WidgetInvoker class ITYPE: @@ -735,6 +736,8 @@ class ImageButton(gtk.Button): self.iheight = {} self.iheightDIV2 = {} + self.backgroundFill = backgroundFill + def prepareImage( name, path ): pix = gtk.gdk.pixbuf_new_from_file(path) if pix.get_has_alpha(): @@ -794,13 +797,45 @@ class ImageButton(gtk.Button): if self.itype[self.curImage] == ITYPE.PIXBUF: self.window.draw_pixbuf( self.gc, self.image[self.curImage], 0, 0, self.drawX - self.iwidthDIV2[self.curImage], self.drawY - self.iheightDIV2[self.curImage], self.iwidth[self.curImage], self.iheight[self.curImage], gtk.gdk.RGB_DITHER_NONE) else: - self.window.draw_drawable( self.gc, self.image[self.curImage], 0, 0, self.drawX - self.iwidthDIV2[self.curImage], self.drawY - self.iheightDIV2[self.curImage], self.iwidth[self.curImage], self.iheight[self.curImage] ) + self.window.draw_drawable( self.gc, self.image[self.curImage], 0, 0, self.drawX - self.iwidthDIV2[self.curImage], self.drawY - self.iheightDIV2[self.curImage], self.iwidth[self.curImage], self.iheight[self.curImage] ) return True - def load_pixmap(self, name, pixmap): + def setImage(self, name, pix): if name == "main" and self.image["main"] == self.image["enter"]: - self.image["enter"] = pixmap - self.image[name] = pixmap + updateEnter = True + else: + updateEnter = False + + if pix.get_has_alpha(): + if self.backgroundFill == None: + self.image[name] = pix + self.itype[name] = ITYPE.PIXBUF + else: + self.image[name] = gtk.gdk.Pixmap( win, pix.get_width(), pix.get_height() ) + colormap = self.get_colormap() + self.gc.foreground = colormap.alloc_color( self.backgroundFill, True, True ) + self.image[name].draw_rectangle( self.gc, True, 0, 0, pix.get_width(), pix.get_height() ) + self.image[name].draw_pixbuf( self.gc, pix, 0, 0, 0, 0, pix.get_width(), pix.get_height(), gtk.gdk.RGB_DITHER_NONE ) + self.itype[name] = ITYPE.PIXMAP + else: + self.image[name] = gtk.gdk.Pixmap( win, pix.get_width(), pix.get_height() ) + self.image[name].draw_pixbuf( self.gc, pix, 0, 0, 0, 0, pix.get_width(), pix.get_height(), gtk.gdk.RGB_DITHER_NONE ) + self.itype[name] = ITYPE.PIXMAP + self.iwidth[name] = pix.get_width() + self.iwidthDIV2[name] = self.iwidth[name]//2 + self.iheight[name] = pix.get_height() + self.iheightDIV2[name] = self.iheight[name]//2 + + if updateEnter: + self.image["enter"] = self.image["main"] + self.itype["enter"] = self.itype["main"] + self.iwidth["enter"] = self.iwidth["main"] + self.iwidthDIV2["enter"] = self.iwidthDIV2["main"] + self.iheight["enter"] = self.iheight["main"] + self.iheightDIV2["enter"] = self.iheightDIV2["main"] + self.connect('enter-notify-event',self.on_btn_enter) + self.connect('leave-notify-event',self.on_btn_leave) + self.queue_draw() def on_btn_press(self, widget, event): @@ -824,6 +859,10 @@ class ImageButton(gtk.Button): self.curImage = self.upImage self.down = False self.queue_draw() + + def set_palette(self, palette): + self._palette = palette + self._palette.props.invoker = WidgetInvoker(self) class ImageToggleButton(gtk.ToggleButton): @@ -841,6 +880,8 @@ class ImageToggleButton(gtk.ToggleButton): self.iwidthDIV2 = {} self.iheight = {} self.iheightDIV2 = {} + + self.backgroundFill = backgroundFill def prepareImage( name, path ): pix = gtk.gdk.pixbuf_new_from_file(path) @@ -902,10 +943,42 @@ class ImageToggleButton(gtk.ToggleButton): self.window.draw_drawable( self.gc, self.image[self.curImage], 0, 0, self.drawX - self.iwidthDIV2[self.curImage], self.drawY - self.iheightDIV2[self.curImage], self.iwidth[self.curImage], self.iheight[self.curImage] ) return True - def load_pixmap(self, name, pixmap): + def setImage(self, name, pix): if name == "main" and self.image["main"] == self.image["enter"]: - self.image["enter"] = pixmap - self.image[name] = pixmap + updateEnter = True + else: + updateEnter = False + + if pix.get_has_alpha(): + if self.backgroundFill == None: + self.image[name] = pix + self.itype[name] = ITYPE.PIXBUF + else: + self.image[name] = gtk.gdk.Pixmap( win, pix.get_width(), pix.get_height() ) + colormap = self.get_colormap() + self.gc.foreground = colormap.alloc_color( self.backgroundFill, True, True ) + self.image[name].draw_rectangle( self.gc, True, 0, 0, pix.get_width(), pix.get_height() ) + self.image[name].draw_pixbuf( self.gc, pix, 0, 0, 0, 0, pix.get_width(), pix.get_height(), gtk.gdk.RGB_DITHER_NONE ) + self.itype[name] = ITYPE.PIXMAP + else: + self.image[name] = gtk.gdk.Pixmap( win, pix.get_width(), pix.get_height() ) + self.image[name].draw_pixbuf( self.gc, pix, 0, 0, 0, 0, pix.get_width(), pix.get_height(), gtk.gdk.RGB_DITHER_NONE ) + self.itype[name] = ITYPE.PIXMAP + self.iwidth[name] = pix.get_width() + self.iwidthDIV2[name] = self.iwidth[name]//2 + self.iheight[name] = pix.get_height() + self.iheightDIV2[name] = self.iheight[name]//2 + + if updateEnter: + self.image["enter"] = self.image["main"] + self.itype["enter"] = self.itype["main"] + self.iwidth["enter"] = self.iwidth["main"] + self.iwidthDIV2["enter"] = self.iwidthDIV2["main"] + self.iheight["enter"] = self.iheight["main"] + self.iheightDIV2["enter"] = self.iheightDIV2["main"] + self.connect('enter-notify-event',self.on_btn_enter) + self.connect('leave-notify-event',self.on_btn_leave) + self.queue_draw() def toggleImage(self, widget): @@ -944,6 +1017,10 @@ class ImageToggleButton(gtk.ToggleButton): else: self.curImage = "alt" self.queue_draw() + + def set_palette(self, palette): + self._palette = palette + self._palette.props.invoker = WidgetInvoker(self) class ImageRadioButton(gtk.RadioButton): @@ -962,6 +1039,8 @@ class ImageRadioButton(gtk.RadioButton): self.iheight = {} self.iheightDIV2 = {} + self.backgroundFill = backgroundFill + def prepareImage( name, path ): pix = gtk.gdk.pixbuf_new_from_file(path) if pix.get_has_alpha(): @@ -1022,10 +1101,42 @@ class ImageRadioButton(gtk.RadioButton): self.window.draw_drawable( self.gc, self.image[self.curImage], 0, 0, self.drawX - self.iwidthDIV2[self.curImage], self.drawY - self.iheightDIV2[self.curImage], self.iwidth[self.curImage], self.iheight[self.curImage] ) return True - def load_pixmap(self, name, pixmap): + def setImage(self, name, pix): if name == "main" and self.image["main"] == self.image["enter"]: - self.image["enter"] = pixmap - self.image[name] = pixmap + updateEnter = True + else: + updateEnter = False + + if pix.get_has_alpha(): + if self.backgroundFill == None: + self.image[name] = pix + self.itype[name] = ITYPE.PIXBUF + else: + self.image[name] = gtk.gdk.Pixmap( win, pix.get_width(), pix.get_height() ) + colormap = self.get_colormap() + self.gc.foreground = colormap.alloc_color( self.backgroundFill, True, True ) + self.image[name].draw_rectangle( self.gc, True, 0, 0, pix.get_width(), pix.get_height() ) + self.image[name].draw_pixbuf( self.gc, pix, 0, 0, 0, 0, pix.get_width(), pix.get_height(), gtk.gdk.RGB_DITHER_NONE ) + self.itype[name] = ITYPE.PIXMAP + else: + self.image[name] = gtk.gdk.Pixmap( win, pix.get_width(), pix.get_height() ) + self.image[name].draw_pixbuf( self.gc, pix, 0, 0, 0, 0, pix.get_width(), pix.get_height(), gtk.gdk.RGB_DITHER_NONE ) + self.itype[name] = ITYPE.PIXMAP + self.iwidth[name] = pix.get_width() + self.iwidthDIV2[name] = self.iwidth[name]//2 + self.iheight[name] = pix.get_height() + self.iheightDIV2[name] = self.iheight[name]//2 + + if updateEnter: + self.image["enter"] = self.image["main"] + self.itype["enter"] = self.itype["main"] + self.iwidth["enter"] = self.iwidth["main"] + self.iwidthDIV2["enter"] = self.iwidthDIV2["main"] + self.iheight["enter"] = self.iheight["main"] + self.iheightDIV2["enter"] = self.iheightDIV2["main"] + self.connect('enter-notify-event',self.on_btn_enter) + self.connect('leave-notify-event',self.on_btn_leave) + self.queue_draw() def toggleImage( self, widget ): @@ -1065,6 +1176,10 @@ class ImageRadioButton(gtk.RadioButton): self.curImage = "alt" self.queue_draw() + def set_palette(self, palette): + self._palette = palette + self._palette.props.invoker = WidgetInvoker(self) + class keyButton(gtk.Button): import cairo def __init__(self, width, height, fillcolor, strokecolor): |