Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Musicpainter.py
diff options
context:
space:
mode:
Diffstat (limited to 'Musicpainter.py')
-rw-r--r--Musicpainter.py920
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()
+