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
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-cvs