diff options
Diffstat (limited to 'Musicpainter.py')
-rw-r--r-- | Musicpainter.py | 920 |
1 files changed, 920 insertions, 0 deletions
diff --git a/Musicpainter.py b/Musicpainter.py new file mode 100644 index 0000000..03fc9e6 --- /dev/null +++ b/Musicpainter.py @@ -0,0 +1,920 @@ +#!/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() + |