]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/musicxml2ly.py
Merge branch 'master' of /home/jcharles/GIT/Lily/. into translation
[lilypond.git] / scripts / musicxml2ly.py
index 69125dc9db6cdccbb52d47c19296c6191974fa4e..e270aed95e7d3001ea905a3eb5c5ffac03f8adde 100644 (file)
@@ -22,7 +22,7 @@ import musicexp
 
 from rational import Rational
 
-# Store command-line options in a global variable, so we can access them everythwere
+# Store command-line options in a global variable, so we can access them everywhere
 options = None
 
 class Conversion_Settings:
@@ -41,7 +41,7 @@ additional_definitions = {
   "tuplet-note-wrapper": """      % a formatter function, which is simply a wrapper around an existing
       % tuplet formatter function. It takes the value returned by the given
       % function and appends a note of given length.
-  #(define-public ((tuplet-number::append-note-wrapper function note) grob)
+  #(define ((tuplet-number::append-note-wrapper function note) grob)
     (let* ((txt (if function (function grob) #f)))
       (if txt
         (markup txt #:fontsize -5 #:note note UP)
@@ -265,7 +265,7 @@ def staff_attributes_to_string_tunings (mxl_attr):
     if staff_lines:
         lines = string.atoi (staff_lines.get_text ())
 
-    tunings = [musicexp.Pitch()]*lines
+    tunings = [musicexp.Pitch()] * lines
     staff_tunings = details.get_named_children ('staff-tuning')
     for i in staff_tunings:
         p = musicexp.Pitch()
@@ -474,8 +474,6 @@ def extract_score_structure (part_list, staffinfo):
                 group_starts.append (pos)
         pos += 1
 
-    if len (staves) == 1:
-        return staves[0]
     for i in staves:
         structure.append_staff (i)
     return score
@@ -533,7 +531,7 @@ def musicxml_partial_to_lily (partial_len):
         p.partial = rational_to_lily_duration (partial_len)
         return p
     else:
-        return Null
+        return None
 
 # Detect repeats and alternative endings in the chord event list (music_list)
 # and convert them to the corresponding musicexp objects, containing nested
@@ -617,15 +615,15 @@ def group_repeats (music_list):
                 r.repeat_count = repeat_times
                 # don't erase the first element for "implicit" repeats (i.e. no
                 # starting repeat bars at the very beginning)
-                start = repeat_start+1
+                start = repeat_start + 1
                 if repeat_start == music_start:
                     start = music_start
                 r.set_music (music_list[start:repeat_end])
                 for (start, end) in endings:
                     s = musicexp.SequentialMusic ()
-                    s.elements = music_list[start+1:end]
+                    s.elements = music_list[start + 1:end]
                     r.add_ending (s)
-                del music_list[repeat_start:final_marker+1]
+                del music_list[repeat_start:final_marker + 1]
                 music_list.insert (repeat_start, r)
                 repeat_replaced = True
             pos += 1
@@ -637,11 +635,11 @@ def group_repeats (music_list):
 # <time-modification> elements of the note:
 def musicxml_tuplet_to_lily (tuplet_elt, time_modification):
     tsm = musicexp.TimeScaledMusic ()
-    fraction = (1,1)
+    fraction = (1, 1)
     if time_modification:
         fraction = time_modification.get_fraction ()
     tsm.numerator = fraction[0]
-    tsm.denominator  = fraction[1]
+    tsm.denominator = fraction[1]
 
 
     normal_type = tuplet_elt.get_normal_type ()
@@ -776,19 +774,19 @@ def musicxml_key_to_lily (attributes):
         (fifths, mode) = key_sig
         change.mode = mode
 
-        start_pitch  = musicexp.Pitch ()
+        start_pitch = musicexp.Pitch ()
         start_pitch.octave = 0
         try:
-            (n,a) = {
-                'major'     : (0,0),
-                'minor'     : (5,0),
-                'ionian'    : (0,0),
-                'dorian'    : (1,0),
-                'phrygian'  : (2,0),
-                'lydian'    : (3,0),
-                'mixolydian': (4,0),
-                'aeolian'   : (5,0),
-                'locrian'   : (6,0),
+            (n, a) = {
+                'major'     : (0, 0),
+                'minor'     : (5, 0),
+                'ionian'    : (0, 0),
+                'dorian'    : (1, 0),
+                'phrygian'  : (2, 0),
+                'lydian'    : (3, 0),
+                'mixolydian': (4, 0),
+                'aeolian'   : (5, 0),
+                'locrian'   : (6, 0),
                 }[mode]
             start_pitch.step = n
             start_pitch.alteration = a
@@ -828,9 +826,9 @@ def musicxml_transpose_to_lily (attributes):
     chromatic_shift = string.atoi (transpose.get_named_child ('chromatic').get_text ())
     chromatic_shift_normalized = chromatic_shift % 12;
     (shift.step, shift.alteration) = [
-        (0,0), (0,1), (1,0), (2,-1), (2,0),
-        (3,0), (3,1), (4,0), (5,-1), (5,0),
-        (6,-1), (6,0)][chromatic_shift_normalized];
+        (0, 0), (0, 1), (1, 0), (2, -1), (2, 0),
+        (3, 0), (3, 1), (4, 0), (5, -1), (5, 0),
+        (6, -1), (6, 0)][chromatic_shift_normalized];
 
     shift.octave += (chromatic_shift - chromatic_shift_normalized) / 12
 
@@ -867,7 +865,7 @@ def musicxml_staff_details_to_lily (attributes):
 
 def musicxml_attributes_to_lily (attrs):
     elts = []
-    attr_dispatch =  {
+    attr_dispatch = {
         'clef': musicxml_clef_to_lily,
         'time': musicxml_time_to_lily,
         'key': musicxml_key_to_lily,
@@ -1169,7 +1167,7 @@ articulations_dict = {
     #"shake": "?",
     "snap-pizzicato": "snappizzicato",
     #"spiccato": "?",
-    "staccatissimo": (musicexp.ShortArticulationEvent, "|"), # or "staccatissimo"
+    "staccatissimo": (musicexp.ShortArticulationEvent, "!"), # or "staccatissimo"
     "staccato": (musicexp.ShortArticulationEvent, "."), # or "staccato"
     "stopped": (musicexp.ShortArticulationEvent, "+"), # or "stopped"
     #"stress": "?",
@@ -1226,7 +1224,7 @@ def musicxml_dynamics_to_lily_event (dynentry):
     dynamicsname = dynentry.get_name ()
     if dynamicsname == "other-dynamics":
         dynamicsname = dynentry.get_text ()
-    if not dynamicsname or dynamicsname=="#text":
+    if not dynamicsname or dynamicsname == "#text":
         return
 
     if not dynamicsname in dynamics_available:
@@ -1253,7 +1251,7 @@ def hexcolorval_to_nr (hex_val):
 def hex_to_color (hex_val):
     res = re.match (r'#([0-9a-f][0-9a-f]|)([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$', hex_val, re.IGNORECASE)
     if res:
-        return map (lambda x: hexcolorval_to_nr (x), res.group (2,3,4))
+        return map (lambda x: hexcolorval_to_nr (x), res.group (2, 3, 4))
     else:
         return None
 
@@ -1317,7 +1315,7 @@ def musicxml_words_to_lily_event (words):
 # convert accordion-registration to lilypond.
 # Since lilypond does not have any built-in commands, we need to create
 # the markup commands manually and define our own variables.
-# Idea was taken from: http://lsr.dsi.unimi.it/LSR/Item?id=194
+# Idea was taken from: http://lsr.di.unimi.it/LSR/Item?id=194
 def musicxml_accordion_to_markup (mxl_event):
     commandname = "accReg"
     command = ""
@@ -1753,7 +1751,7 @@ def musicxml_figured_bass_to_lily (n):
     dur = n.get_maybe_exist_named_child ('duration')
     if dur:
         # apply the duration to res
-        length = Rational(int(dur.get_text()), n._divisions)*Rational(1,4)
+        length = Rational(int(dur.get_text()), n._divisions) * Rational(1, 4)
         res.set_real_duration (length)
         duration = rational_to_lily_duration (length)
         if duration:
@@ -1772,7 +1770,7 @@ instrument_drumtype_dict = {
 }
 
 def musicxml_note_to_lily_main_event (n):
-    pitch  = None
+    pitch = None
     duration = None
     event = None
 
@@ -1784,8 +1782,12 @@ def musicxml_note_to_lily_main_event (n):
 
         acc = n.get_maybe_exist_named_child ('accidental')
         if acc:
-            # let's not force accs everywhere.
-            event.cautionary = acc.cautionary
+            # AccidentalCautionary in lily has parentheses
+            # so treat accidental explicitly in parentheses as cautionary
+            if hasattr(acc, 'parentheses') and acc.parentheses == "yes":
+                event.cautionary = True
+            else:
+                event.cautionary = acc.cautionary
             # TODO: Handle editorial accidentals
             # TODO: Handle the level-display setting for displaying brackets/parentheses
 
@@ -1908,7 +1910,7 @@ class LilyPondVoiceBuilder:
     def current_duration (self):
         return self.end_moment - self.begin_moment
 
-    def add_music (self, music, duration, relevant = True):
+    def add_music (self, music, duration, relevant=True):
         assert isinstance (music, musicexp.Music)
         if self.pending_multibar > Rational (0):
             self._insert_multibar ()
@@ -1925,13 +1927,13 @@ class LilyPondVoiceBuilder:
             self.pending_dynamics = []
 
     # Insert some music command that does not affect the position in the measure
-    def add_command (self, command, relevant = True):
+    def add_command (self, command, relevant=True):
         assert isinstance (command, musicexp.Music)
         if self.pending_multibar > Rational (0):
             self._insert_multibar ()
         self.has_relevant_elements = self.has_relevant_elements or relevant
         self.elements.append (command)
-    def add_barline (self, barline, relevant = False):
+    def add_barline (self, barline, relevant=False):
         # Insert only if we don't have a barline already
         # TODO: Implement proper merging of default barline and custom bar line
         has_relevant = self.has_relevant_elements
@@ -1963,8 +1965,8 @@ class LilyPondVoiceBuilder:
         diff = moment - current_end
 
         if diff < Rational (0):
-            ly.warning (_ ('Negative skip %s (from position %s to %s)') %
-                           (diff, current_end, moment))
+            ly.warning (_ ('Negative skip %s (from position %s to %s)')
+                % (diff, current_end, moment))
             diff = Rational (0)
 
         if diff > Rational (0) and not (self.ignore_skips and moment == 0):
@@ -2000,7 +2002,7 @@ class LilyPondVoiceBuilder:
         value = None
 
         # if the position matches, find the last ChordEvent, do not cross a bar line!
-        at = len( self.elements ) - 1
+        at = len(self.elements) - 1
         while (at >= 0 and
                not isinstance (self.elements[at], musicexp.ChordEvent) and
                not isinstance (self.elements[at], musicexp.BarLine)):
@@ -2571,7 +2573,7 @@ If the given filename is -, musicxml2ly reads from the command line.
 
     p.version = ('''%prog (LilyPond) @TOPLEVEL_VERSION@\n\n'''
 +
-_ ("""Copyright (c) 2005--2012 by
+_ ("""Copyright (c) 2005--2014 by
     Han-Wen Nienhuys <hanwen@xs4all.nl>,
     Jan Nieuwenhuizen <janneke@gnu.org> and
     Reinhold Kainhofer <reinhold@kainhofer.com>
@@ -2665,7 +2667,7 @@ information.""") % 'lilypond')
                   action = "store_true",
                   default = False,
                   dest = "midi",
-                  help = _("add midi-block to .ly file"))
+                  help = _("activate midi-block"))
 
     p.add_option_group ('',
                         description = (
@@ -2717,7 +2719,7 @@ def print_voice_definitions (printer, part_list, voices):
 
 
 def uniq_list (l):
-    return dict ([(elt,1) for elt in l]).keys ()
+    return dict ([(elt, 1) for elt in l]).keys ()
 
 # format the information about the staff in the form
 #     [staffid,