X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Fmusicxml2ly.py;h=2a48cd12c13f2cc752620ad31da23853e9ca68a9;hb=d7f59c298960495031d40e76345a4103052a6eb6;hp=3bed2ed9be0833385b0280bf5afd84fa8523d37b;hpb=30d0e11afbac6e226c1af278f68b8f24d63f639f;p=lilypond.git diff --git a/scripts/musicxml2ly.py b/scripts/musicxml2ly.py index 3bed2ed9be..2a48cd12c1 100644 --- a/scripts/musicxml2ly.py +++ b/scripts/musicxml2ly.py @@ -55,24 +55,23 @@ additional_definitions = { '(-0.1 . 0.1) '(0.1 . 1))) 0.7 X))))""", "eyeglasses": """eyeglassesps = #"0.15 setlinewidth -% 255 0 0 setrgbcolor --0.9 0 translate -1.1 1.1 scale -1.2 0.7 moveto -0.7 0.7 0.5 0 361 arc -stroke -2.20 0.70 0.50 0 361 arc -stroke -1.45 0.85 0.30 0 180 arc -stroke -0.20 0.70 moveto -0.80 2.00 lineto -0.92 2.26 1.30 2.40 1.15 1.70 curveto -stroke -2.70 0.70 moveto -3.30 2.00 lineto -3.42 2.26 3.80 2.40 3.65 1.70 curveto -stroke" + -0.9 0 translate + 1.1 1.1 scale + 1.2 0.7 moveto + 0.7 0.7 0.5 0 361 arc + stroke + 2.20 0.70 0.50 0 361 arc + stroke + 1.45 0.85 0.30 0 180 arc + stroke + 0.20 0.70 moveto + 0.80 2.00 lineto + 0.92 2.26 1.30 2.40 1.15 1.70 curveto + stroke + 2.70 0.70 moveto + 3.30 2.00 lineto + 3.42 2.26 3.80 2.40 3.65 1.70 curveto + stroke" eyeglasses = \markup { \with-dimensions #'(0 . 4.4) #'(0 . 2.5) \postscript #eyeglassesps }""" } @@ -309,7 +308,10 @@ def staff_attributes_to_lily_staff (mxl_attr): def extract_score_structure (part_list, staffinfo): + score = musicexp.Score () structure = musicexp.StaffGroup (None) + score.set_contents (structure) + if not part_list: return structure @@ -437,7 +439,7 @@ def extract_score_structure (part_list, staffinfo): return staves[0] for i in staves: structure.append_staff (i) - return structure + return score def musicxml_duration_to_lily (mxl_note): @@ -1054,7 +1056,7 @@ def musicxml_words_to_lily_event (words): "medium": '', "large": '\\large', "x-large": '\\huge', - "xx-large": '\\bigger\\huge' + "xx-large": '\\larger\\huge' }.get (size, '') if font_size: event.markup += font_size @@ -1158,6 +1160,21 @@ def musicxml_rehearsal_to_ly_mark (mxl_event): ev = musicexp.MarkEvent ("\\markup { %s }" % text) return ev +def musicxml_harp_pedals_to_ly (mxl_event): + count = 0 + result = "\\harp-pedal #\"" + for t in mxl_event.get_named_children ('pedal-tuning'): + alter = t.get_named_child ('pedal-alter') + if alter: + val = int (alter.get_text ().strip ()) + result += {1: "v", 0: "-", -1: "^"}.get (val, "") + count += 1 + if count == 3: + result += "|" + ev = musicexp.MarkupEvent () + ev.contents = result + "\"" + return ev + def musicxml_eyeglasses_to_ly (mxl_event): needed_additional_definitions.append ("eyeglasses") return musicexp.MarkEvent ("\\eyeglasses") @@ -1223,7 +1240,7 @@ directions_dict = { # 'damp' : ??? # 'damp-all' : ??? 'eyeglasses': musicxml_eyeglasses_to_ly, -# 'harp-pedals' : ??? + 'harp-pedals' : musicxml_harp_pedals_to_ly, # 'image' : ??? 'metronome' : musicxml_metronome_to_ly, 'rehearsal' : musicxml_rehearsal_to_ly_mark, @@ -1311,25 +1328,25 @@ def musicxml_harmony_to_lily (n): return res -def musicxml_chordroot_to_lily (mxl_root): - r = musicexp.ChordRoot () - r.alteration = mxl_root.get_alteration () - r.step = musicxml_step_to_lily (mxl_root.get_step ()) +def musicxml_chordpitch_to_lily (mxl_cpitch): + r = musicexp.ChordPitch () + r.alteration = mxl_cpitch.get_alteration () + r.step = musicxml_step_to_lily (mxl_cpitch.get_step ()) return r chordkind_dict = { - 'major': '', - 'minor': 'm', - 'augmented': 'aug', - 'diminished': 'dim', + 'major': '5', + 'minor': 'm5', + 'augmented': 'aug5', + 'diminished': 'dim5', # Sevenths: 'dominant': '7', - 'major-seventh': 'maj', + 'major-seventh': 'maj7', 'minor-seventh': 'm7', 'diminished-seventh': 'dim7', 'augmented-seventh': 'aug7', - #'half-diminished': '???', (diminished triad, minor seventh) - #'major-minor': '???', (minor triad, major seventh) + 'half-diminished': 'dim5m7', + 'major-minor': 'maj7m5', # Sixths: 'major-sixth': '6', 'minor-sixth': 'm6', @@ -1342,22 +1359,23 @@ chordkind_dict = { 'major-11th': 'maj11', 'minor-11th': 'm11', # 13ths (usually as the basis for alteration): - 'dominant-13th': '13', - 'major-13th': 'maj13', + 'dominant-13th': '13.11', + 'major-13th': 'maj13.11', 'minor-13th': 'm13', # Suspended: 'suspended-second': 'sus2', 'suspended-fourth': 'sus4', # Functional sixths: + # TODO #'Neapolitan': '???', #'Italian': '???', #'French': '???', #'German': '???', # Other: #'pedal': '???',(pedal-point bass) - #'power': '???',(perfect fifth) + 'power': '5^3', #'Tristan': '???', - #'other': '', + 'other': '1', 'none': None, } @@ -1373,20 +1391,44 @@ def musicxml_harmony_to_lily_chordname (n): root = n.get_maybe_exist_named_child ('root') if root: ev = musicexp.ChordNameEvent () - ev.root = musicxml_chordroot_to_lily (root) + ev.root = musicxml_chordpitch_to_lily (root) kind = n.get_maybe_exist_named_child ('kind') if kind: ev.kind = musicxml_chordkind_to_lily (kind.get_text ()) + if not ev.kind: + return res + bass = n.get_maybe_exist_named_child ('bass') + if bass: + ev.bass = musicxml_chordpitch_to_lily (bass) + inversion = n.get_maybe_exist_named_child ('inversion') + if inversion: + # TODO: Lilypond does not support inversions, does it? + + # Mail from Carl Sorensen on lilypond-devel, June 11, 2008: + # 4. LilyPond supports the first inversion in the form of added + # bass notes. So the first inversion of C major would be c:/g. + # To get the second inversion of C major, you would need to do + # e:6-3-^5 or e:m6-^5. However, both of these techniques + # require you to know the chord and calculate either the fifth + # pitch (for the first inversion) or the third pitch (for the + # second inversion) so they may not be helpful for musicxml2ly. + inversion_count = string.atoi (inversion.get_text ()) + if inversion_count == 1: + # TODO: Calculate the bass note for the inversion... + pass + pass + for deg in n.get_named_children ('degree'): + d = musicexp.ChordModification () + d.type = deg.get_type () + d.step = deg.get_value () + d.alteration = deg.get_alter () + ev.add_modification (d) #TODO: convert the user-symbols attribute: #major: a triangle, like Unicode 25B3 #minor: -, like Unicode 002D #augmented: +, like Unicode 002B #diminished: (degree), like Unicode 00B0 #half-diminished: (o with slash), like Unicode 00F8 - # TODO: Convert the inversion and bass children - for deg in n.get_named_children ('degree'): - # TODO: Convert the added/removed degrees to lilypond - pass if ev and ev.root: res.append (ev) @@ -1581,7 +1623,8 @@ class LilyPondVoiceBuilder: diff = moment - current_end if diff < Rational (0): - error_message (_ ('Negative skip %s') % diff) + error_message (_ ('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): @@ -1831,6 +1874,8 @@ def musicxml_voice_to_lily_voice (voice): dur = fb.real_duration if not dur: dur = ev_chord.get_length () + if not fb.duration: + fb.duration = ev_chord.get_duration () figured_bass_builder.add_music (fb, dur) pending_figured_bass = [] @@ -2115,26 +2160,30 @@ def get_all_voices (parts): def option_parser (): - p = ly.get_option_parser (usage = _ ("musicxml2ly [options] FILE.xml"), - description = _ ("Convert MusicXML from FILE.xml to LilyPond input. If the given filename is -, musicxml2ly reads from the command line.") + "\n", - add_help_option=False) + p = ly.get_option_parser (usage = _ ("musicxml2ly [OPTION]... FILE.xml"), + description = +_ ("""Convert MusicXML from FILE.xml to LilyPond input. +If the given filename is -, musicxml2ly reads from the command line. +"""), add_help_option=False) p.add_option("-h", "--help", action="help", help=_ ("show this help and exit")) p.version = ('''%prog (LilyPond) @TOPLEVEL_VERSION@\n\n''' - + -_ ("""This program is free software. It is covered by the GNU General Public -License and you are welcome to change it and/or distribute copies of it -under certain conditions. Invoke as `%s --warranty' for more -information.""") % 'lilypond' -+ """ -Copyright (c) 2005--2008 by ++ +_ ("""Copyright (c) 2005--2008 by Han-Wen Nienhuys , Jan Nieuwenhuizen and Reinhold Kainhofer -""") +""" ++ +""" +This program is free software. It is covered by the GNU General Public +License and you are welcome to change it and/or distribute copies of it +under certain conditions. Invoke as `%s --warranty' for more +information.""") % 'lilypond') + p.add_option("--version", action="version", help=_ ("show version number and exit")) @@ -2191,7 +2240,7 @@ Copyright (c) 2005--2008 by type = 'string', dest = 'output_name', help = _ ("set output filename to FILE, stdout if -")) - p.add_option_group (ly.display_encode (_ ('Bugs')), + p.add_option_group ('', description = (_ ("Report bugs via") + ''' http://post.gmane.org/post.php''' '''?group=gmane.comp.gnu.lilypond.bugs\n''')) @@ -2378,14 +2427,14 @@ def convert (filename, options): parts = tree.get_typed_children (musicxml.Part) (voices, staff_info) = get_all_voices (parts) - score_structure = None + score = None mxl_pl = tree.get_maybe_exist_typed_child (musicxml.Part_list) if mxl_pl: - score_structure = extract_score_structure (mxl_pl, staff_info) + score = extract_score_structure (mxl_pl, staff_info) part_list = mxl_pl.get_named_children ("score-part") # score information is contained in the , or tags - update_score_setup (score_structure, part_list, voices) + update_score_setup (score, part_list, voices) # After the conversion, update the list of settings for the \layout block update_layout_information () @@ -2422,7 +2471,7 @@ def convert (filename, options): printer.newline () printer.dump ("% The score definition") printer.newline () - score_structure.print_ly (printer) + score.print_ly (printer) printer.newline () return voices