From 87defb862218ca2e4d706e1affa200a6cae2032e Mon Sep 17 00:00:00 2001 From: amartin Date: Sun, 26 Aug 2007 11:40:29 +0000 Subject: Jam --- (limited to 'Jam/JamMain.py') 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] ) + -- cgit v0.9.1