CVSROOT: /cvsroot/lilypond Module name: ikebana Branch: Changes by: Han-Wen Nienhuys <[EMAIL PROTECTED]> 05/07/29 11:35:53
Modified files: . : ChangeLog ikebana.py music.py notation.py notationcanvas.py Added files: . : musictree.py Log message: * ikebana.py (NotationApplication.tree_selection_changed): new function. * music.py (ClefEvent.__init__): add (NoteEvent.ly_expression): add (Music.has_children): new method. * musictree.py (MusicTreeView.selection_changed): add Tree view of music model. CVSWeb URLs: http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/ikebana/musictree.py?rev=1.1 http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/ikebana/ChangeLog.diff?tr1=1.4&tr2=1.5&r1=text&r2=text http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/ikebana/ikebana.py.diff?tr1=1.6&tr2=1.7&r1=text&r2=text http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/ikebana/music.py.diff?tr1=1.5&tr2=1.6&r1=text&r2=text http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/ikebana/notation.py.diff?tr1=1.7&tr2=1.8&r1=text&r2=text http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/ikebana/notationcanvas.py.diff?tr1=1.6&tr2=1.7&r1=text&r2=text Patches: Index: ikebana/ChangeLog diff -u ikebana/ChangeLog:1.4 ikebana/ChangeLog:1.5 --- ikebana/ChangeLog:1.4 Thu Jul 28 11:14:10 2005 +++ ikebana/ChangeLog Fri Jul 29 11:35:52 2005 @@ -1,6 +1,19 @@ +2005-07-29 Han-Wen Nienhuys <[EMAIL PROTECTED]> + + * ikebana.py (NotationApplication.tree_selection_changed): new + function. + + * music.py (ClefEvent.__init__): add + (NoteEvent.ly_expression): add + (Music.has_children): new method. + + * musictree.py (MusicTreeView.selection_changed): add Tree view of + music model. + 2005-07-28 Han-Wen Nienhuys <[EMAIL PROTECTED]> * server.ly: use Completion_heads_engraver + use version number. * music.py (Music.set_start): use Rationals for lengths. Index: ikebana/ikebana.py diff -u ikebana/ikebana.py:1.6 ikebana/ikebana.py:1.7 --- ikebana/ikebana.py:1.6 Thu Jul 28 11:14:10 2005 +++ ikebana/ikebana.py Fri Jul 29 11:35:52 2005 @@ -1,5 +1,6 @@ #!/usr/bin/env python +import musictree import os import gtk import gnomecanvas @@ -14,16 +15,40 @@ class NotationApplication: def __init__ (self): - self.music = music.Music_document () + self.document = music.Music_document () - nc = notation.Notation_controller (self.music) + nc = notation.Notation_controller (self.document) self.notation_controller = nc ncc = notationcanvas.Notation_canvas_controller (nc.notation) self.notation_canvas_controller = ncc self.window = self.create_window () + self.tree_window =self.create_tree_window () + + def tree_selection_changed (self, music_obj): + nc = self.notation_controller + nc.notation.set_cursor (music_obj) + self.notation_canvas_controller.check_update() + + def create_tree_window (self): + win = gtk.Window () + (w,h) = (500,300) + win.set_size_request (w, h) + + win.connect ('destroy', mainquit) + win.set_title ('Ikebana - music representation') + treeview = musictree.MusicTreeView (self.document.music) + win.add(treeview) + win.show() + treeview.selection_change_callback = self.tree_selection_changed + + notation = self.notation_canvas_controller.notation + notation.set_cursor_callback = treeview.cursor_changed + + return win + def create_window (self): win = gtk.Window () win.connect ('destroy', mainquit) Index: ikebana/music.py diff -u ikebana/music.py:1.5 ikebana/music.py:1.6 --- ikebana/music.py:1.5 Thu Jul 28 11:14:10 2005 +++ ikebana/music.py Fri Jul 29 11:35:52 2005 @@ -61,14 +61,16 @@ def steps (self): return self.step + self.octave * 7 - def ly_expression (self): - + def ly_step_expression (self): str = 'cdefgab'[self.step] if self.alteration > 0: str += 'is'* (self.alteration/2) elif self.alteration < 0: str += 'es'* (-self.alteration/2) - + return str + + def ly_expression (self): + str = self.ly_step_expression () if self.octave >= 0: str += "'" * (self.octave + 1) elif self.octave < -1: @@ -94,6 +96,15 @@ def get_properties (self): return '' + def has_children (self): + return False + + def get_index (self): + if self.parent: + return self.parent.elements.index (self) + else: + return None + def lisp_expression (self): name = self.name() tag = '' @@ -128,7 +139,8 @@ def __init__ (self): Music.__init__ (self) self.elements = [] - + def has_children (self): + return self.elements def set_tag (self, counter, dict): counter = Music.set_tag (self, counter, dict) for e in self.elements : @@ -285,6 +297,54 @@ return '%s%s' % (self.pitch.ly_expression (), self.duration.ly_expression ()) + + +class KeySignatureEvent (Event): + def __init__ (self, tonic, scale): + Event.__init__ (self) + self.scale = scale + self.tonic = tonic + def name (self): + return 'KeySignatureEvent' + def ly_expression (self): + return '\\key %s \\major' % self.tonic.ly_step_expression () + + def lisp_expression (self): + pairs = ['(%d . %d)' % (i , self.scale[i]) for i in range (0,7)] + scale_str = ("'(%s)" % string.join (pairs)) + + return """ (make-music 'KeyChangeEvent + 'pitch-alist %s) """ % scale_str + +class ClefEvent (Event): + def __init__ (self, t): + Event.__init__ (self) + self.type = t + def name (self): + + return 'ClefEvent' + def ly_expression (self): + return '\\clef "%s"' % self.type + clef_dict = { + "G": ("clefs.G", -2, -6), + "C": ("clefs.C", 0, 0), + "F": ("clefs.F", 2, 6), + } + + def lisp_expression (self): + (glyph, pos, c0) = self.clef_dict [self.type] + clefsetting = """ + (make-music 'SequentialMusic + 'elements (list + (context-spec-music + (make-property-set 'clefGlyph "%s") 'Staff) + (context-spec-music + (make-property-set 'clefPosition %d) 'Staff) + (context-spec-music + (make-property-set 'middleCPosition %d) 'Staff))) +""" % (glyph, pos, c0) + return clefsetting + def test_expr (): m = SequentialMusic() l =2 @@ -302,7 +362,6 @@ evc.insert_around (None, n, 0) m.insert_around (None, evc, 0) - evc = EventChord() n = NoteEvent() n.duration.duration_log = l @@ -310,15 +369,26 @@ evc.insert_around (None, n, 0) m.insert_around (None, evc, 0) + evc = ClefEvent("G") + m.insert_around (None, evc, 0) + + evc = EventChord() + tonic = Pitch () + tonic.step = 2 + tonic.alteration = -2 + n = KeySignatureEvent(tonic, [0, 0, -2, 0, 0,-2,-2] ) + evc.insert_around (None, n, 0) + m.insert_around (None, evc, 0) + return m if __name__ == '__main__': expr = test_expr() expr.set_start (Rational (0)) - - start = 0.25 - stop = 0.5 + print expr.ly_expression() + start = Rational (0,4) + stop = Rational (4,2) def sub(x, start=start, stop=stop): ok = x.start >= start and x.start +x.length() <= stop return ok Index: ikebana/notation.py diff -u ikebana/notation.py:1.7 ikebana/notation.py:1.8 --- ikebana/notation.py:1.7 Thu Jul 28 15:29:57 2005 +++ ikebana/notation.py Fri Jul 29 11:35:52 2005 @@ -25,18 +25,6 @@ measure_length = Rational (time_sig[0], time_sig[1]) measure_count = 4 -scale_str = ("'(%s)" % - string.join (['(%d . %d)' % (i , scale_alterations[i]) for i in range (0,7)], ' ')) - -"'((0 . 0) (1 . 0) (2 . -2) (3 . 0) (4 . 0) (5 . -2) (6 . -2))" -clefsetting = """ - (context-spec-music - (make-property-set 'clefGlyph "clefs.C") 'Staff) - (context-spec-music - (make-property-set 'clefPosition 0) 'Staff) - (context-spec-music - (make-property-set 'middleCPosition 0) 'Staff) -""" try: server = os.environ['IKEBANASERVER'] @@ -78,18 +66,9 @@ (make-property-set 'beatLength (ly:make-moment 1 %d)) 'Score) (context-spec-music (make-property-set 'currentBarNumber %d) 'Score) - (context-spec-music - (make-music 'EventChord - 'elements - (list - (make-music 'KeyChangeEvent - 'pitch-alist - %s) - )) - 'Staff) - + %s))""" % (time_sig[0], time_sig[1], time_sig[0], - time_sig[1], time_sig[1], num, scale_str, str) + time_sig[1], time_sig[1], num, str) def render_score (filename, ly): print ly @@ -162,6 +141,7 @@ def interpret_line (self, offset, cause, bbox, name, fields): notation_item = self.notation.add_item (offset, cause, bbox, fields) notation_item.name = name + def touch_document (self): self.document.touched = True @@ -196,7 +176,7 @@ new_stop = new_start + Rational (measure_count) * measure_length if new_start <> self.start_moment or new_stop <> self.stop_moment: - print "render interval", new_start, new_stop +# print "render interval", new_start, new_stop self.touch_document() self.start_moment = new_start @@ -234,6 +214,7 @@ self.notation_controller = controller self.touched = True self.cursor_touched = True + self.cursor_callback = None toplevel = controller.document.music self.music_cursor = toplevel.find_first (lambda x: x.name()== "NoteEvent") @@ -269,11 +250,15 @@ canvas.set_cursor_to_music (self.music_cursor) self.touched = False - + def set_cursor (self, music_expr): - self.music_cursor = music_expr - self.cursor_touched = True - self.ensure_cursor_visible () + if music_expr <> self.music_cursor: + self.music_cursor = music_expr + self.cursor_touched = True + self.ensure_cursor_visible () + proc = self.set_cursor_callback + if proc: + proc (self) def cursor_move (self, dir): mus = self.music_cursor @@ -481,6 +466,7 @@ arp = music.ArpeggioEvent() par.insert_around (self.music_cursor, arp, -1) self.touch_document() + def print_score(self): doc = self.notation_controller.document ly = doc.music.ly_expression() Index: ikebana/notationcanvas.py diff -u ikebana/notationcanvas.py:1.6 ikebana/notationcanvas.py:1.7 --- ikebana/notationcanvas.py:1.6 Thu Jul 28 11:14:10 2005 +++ ikebana/notationcanvas.py Fri Jul 29 11:35:52 2005 @@ -122,19 +122,19 @@ ('Shift+B', '+B', lambda: self.notation.add_step (6), 2), ('c', 'C', - lambda: self.notation.set_step (0), 3), + lambda: self.notation.set_step (0), 2), ('d', 'D', - lambda: self.notation.set_step (1), 3), + lambda: self.notation.set_step (1), 2), ('e', 'E', - lambda: self.notation.set_step (2), 3), + lambda: self.notation.set_step (2), 2), ('f', 'F', - lambda: self.notation.set_step (3), 3), + lambda: self.notation.set_step (3), 2), ('g', 'G', - lambda: self.notation.set_step (4), 3), + lambda: self.notation.set_step (4), 2), ('a', 'A', - lambda: self.notation.set_step (5), 3), + lambda: self.notation.set_step (5), 2), ('b', 'B', - lambda: self.notation.set_step (6), 3)]: + lambda: self.notation.set_step (6), 2)]: self.add_button (text, key_name, func, row) @@ -145,7 +145,7 @@ gnomecanvas.Canvas.__init__ (self, #aa=True ) - (w,h) = (400,200) + (w,h) = (400,150) self.set_size_request (w, h) self.set_scroll_region (0, 0, w, h) root = self.root () _______________________________________________ Lilypond-cvs mailing list Lilypond-cvs@gnu.org http://lists.gnu.org/mailman/listinfo/lilypond-cvs