X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Fmusicxml2ly.py;h=dda374d84e9f33562721b31dd70e0133e13f03cd;hb=873d2b387adca96f4a484fe58702758dc415e96d;hp=c6e0b64c530f24aa8106975f7605423790861ece;hpb=c4d028afdec2ee6e3cbbd661ed750ee9f5cf4c8f;p=lilypond.git diff --git a/scripts/musicxml2ly.py b/scripts/musicxml2ly.py index c6e0b64c53..dda374d84e 100644 --- a/scripts/musicxml2ly.py +++ b/scripts/musicxml2ly.py @@ -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): # 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--2011 by +_ ("""Copyright (c) 2005--2015 by Han-Wen Nienhuys , Jan Nieuwenhuizen and Reinhold Kainhofer @@ -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,