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

Reply via email to