]> git.donarmstrong.com Git - lilypond.git/blobdiff - python/musicexp.py
Make fast_substitute_grob_array() protected.
[lilypond.git] / python / musicexp.py
index d0fc398f6bc838c5b36da52c260ba6c73058c3e4..c653c5cb7944e664c9130caebc66a5e280f199a0 100644 (file)
@@ -1099,7 +1099,7 @@ class FretEvent (MarkupEvent):
         else:
             return ''
 
-class ChordRoot:
+class ChordPitch:
     def __init__ (self):
         self.alteration = 0
         self.step = 0
@@ -1108,12 +1108,30 @@ class ChordRoot:
     def ly_expression (self): 
         return pitch_generating_function (self)
 
+class ChordModification:
+    def __init__ (self):
+        self.alteration = 0
+        self.step = 0
+        self.type = 0
+    def ly_expression (self):
+        if self.type:
+            val = {1: ".", -1: "^" }.get (self.type, "")
+            val += "%s" % self.step
+            val += {1: "+", -1: "-"}.get (self.alteration, "")
+            return val
+        else:
+            return ''
+
 class ChordNameEvent (Event):
     def __init__ (self):
         Event.__init__ (self)
         self.root = None
         self.kind = None
         self.duration = None
+        self.modifications = []
+        self.bass = None
+    def add_modification (self, mod):
+        self.modifications.append (mod)
     def ly_expression (self):
         if not self.root:
             return ''
@@ -1123,6 +1141,15 @@ class ChordNameEvent (Event):
         if self.kind:
             value += ":"
             value += self.kind
+        # First print all additions/changes, and only afterwards all subtractions
+        for m in self.modifications:
+            if m.type == 1:
+              value += m.ly_expression ()
+        for m in self.modifications:
+            if m.type == -1:
+              value += m.ly_expression ()
+        if self.bass:
+            value += "/+%s" % self.bass.ly_expression ()
         return value
 
 
@@ -1524,6 +1551,12 @@ class Staff (StaffGroup):
             sub_staff_type = self.stafftype
 
         for [staff_id, voices] in self.part_information:
+            # Chord names need to come before the staff itself!
+            for [v, lyrics, figuredbass, chordnames] in voices:
+                if chordnames:
+                    printer ('\context ChordNames = "%s" \\%s' % (chordnames, chordnames))
+
+            # now comes the real staff definition:
             if staff_id:
                 printer ('\\context %s = "%s" << ' % (sub_staff_type, staff_id))
             else:
@@ -1533,8 +1566,6 @@ class Staff (StaffGroup):
             nr_voices = len (voices)
             for [v, lyrics, figuredbass, chordnames] in voices:
                 n += 1
-                if chordnames:
-                    printer ('\context ChordNames = "%s" \\%s' % (chordnames, chordnames))
                 voice_count_text = ''
                 if nr_voices > 1:
                     voice_count_text = {1: ' \\voiceOne', 2: ' \\voiceTwo',