Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Jam/JamMain.py
diff options
context:
space:
mode:
authoramartin <olpc@xo-05-28-21.localdomain>2007-08-26 11:40:29 (GMT)
committer amartin <olpc@xo-05-28-21.localdomain>2007-08-26 11:40:29 (GMT)
commit87defb862218ca2e4d706e1affa200a6cae2032e (patch)
tree06fc2af30b193d180a571e4a3bc81a65733a8f3c /Jam/JamMain.py
parent6a209f15052e84430279a5fa66c2d661513c067f (diff)
Jam
Diffstat (limited to 'Jam/JamMain.py')
-rw-r--r--Jam/JamMain.py196
1 files changed, 150 insertions, 46 deletions
diff --git a/Jam/JamMain.py b/Jam/JamMain.py
index 6645b97..1421da3 100644
--- a/Jam/JamMain.py
+++ b/Jam/JamMain.py
@@ -6,14 +6,21 @@ import gtk
from SubActivity import SubActivity
import Config
+from gettext import gettext as _
+import sugar.graphics.style as style
from Jam.Desktop import Desktop
import Jam.Picker as Picker
+import Jam.Block as Block
+from Jam.Toolbars import DesktopToolbar
+
from Util.CSoundNote import CSoundNote
from Util.CSoundClient import new_csound_client
+import Util.InstrumentDB as InstrumentDB
from Fillin import Fillin
from RythmGenerator import generator
+from Generation.GenerationConstants import GenerationConstants
from Util.NoteDB import Note
from math import sqrt
@@ -25,6 +32,8 @@ class JamMain(SubActivity):
self.activity = activity
+ self.instrumentDB = InstrumentDB.getRef()
+
#-- initial settings ----------------------------------
self.tempo = Config.PLAYER_TEMPO
self.volume = 50
@@ -36,10 +45,83 @@ class JamMain(SubActivity):
self.csnd.setMasterVolume( self.volume )
self.csnd.loopSetTempo( self.tempo )
- #======================================================
- # GUI
+ #-- Drawing -------------------------------------------
+ win = gtk.gdk.get_default_root_window()
+ self.gc = gtk.gdk.GC( win )
+ colormap = gtk.gdk.colormap_get_system()
+ self.colors = { "bg": colormap.alloc_color( Config.PANEL_BCK_COLOR ),
+ "Picker_Bg": colormap.alloc_color( "#404040" ),
+ "Picker_Bg_Inactive": colormap.alloc_color( "#808080" ),
+ #"Picker_Bg": colormap.alloc_color( style.COLOR_TOOLBAR_GREY.get_html() ),
+ #"Picker_Bg_Inactive": colormap.alloc_color( style.COLOR_BUTTON_GREY.get_html() ),
+ "Picker_Fg": colormap.alloc_color( style.COLOR_WHITE.get_html() ),
+ "Border_Active": colormap.alloc_color( "#FF6000" ),
+ "Border_Inactive": colormap.alloc_color( "#8D8D8D" ),
+ "Border_Highlight": colormap.alloc_color( "#FFFFFF" ),
+ "Bg_Active": colormap.alloc_color( "#9400BE" ),
+ "Bg_Inactive": colormap.alloc_color( "#DBDBDB" ) }
+
+ if True: # load clipmask
+ pix = gtk.gdk.pixbuf_new_from_file(Config.IMAGE_ROOT+'jam-blockMask.png')
+ pixels = pix.get_pixels()
+ stride = pix.get_rowstride()
+ channels = pix.get_n_channels()
+ bitmap = ""
+ byte = 0
+ shift = 0
+ for j in range(pix.get_height()):
+ offset = stride*j
+ for i in range(pix.get_width()):
+ r = pixels[i*channels+offset]
+ if r != "\0": byte += 1 << shift
+ shift += 1
+ if shift > 7:
+ bitmap += "%c" % byte
+ byte = 0
+ shift = 0
+ if shift > 0:
+ bitmap += "%c" % byte
+ byte = 0
+ shift = 0
+ self.clipMask = gtk.gdk.bitmap_create_from_data( None, bitmap, pix.get_width(), pix.get_height() )
+
+ #-- Instrument Images ---------------------------------
+ self.instrumentImage = {}
+ self.instrumentImageActive = {}
+ for inst in self.instrumentDB.getSet( "all" ):
+ try:
+ pix = gtk.gdk.pixbuf_new_from_file(inst.img)
+ x = (Block.Block.WIDTH-pix.get_width())//2
+ y = (Block.Block.HEIGHT-pix.get_height())//2
+ img = gtk.gdk.Pixmap( win, Block.Block.WIDTH, Block.Block.HEIGHT )
+ self.gc.foreground = self.colors["Bg_Inactive"]
+ img.draw_rectangle( self.gc, True, 0, 0, Block.Block.WIDTH, Block.Block.HEIGHT )
+ img.draw_pixbuf( self.gc, pix, 0, 0, x, y, pix.get_width(), pix.get_height(), gtk.gdk.RGB_DITHER_NONE )
+ self.instrumentImage[inst.id] = img
+ img = gtk.gdk.Pixmap( win, Block.Block.WIDTH, Block.Block.HEIGHT )
+ self.gc.foreground = self.colors["Bg_Active"]
+ img.draw_rectangle( self.gc, True, 0, 0, Block.Block.WIDTH, Block.Block.HEIGHT )
+ img.draw_pixbuf( self.gc, pix, 0, 0, x, y, pix.get_width(), pix.get_height(), gtk.gdk.RGB_DITHER_NONE )
+ self.instrumentImageActive[inst.id] = img
+ except:
+ if Config.DEBUG >= 5: print "JamMain:: file does not exist: " + inst.img
+ img = gtk.gdk.Pixmap( win, Block.Block.WIDTH, Block.Block.HEIGHT )
+ self.gc.foreground = self.colors["Bg_Inactive"]
+ img.draw_rectangle( self.gc, True, 0, 0, Block.Block.WIDTH, Block.Block.HEIGHT )
+ self.instrumentImage[inst.id] = img
+ img = gtk.gdk.Pixmap( win, Block.Block.WIDTH, Block.Block.HEIGHT )
+ self.gc.foreground = self.colors["Bg_Active"]
+ img.draw_rectangle( self.gc, True, 0, 0, Block.Block.WIDTH, Block.Block.HEIGHT )
+ self.instrumentImageActive[inst.id] = img
+
+ #-- Toolbars ------------------------------------------
+ self.desktopToolbar = DesktopToolbar( self )
+ self.activity.toolbox.add_toolbar( _("Desktop"), self.desktopToolbar )
+ #-- GUI -----------------------------------------------
if True: # GUI
+ self.modify_bg( gtk.STATE_NORMAL, self.colors["bg"] ) # window bg
+
self.GUI = {}
self.GUI["mainVBox"] = gtk.VBox()
self.add( self.GUI["mainVBox"] )
@@ -49,38 +131,44 @@ class JamMain(SubActivity):
self.GUI["mainVBox"].pack_start( self.GUI["desktop"] )
#-- Bank ----------------------------------------------
- self.GUI["bankVBox"] = gtk.VBox()
- self.GUI["mainVBox"].pack_start( self.GUI["bankVBox"], False, False )
- if True: # Tabs
- self.GUI["bankTabs"] = gtk.HBox()
- self.GUI["bankTabs"].set_size_request( -1, 38 )
- self.GUI["bankVBox"].pack_start( self.GUI["bankTabs"], False, False )
-
- self.GUI["bankInstrumentsTab"] = gtk.RadioButton( None, "Instruments" )
- self.GUI["bankInstrumentsTab"].connect( "clicked", lambda w: self.setPicker( Picker.Instrument, None ) )
- self.GUI["bankTabs"].pack_start( self.GUI["bankInstrumentsTab"] )
- self.GUI["bankDrumsTab"] = gtk.RadioButton( self.GUI["bankInstrumentsTab"], "Drums" )
- self.GUI["bankDrumsTab"].connect( "clicked", lambda w: self.setPicker( Picker.Drum ) )
- self.GUI["bankTabs"].pack_start( self.GUI["bankDrumsTab"] )
- self.GUI["bankLoopsTab"] = gtk.RadioButton( self.GUI["bankInstrumentsTab"], "Loops" )
- self.GUI["bankLoopsTab"].connect( "clicked", lambda w: self.setPicker( Picker.Loop ) )
- self.GUI["bankTabs"].pack_start( self.GUI["bankLoopsTab"] )
-
- if True: # Picker
- self.GUI["bankPicker"] = gtk.HBox()
- self.GUI["bankPicker"].set_size_request( -1, 149 )
- self.GUI["bankVBox"].pack_start( self.GUI["bankPicker"], False, False )
-
- self.pickers = {}
- self.pickerScroll = {}
- for type in [ Picker.Instrument, Picker.Drum, Picker.Loop ]:
- self.pickers[type] = type( self )
+ separator = gtk.Label( " " )
+ separator.set_size_request( -1, style.TOOLBOX_SEPARATOR_HEIGHT )
+ self.GUI["mainVBox"].pack_start( separator, False )
+ self.GUI["notebook"] = gtk.Notebook()
+ self.GUI["notebook"].set_scrollable( True )
+ self.GUI["notebook"].modify_bg( gtk.STATE_NORMAL, self.colors["Picker_Bg"] ) # active tab
+ self.GUI["notebook"].modify_bg( gtk.STATE_ACTIVE, self.colors["Picker_Bg_Inactive"] ) # inactive tab
+ self.GUI["notebook"].props.tab_vborder = style.TOOLBOX_TAB_VBORDER
+ self.GUI["notebook"].props.tab_hborder = style.TOOLBOX_TAB_HBORDER
+ self.GUI["notebook"].set_size_request( -1, 160 )
+ self.GUI["notebook"].connect( "switch-page", self.setPicker )
+ self.GUI["mainVBox"].pack_start( self.GUI["notebook"], False, False )
+ self.pickers = {}
+ self.pickerScroll = {}
+ for type in [ Picker.Instrument, Picker.Drum, Picker.Loop ]:
+ self.pickers[type] = type( self )
+
+ def prepareLabel( name ):
+ label = gtk.Label( _(name) )
+ label.set_alignment( 0.0, 0.5 )
+ label.modify_fg( gtk.STATE_NORMAL, self.colors["Picker_Fg"] )
+ label.modify_fg( gtk.STATE_ACTIVE, self.colors["Picker_Fg"] )
+ return label
+
+ self.GUI["notebook"].append_page( self.pickers[Picker.Drum], prepareLabel("Drum Kits") )
+ self.GUI["notebook"].append_page( self.pickers[Picker.Loop], prepareLabel("Loops") )
+
+ sets = self.instrumentDB.getLabels()[:]
+ sets.sort()
+ for set in sets:
+ page = gtk.HBox()
+ page.set = set
+ self.GUI["notebook"].append_page( page, prepareLabel( set ) )
self.show_all()
- self.curPicker = None
- self.setPicker( Picker.Instrument )
-
+ self.GUI["notebook"].set_current_page( 0 )
+
#-- Keyboard ------------------------------------------
self.key_dict = {}
self.nextTrack = 1
@@ -92,6 +180,9 @@ class JamMain(SubActivity):
# use dummy values for now
self.drumFillin = Fillin( 2, 100, Config.INSTRUMENTS["drum1kit"].instrumentId, self.reverb, 1 )
+ #==========================================================
+ # SubActivity Handlers
+
def onActivate( self, arg ):
pass
@@ -101,20 +192,8 @@ class JamMain(SubActivity):
def onDestroy( self ):
pass
- def getDesktop( self ):
- return self.desktop
-
- def setPicker( self, type, filter = None ):
- if self.curPicker == type:
- if self.pickers[self.curPicker].getFilter() == filter:
- return
- self.pickers[self.curPicker].setFilter( filter )
- else:
- if self.curPicker != None:
- self.GUI["bankPicker"].remove( self.pickers[self.curPicker] )
-
- self.GUI["bankPicker"].pack_start( self.pickers[type] )
- self.curPicker = type
+ #==========================================================
+ # Playback
def onKeyPress( self, widget, event ):
key = event.hardware_keycode
@@ -129,12 +208,13 @@ class JamMain(SubActivity):
if inst.kit: # drum kit
if pitch in GenerationConstants.DRUMPITCH:
pitch = GenerationConstants.DRUMPITCH[pitch]
+ print inst.kit
self._playNote( key,
36,
self.instrument["amplitude"],
self.instrument["pan"],
100,
- inst.kit[pitch],
+ inst.kit[pitch].instrumentId,
self.instrument["reverb"] )
else:
if event.state == gtk.gdk.MOD1_MASK:
@@ -225,3 +305,27 @@ class JamMain(SubActivity):
self.drumFillin.stop()
self.csnd.loopPause()
+ #==========================================================
+ # Get/Set
+
+ def getDesktop( self ):
+ return self.desktop
+
+ def getInstrumentImage( self, id, active = False ):
+ if active: return self.instrumentImageActive[id]
+ else: return self.instrumentImage[id]
+
+ def setPicker( self, widget, pagePointer, page_num ):
+ page = self.GUI["notebook"].get_nth_page( page_num )
+ if page == self.pickers[Picker.Drum]:
+ pass
+ elif page == self.pickers[Picker.Loop]:
+ pass
+ else:
+ self.pickers[Picker.Instrument].setFilter( ( page.set ) )
+ parent = self.pickers[Picker.Instrument].get_parent()
+ if parent != page:
+ if parent != None:
+ parent.remove( self.pickers[Picker.Instrument] )
+ page.add( self.pickers[Picker.Instrument] )
+