Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Util
diff options
context:
space:
mode:
authorJames <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)
commit0b9902909b213aabb734b6020d9294aaab81e100 (patch)
tree9004d03b2f2472f08a25471f8e6dfa2014166ba6 /Util
parentfc0511ebe83c9bcc3ba33644eb72f37d1dc86b38 (diff)
parentd87a4d57e074047eb7e71d6297a7f7e518aefa9f (diff)
merged
Diffstat (limited to 'Util')
-rw-r--r--Util/CSoundClient.py26
-rw-r--r--Util/CSoundNote.py46
-rw-r--r--Util/NoteDB.py30
-rw-r--r--Util/ThemeWidgets.py135
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):