#!/usr/bin/env python # Musicpainter-11.activity Wu-Hsi Li # updated, Feb 26, 2014 from ftplib import FTP import time import pygtk pygtk.require('2.0') import gtk import gobject import cairo import pango import random _noCsound = False #_noCsound = True platform = "windows-1024" #platform = "sugar-xo" #platform = "linux" #from MelodicCulture import * from copy import copy import sys import os from datetime import datetime from gtk.gdk import CONTROL_MASK from Brick import * from MPScore import * from Canvas import * from BricksArea import * from ToolbarArea import * from BrickBrowser import * import common.Config as Config from common.Generation.GenerationConstants import GenerationConstants from common.Util.NoteDB import Note from common.Util.CSoundNote import CSoundNote from common.Util.CSoundClient import new_csound_client from common.Util import InstrumentDB #from CsoundXOAgent import CsoundXOAgent # ======= for linux ========== #path = "/home/olpc/Activities/Musicpainter.activity/myscore/" # ======= for windows ======== path = "myscore" # ============================ _showFunctionCall = False _showEvent = False class Musicpainter: def __init__(self): self.hasCSound = False self.username = "" self.cursor_area = 2 def destroy_callback(self, data): if _showFunctionCall: print "Musicpainter::destroy_callback()" self.csound.api.after_gtk_destroy() self.destroy(self) def main(self): self.platform = platform print "set platform = " + platform toplevel_window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.init(toplevel_window) gtk.main() return 0 def dcallback(self, data): print "deactivate callback: " + data def rcallback(self, data): if data == "OK": print "callback: instance reactivated" elif data == "NOTOK": print "callback: failed to reactivate, try again" self.csound.api.sendDeactivate() time.sleep(1) self.csound.api.sendReactivateWithCallback(self.rcallback) else: print "reactivate callback: " + data def deactivate(self): if _showFunctionCall: print "Musicpainter::deactivate()" if self.hasCSound == True: #self.score.stop_music(self.csound) self.csound.sendClearLines() self.score.play_state = -2 self.csound.api._deactivate = True self.csound.api.sendDeactivate() time.sleep(1) def reactivate(self): if _showFunctionCall: print "Musicpainter::reactivate()" if self.hasCSound == True: print "hasCSound = " + str(self.hasCSound) + ", isConnected = " + str(self.csound.api._isConnected) else: print "hasCSound = " + str(self.hasCSound) time.sleep(1) if self.hasCSound == True and self.csound.api._isConnected == True: self.csound.api._deactivate = False self.csound.api.sendReactivateWithCallback(self.rcallback) else: if self.hasCSound == True: self.csound.api._deactivate = False print "To call csound.recover()...." self.hasCSound = self.csound.recover() def initSugar(self, toplevel_window, name): self.platform = "sugar-xo" #called from MusicpainterActivity, set platform to sugar self.username = name self.hasCSound = False self.init(toplevel_window) print "Set platform = " + self.platform + ", username is " + name def init(self, toplevel_window): self.init_data() self.init_csound() self.init_graphics() self.window = toplevel_window # remove any children of the window that Sugar may have added #for widget in self.window.get_children(): #self.window.remove(widget) self.window.set_title("Music Painter") self.window.set_name ("Music Painter") # i guess this is for XO self.window.set_resizable(False) self.window.connect("destroy", self.destroy0) self.window.connect("delete_event", self.delete_event) self.window.connect("key_press_event", self.key_press_event) self.window.connect("key_release_event", self.key_release_event) self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(55040, 55040, 65535)) self.layout = gtk.Fixed() self.login_layout = gtk.Fixed() self.browser_layout = gtk.Fixed() self.msg1_layout = gtk.Fixed() self.msg2_layout = gtk.Fixed() if self.platform == "sugar-xo": # use xo owner name as username self.window.set_canvas(self.layout) self.key_lock = 0 self.score.load_profile(self.username) self.prepare_login_layout() self.init_ftp() self.prepare_layout() #self.repare_browser_layout() self.window.set_title("Music Painter - " + self.username) else: self.window.add(self.login_layout) self.prepare_login_layout() self.key_lock = 1 self.prepare_msg1_layout() self.prepare_msg2_layout() if self.platform != "sugar-xo": self.init_ftp() self.window.show_all() def init_csound(self): self.hasCSound = False if not _noCsound and self.hasCSound == False: self.csound = CsoundXOAgent("localhost", random, self.score.timeUpdate, self.platform) time.sleep(2) self.hasCSound = (self.csound.status == 1) if self.hasCSound == False: self.hasCSound = self.csound.recover() def init_graphics(self): self.width = gtk.gdk.screen_get_default().get_width() self.height = gtk.gdk.screen_get_default().get_height() # self.width, self.height = 1024, 768 #standard # self.width, self.height = 1600, 900 # self.width, self.height = 1280, 800 #lenovo x201 # self.width, self.height = 1200, 900 #sugar 1.5 self.cx = (int)(0.09 * self.width) self.toolbararea_width = self.width self.canvas_width = self.width self.bricksarea_width = self.width if self.height <= 800: self.toolbararea_height = 56 else: self.toolbararea_height = 64 # self.toolbararea_height = 56 v = 0.65 * self.height / 18 self.canvas_height = (int)(v * 18) self.bricksarea_height = (int)(self.height / 4) self.total_height = self.toolbararea_height + self.canvas_height + self.bricksarea_height def init_data(self): self.ftp_status = 0 self.save_as = False self.ngrid_h = 64 self.ngrid_v = 18 self.score = MPScore(self.ngrid_h, self.ngrid_v, self.platform, self) self.press_ctrl = 0 self.key_lock = 1 return def destroy(self, widget, data=None): if _showFunctionCall: print "Music_painter::destroy()" gtk.main_quit() def destroy0(self, widget, data=None): if _showFunctionCall: print "Music_painter::destroy0()" if not _noCsound and self.hasCSound == True: self.csound.sendClearLines() self.csound.api._deactivate = True self.csound.close() if self.ftp_status == 1: self.log_ftp(False) self.ftp.quit() try: self.score.save_profile(self.username) except: print "Unable to save profile" gtk.main_quit() def log_ftp(self, flag = True): try: nowstr = str(datetime.now())[:19].replace(":","-") stream = open("blank.sco", 'r') if flag: log = self.username + "_is_online_" + nowstr + ".log" else: log = self.username + "_leaves_" + nowstr + ".log" self.ftp.storlines("STOR log/" + log, stream) stream.close() except: self.ftp_status = 0 def init_ftp(self): try: print "ip = " + self.ip self.ftp = FTP(self.ip, "musicpainter", "medialab") self.score.srv_brick_list = self.ftp.nlst("*.mp*") self.ftp_status = 1 if self.platform == "sugar-xo": self.log_ftp() print "ftp init successful" except: print "ftp exception" self.score.srv_brick_list = [] self.ftp_status = 0 def prepare_browser_layout(self): if self.platform == "sugar-xo": font = 'lucida sans unicode 6' font2 = 'lucida sans unicode 5' else: font = 'lucida sans unicode 11' font2 = 'lucida sans unicode 9' font_desc = pango.FontDescription(font) font_desc2 = pango.FontDescription(font2) self.model1 = gtk.ListStore(gobject.TYPE_STRING) self.model1.append(["All Authors"]) self.update_author = False self.author_box = gtk.ComboBox(self.model1) self.author_box.set_active(0) cell1 = gtk.CellRendererText() cell1.set_property('font-desc', font_desc) self.author_box.pack_start(cell1, True) self.author_box.add_attribute(cell1, 'text', 0) self.model2 = gtk.ListStore(gobject.TYPE_STRING) self.model2.append(["Compositions"]) self.model2.append(["All Bricks"]) self.model2.append(["Melody Bricks"]) self.model2.append(["Rhythm Bricks"]) self.type_box = gtk.ComboBox(self.model2) self.type_box.set_active(1) cell2 = gtk.CellRendererText() cell2.set_property('font-desc', font_desc) self.type_box.pack_start(cell2, True) self.type_box.add_attribute(cell2, 'text', 0) self.model3 = gtk.ListStore(gobject.TYPE_STRING) self.model3.append(["All Scales"]) self.model3.append(["Major Scale"]) self.model3.append(["Minor Scale"]) self.model3.append(["Chromatic Scale"]) self.model3.append(["Chinese Scale"]) self.model3.append(["Japanese Scale"]) self.model3.append(["Blue Note Scale"]) self.scale_box = gtk.ComboBox(self.model3) self.scale_box.set_active(0) cell3 = gtk.CellRendererText() cell3.set_property('font-desc', font_desc) self.scale_box.pack_start(cell3, True) self.scale_box.add_attribute(cell3, 'text', 0) self.browser = BrickBrowser(self.canvas_width, self.canvas_height - 108, self.platform, self) self.author_box.connect_object("changed", self.browser.combo_changed, self.window) self.type_box.connect_object("changed", self.browser.combo_changed, self.window) self.scale_box.connect_object("changed", self.browser.combo_changed, self.window) label1 = gtk.Label("Author: ") label1.modify_font(font_desc) self.browser.author_label = gtk.Label("") # author self.browser.author_label.modify_font(font_desc) self.browser.author_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(16384, 16384, 16384)) label2 = gtk.Label("Type: ") label2.modify_font(font_desc) self.browser.type_label = gtk.Label("") # brick_type self.browser.type_label.modify_font(font_desc) self.browser.type_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(16384, 16384, 16384)) label3 = gtk.Label("Scale: ") label3.modify_font(font_desc) self.browser.scale_label = gtk.Label("") # scale_type self.browser.scale_label.modify_font(font_desc) self.browser.scale_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(16384, 16384, 16384)) label4 = gtk.Label("Filename: ") label4.modify_font(font_desc) self.browser.filename_label = gtk.Label("") # filename self.browser.filename_label.modify_font(font_desc) self.browser.filename_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(16384, 16384, 16384)) label5 = gtk.Label("Title: ") label5.modify_font(font_desc) self.browser.title_label = gtk.Label("") # title self.browser.title_label.modify_font(font_desc2) self.browser.title_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(16384, 16384, 16384)) label6 = gtk.Label("Description: ") label6.modify_font(font_desc) self.browser.desc_label = gtk.Label("") self.browser.desc_label.modify_font(font_desc2) self.browser.desc_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(16384, 16384, 16384)) label7 = gtk.Label("Note: ") label7.modify_font(font_desc) self.browser.note_label = gtk.Label("") self.browser.note_label.modify_font(font_desc2) self.browser.note_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(16384, 16384, 16384)) self.browser_layout.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(55040, 55040, 65535)) self.browser_layout.put(self.browser, 0, self.toolbararea_height) self.browser_layout.put(self.author_box, 180, 15) self.browser_layout.put(self.type_box, 430, 15) self.browser_layout.put(self.scale_box, 710, 15) self.ty = self.toolbararea_height + self.browser.cy + self.browser.thei + 8 s = 0 # self.ty = self.canvas_height - 120 # if self.platform == "sugar-xo": # s = 188 # else: # s = 0 self.cx2 = (int)(self.cx + 0.45 * (self.width - self.cx)) self.browser_layout.put(label1, self.cx+2, self.ty) self.browser_layout.put(label2, self.cx+2, self.ty+20) self.browser_layout.put(label3, self.cx+2, self.ty+40) self.browser_layout.put(label4, self.cx+2, self.ty+60) self.browser_layout.put(label5, self.cx2+2, self.ty) self.browser_layout.put(label6, self.cx2+2, self.ty+20) self.browser_layout.put(label7, self.cx2+2, self.ty+40) self.browser_layout.put(self.browser.author_label, self.cx+82, self.ty) self.browser_layout.put(self.browser.type_label, self.cx+82, self.ty+20) self.browser_layout.put(self.browser.scale_label, self.cx+82, self.ty+40) self.browser_layout.put(self.browser.filename_label, self.cx+82, self.ty+60) self.browser_layout.put(self.browser.title_label, self.cx2+112, self.ty) self.browser_layout.put(self.browser.desc_label, self.cx2+112, self.ty+20) self.browser_layout.put(self.browser.note_label, self.cx2+112, self.ty+40) self.browser_layout.show() def callback1(self, widget, entry = None): self.save_working_brick = True self.destroy0(widget) def callback2(self, widget, entry = None): self.save_working_brick = False self.destroy0(widget) def callback3(self, widget, entry = None): if self.platform == "sugar-xo": self.window.set_canvas(self.layout) else: self.window.remove(self.msg1_layout) self.window.add(self.layout) self.window.show_all() def callback4(self, widget, entry = None): self.score.title = self.entry2.get_text() self.score.description = self.entry3.get_text() self.score.write_mpscore() self.window.set_title("Music Painter - " + self.username) self.score.is_edited = False self.callback6(widget) def callback5(self, widget, entry = None): if not self.save_as: self.score.filename = self.username + "_0_" + str(self.score.scale_mode) + "_piece" + str(random.randint(0, 999999)) + ".mps" self.mlabel5.set_text("Filename: " + self.score.filename) self.save_as = True self.sbutton2.hide() def callback6(self, widget, entry = None): if self.platform == "sugar-xo": self.window.set_canvas(self.layout) else: self.window.remove(self.msg2_layout) self.window.add(self.layout) self.window.show_all() self.key_lock = 0 def back_callback(self, widget, entry = None): return def prepare_layout(self): # print "prepare layout, platform = " + self.platform self.canvas = Canvas(self.canvas_width, self.canvas_height, self.platform, self) self.layout.put(self.canvas, 0, self.toolbararea_height) self.toolbar = ToolbarArea(self.toolbararea_width, self.toolbararea_height, self.platform, self) self.layout.put(self.toolbar, 0, 0) self.bricksarea = BricksArea(self.bricksarea_width, self.bricksarea_height, self.platform, self) self.layout.put(self.bricksarea, 0, self.canvas_height + self.toolbararea_height) self.hid_entry = gtk.Entry() self.hid_entry.set_size_request(0, 0) self.hid_entry.set_max_length(0) self.layout.put(self.hid_entry, 0, 0) self.grab_focus() def grab_focus(self): self.hid_entry.grab_focus() def open_config(self): try: stream = open("musicpainter.config", 'r') if self.platform != "sugar-xo": self.username = stream.readline().replace("\n","").replace("\r","") else: stream.readline() self.ip = stream.readline().replace("\n","").replace("\r","") if self.ip == "": self.ip = "musicpainter.media.mit.edu" stream.close() except: if self.username == "": print "set username to Guest" self.username = "Guest" self.ip = "musicpainter.media.mit.edu" def prepare_msg1_layout(self): if self.platform == "sugar-xo": font = 'lucida sans unicode 8' else: font = 'lucida sans unicode 12' font_desc = pango.FontDescription(font) self.mlabel1 = gtk.Label("Do you want to save the") self.mlabel1.modify_font(font_desc) self.mlabel2 = gtk.Label("bricks in the working area?") self.mlabel2.modify_font(font_desc) button1 = gtk.Button("Yes") button1.modify_font(font_desc) button1.set_size_request(60, 30) button1.connect_object("clicked", self.callback1, self.window) button2 = gtk.Button("No") button2.modify_font(font_desc) button2.set_size_request(60, 30) button2.connect_object("clicked", self.callback2, self.window) button3 = gtk.Button("Back") button3.modify_font(font_desc) button3.set_size_request(60, 30) button3.connect_object("clicked", self.callback3, self.window) self.msg1_layout.set_size_request(240, 100) self.msg1_layout.put(self.mlabel1, 20, 10) self.msg1_layout.put(self.mlabel2, 15, 32) self.msg1_layout.put(button1, 15, 65) self.msg1_layout.put(button2, 90, 65) self.msg1_layout.put(button3, 165, 65) def prepare_msg2_layout(self): if self.platform == "sugar-xo": font = 'lucida sans unicode 6' else: font = 'lucida sans unicode 12' font_desc = pango.FontDescription(font) self.mlabel3 = gtk.Label("Author: ") self.mlabel3.modify_font(font_desc) self.mlabel4 = gtk.Label("Scale: ") self.mlabel4.modify_font(font_desc) self.mlabel5 = gtk.Label("Filename: ") self.mlabel5.modify_font(font_desc) self.mlabel6 = gtk.Label("Note: ") self.mlabel6.modify_font(font_desc) label1 = gtk.Label("Title: ") label1.modify_font(font_desc) label2 = gtk.Label("Description: ") label2.modify_font(font_desc) button1 = gtk.Button("OK") button1.modify_font(font_desc) button1.set_size_request(80, 30) button1.connect_object("clicked", self.callback4, self.window) self.sbutton2 = gtk.Button("Save As") self.sbutton2.modify_font(font_desc) self.sbutton2.set_size_request(80, 30) self.sbutton2.connect_object("clicked", self.callback5, self.window) button3 = gtk.Button("Cancel") button3.modify_font(font_desc) button3.set_size_request(80, 30) button3.connect_object("clicked", self.callback6, self.window) self.entry2 = gtk.Entry() self.entry2.set_size_request(720-112-12, 30) self.entry2.set_max_length(100) self.entry2.modify_font(font_desc) self.entry3 = gtk.Entry() self.entry3.set_size_request(720-112-12, 30) self.entry3.set_max_length(256) self.entry3.modify_font(font_desc) self.entry4 = gtk.Entry() self.entry4.set_size_request(720-112-12, 30) self.entry4.set_max_length(256) self.entry4.modify_font(font_desc) self.entry4.set_editable(False) t = 18 self.msg2_layout.set_size_request(720, 240-t) self.msg2_layout.put(self.mlabel3, 42, 10) # Author self.msg2_layout.put(self.mlabel4, 323, 10) # Scale self.msg2_layout.put(self.mlabel5, 23, 44) # Filename self.msg2_layout.put(self.mlabel6, 58, 142) # Note self.msg2_layout.put(label1, 60, 76) # Title self.msg2_layout.put(label2, 5, 109) # Description self.msg2_layout.put(button1, 220, 205-t) self.msg2_layout.put(self.sbutton2, 320, 205-t) self.msg2_layout.put(button3, 420, 205-t) self.msg2_layout.put(self.entry2, 112, 74) # Title self.msg2_layout.put(self.entry3, 112, 107) # Description self.msg2_layout.put(self.entry4, 112, 140) # Note def prepare_login_layout(self): if self.platform == "sugar-xo": font0 = 'lucida sans unicode 20' font = 'lucida sans unicode 14' else: font0 = 'lucida sans unicode 14' font = 'lucida sans unicode 12' font_desc0 = pango.FontDescription(font0) font_desc = pango.FontDescription(font) self.entry = gtk.Entry() if self.platform == "sugar-xo": self.entry.set_size_request(360, 50) else: self.entry.set_size_request(180, 30) self.entry.set_max_length(36) self.entry.connect("activate", self.enter_callback, self.entry) self.open_config() self.entry.set_text(self.username) self.entry.select_region(0, len(self.entry.get_text())) self.entry.modify_font(font_desc) stream = open("version.txt",'r') line = stream.readline().replace("\n","") stream.close() label1 = gtk.Label("Welcome to Musicpainter! - v" + line) label1.set_justify(gtk.JUSTIFY_CENTER) label1.modify_font(font_desc0) frame = gtk.Frame() if self.platform == "sugar-xo": frame.set_size_request(1080, 1) else: frame.set_size_request(344, 1) label2 = gtk.Label("My name is ") #label2.set_justify(gtk.JUSTIFY_RIGHT) label2.modify_font(font_desc) button1 = gtk.Button("Go") button1.modify_font(font_desc0) if self.platform == "sugar-xo": button1.set_size_request(120, 60) else: button1.set_size_request(40, 30) button1.connect_object("clicked", self.enter_callback, self.window) label3 = gtk.Label("Open a canvas in ") label3.modify_font(font_desc) model = gtk.ListStore(gobject.TYPE_STRING) model.append(["Major Scale"]) model.append(["Minor Scale"]) model.append(["Chromatic Scale"]) model.append(["Chinese Scale"]) model.append(["Japanese Scale"]) model.append(["Blue Note Scale"]) self.sbox = gtk.ComboBox(model) self.sbox.set_active(0) cell2 = gtk.CellRendererText() cell2.set_property('font-desc', font_desc) self.sbox.pack_start(cell2, True) self.sbox.add_attribute(cell2, 'text', 0) if self.platform == "sugar-xo": self.login_layout.set_size_request(1200, 900) self.login_layout.put(label1, 140, 100) # Welcome to Musicpainter! self.login_layout.put(frame, 60, 178) self.login_layout.put(label2, 230, 338) # My name is self.login_layout.put(self.entry, 480, 333) self.login_layout.put(button1, 865, 333) # Go self.login_layout.put(label3, 120, 451) self.login_layout.put(self.sbox, 480, 440) else: self.login_layout.set_size_request(350, 130) self.login_layout.put(label1, 20, 10) # Welcome to Musicpainter! self.login_layout.put(frame, 3, 40) self.login_layout.put(label2, 15, 58) # My name is self.login_layout.put(self.entry, 110, 53) self.login_layout.put(button1, 300, 53) # Go self.login_layout.put(label3, 15, 91) self.login_layout.put(self.sbox, 162, 88) def enter_callback(self, widget, entry = None): print "My name is %s" % self.entry.get_text() self.username = self.entry.get_text() self.score.scale_mode = self.sbox.get_active() if self.username == "": print "set username to Guest" self.username = "Guest" self.window.maximize() self.init_graphics() self.score.load_profile(self.username) self.prepare_layout() #self.prepare_browser_layout() self.window.set_title("Music Painter - " + self.username) if self.platform == "sugar-xo": self.window.set_canvas(self.layout) else: self.window.remove(self.login_layout) self.window.add(self.layout) # self.window.add(self.msg2_layout) self.log_ftp() # self.window.fullscreen() # print "(" + str(gtk.gdk.Screen.get_width()) + "," + str(gtk.gdk.Screen.get_height()) + ")" # print self.window.get_size() # self.window.show_all() self.key_lock = 0 def delete_event(self, widget, event, data=None): if _showEvent: print "music_painter::delete_event()" if not _noCsound and self.hasCSound: self.csound.sendClearLines() self.csound.api._deactivate = True self.csound.close() # time.sleep(3) #self.csound.api.serverShutdown() #self.csound.api.sendDestroyWithCallback(self.destroy_callback) if self.ftp_status == 1: self.log_ftp(False) self.ftp.quit() try: self.score.save_profile(self.username) except: print "Unable to save profile" gtk.main_quit() # self.destroy0(widget) return True # return False def key_release_event(self, widget, event): if not (event.state & CONTROL_MASK): self.press_ctrl = 0 if self.key_lock == 1: return keyname = gtk.gdk.keyval_name(event.keyval) if self.cursor_area != 0: if keyname == 'a': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 17) elif keyname == 's': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 16) elif keyname == 'd': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 15) elif keyname == 'f': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 14) elif keyname == 'g': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 13) elif keyname == 'h': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 12) elif keyname == 'j': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 11) elif keyname == 'k' or keyname == 'q': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 10) elif keyname == 'l' or keyname == 'w': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 9) elif keyname == 'semicolon' or keyname == 'e': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 8) elif keyname == 'apostrophe' or keyname == 'r': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 7) elif keyname == 't': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 6) elif keyname == 'y': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 5) elif keyname == 'u': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 4) elif keyname == 'i': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 3) elif keyname == 'o': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 2) elif keyname == 'p': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 1) elif keyname == 'bracketleft': self.score.keyboard_release(self.csound, self.toolbar.colorsel, 0) def key_press_event(self, widget, event): if self.key_lock == 1: return keyname = gtk.gdk.keyval_name(event.keyval) if event.state & CONTROL_MASK: self.press_ctrl = 1 if keyname == 'a' or keyname == 'A': self.canvas.select_all() else: print keyname return if keyname == "Left": if self.score.select_state == 1: self.score.drag = deepcopy(self.score.sel) self.score.dcut = deepcopy(self.score.scut) self.canvas.move_selection(0, 0, -1, 0) else: self.toolbar.change_slider_val(-0.05) self.score.tempoChange(self.toolbar.sval) elif keyname == "Right": if self.score.select_state == 1: self.score.drag = deepcopy(self.score.sel) self.score.dcut = deepcopy(self.score.scut) self.canvas.move_selection(0, 0, 1, 0) else: self.toolbar.change_slider_val(0.05) self.score.tempoChange(self.toolbar.sval) elif keyname == "Up": if self.score.select_state == 1: self.score.drag = deepcopy(self.score.sel) self.score.dcut = deepcopy(self.score.scut) self.canvas.move_selection(0, 0, 0, -1) else: self.score.key_shift = self.score.key_shift + 1 elif keyname == "Down": if self.score.select_state == 1: self.score.drag = deepcopy(self.score.sel) self.score.dcut = deepcopy(self.score.scut) self.canvas.move_selection(0, 0, 0, 1) else: self.score.key_shift = self.score.key_shift - 1 # elif keyname == 'p' or keyname == 'P': # self.score.play_music(self.csound) # elif keyname == 't' or keyname == 'T': # self.score.stop_music(self.csound) # elif keyname == 's' or keyname == 'S': # elif keyname == 'q' or keyname == 'Q': # self.destroy0(widget) # elif keyname == "space": # self.score.play_music(self.csound) elif keyname == "Return": if self.score.play_state == -2: self.score.play_music(self.csound) else: self.score.stop_music(self.csound) elif keyname == "Delete": if self.score.select_state == 1: self.score.delete_selection() self.canvas.update_top() # elif keyname == 'd' or keyname == 'D': # print "send deactivate()" # self.csound.api.sendDeactivateWithCallback(self.dcallback) # elif keyname == 'r' or keyname == 'R': # print "send reactivate()" # self.csound.api.sendReactivateWithCallback(self.rcallback) # elif keyname == 'z': # self.score.load_collected_list() #list = os.listdir("myscore/bak") #brick = Brick(self.ngrid_h, self.ngrid_v, self) #for i in range(len(list)): #brick.read_score("bak/" + list[i], self.score) #brick.filename = "" #brick.write_score(self.score) # elif keyname == 'm' or keyname == 'M': # self.score.scale_mode = (self.score.scale_mode + 1)%6 else: if self.cursor_area != 0: if keyname == '1': self.toolbar.select_instrument(0) elif keyname == '2': self.toolbar.select_instrument(1) elif keyname == '3': self.toolbar.select_instrument(2) elif keyname == '4': self.toolbar.select_instrument(3) elif keyname == '5': self.toolbar.select_instrument(4) elif keyname == '6': self.toolbar.select_instrument(5) elif keyname == '7': self.toolbar.select_instrument(6) elif keyname == '8': self.toolbar.select_instrument(7) elif keyname == 'a': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 17) elif keyname == 's': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 16) elif keyname == 'd': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 15) elif keyname == 'f': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 14) elif keyname == 'g': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 13) elif keyname == 'h': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 12) elif keyname == 'j': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 11) elif keyname == 'k' or keyname == 'q': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 10) elif keyname == 'l' or keyname == 'w': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 9) elif keyname == 'semicolon' or keyname == 'e': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 8) elif keyname == 'apostrophe' or keyname == 'r': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 7) elif keyname == 't': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 6) elif keyname == 'y': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 5) elif keyname == 'u': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 4) elif keyname == 'i': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 3) elif keyname == 'o': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 2) elif keyname == 'p': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 1) elif keyname == 'bracketleft': self.score.keyboard_press(self.csound, self.toolbar.colorsel, 0) elif keyname == 'space': if self.score.play_state == -2: self.score.play_music(self.csound) else: self.score.stop_music(self.csound) # else: # print keyname + " " + str(event.keyval) if __name__ == "__main__": musicpainter = Musicpainter() musicpainter.main()