From: Reinhold Kainhofer Date: Fri, 22 Feb 2008 15:33:00 +0000 (+0100) Subject: MusicXML: Add possible \layout block, use autoBeaming=##f by default, allow manual... X-Git-Tag: release/2.11.41-1~8^2~3^2~2 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=75fc5edff75b930b004f8ae058b7ea51414e6ecf;p=lilypond.git MusicXML: Add possible \layout block, use autoBeaming=##f by default, allow manual beaming -) Added a musicexp.Layout class to print out a \layout block. It contains a dict ContextName<=>ListOfEntries. -) Added a global variable to hold the layout options, so whenever we encounter the need for an entry in the \layout block, we can simply add the corresponding setting. -) By default, autoBeaming should be ##f (since MusicXML files contain full beaming information), unless beaming should be ignored (e.g. for wrong musicxml files, like the ones from Sibelius). I'm already using the Layout class for this. -) Add command line option to ignore beaming information in the MusicXML file and use lilypond's autoBeaming. --- diff --git a/python/musicexp.py b/python/musicexp.py index 1596cd392b..739c09f70f 100644 --- a/python/musicexp.py +++ b/python/musicexp.py @@ -669,6 +669,30 @@ class Paper: printer.dump ('}') printer.newline () +class Layout: + def __init__ (self): + self.context_dict = {} + def add_context (self, context): + if not self.context_dict.has_key (context): + self.context_dict[context] = [] + def set_context_item (self, context, item): + self.add_context (context) + self.context_dict[context].append (item) + def print_ly (self, printer): + if self.context_dict.items (): + printer.dump ('\\layout {') + printer.newline () + for (context, defs) in self.context_dict.items (): + printer.dump ('\\context { \\%s' % context) + printer.newline () + for d in defs: + printer.dump (d) + printer.newline () + printer.dump ('}') + printer.newline () + printer.dump ('}') + printer.newline () + class ChordEvent (NestedMusic): def __init__ (self): diff --git a/scripts/musicxml2ly.py b/scripts/musicxml2ly.py index 2738e4fc03..e13e2625ce 100644 --- a/scripts/musicxml2ly.py +++ b/scripts/musicxml2ly.py @@ -29,6 +29,10 @@ class Conversion_Settings: self.ignore_beaming = False conversion_settings = Conversion_Settings () +# Use a global variable to store the setting needed inside a \layout block. +# whenever we need to change a setting or add/remove an engraver, we can access +# this layout and add the corresponding settings +layout_information = musicexp.Layout () def progress (str): ly.stderr_write (str + '\n') @@ -61,7 +65,7 @@ additional_definitions = { def round_to_two_digits (val): return round (val * 100) / 100 -def extract_layout_information (tree): +def extract_paper_information (tree): paper = musicexp.Paper () defaults = tree.get_maybe_exist_named_child ('defaults') if not defaults: @@ -290,10 +294,10 @@ def staff_attributes_to_lily_staff (mxl_attr): return staff -def extract_score_layout (part_list, staffinfo): - layout = musicexp.StaffGroup (None) +def extract_score_structure (part_list, staffinfo): + structure = musicexp.StaffGroup (None) if not part_list: - return layout + return structure def read_score_part (el): if not isinstance (el, musicxml.Score_part): @@ -418,8 +422,8 @@ def extract_score_layout (part_list, staffinfo): if len (staves) == 1: return staves[0] for i in staves: - layout.append_staff (i) - return layout + structure.append_staff (i) + return structure @@ -1881,6 +1885,12 @@ Copyright (c) 2005--2008 by dest = "convert_directions", help = _ ("do not convert directions (^, _ or -) for articulations, dynamics, etc.")) + p.add_option ('--no-beaming', + action = "store_false", + default = True, + dest = "convert_beaming", + help = _ ("do not convert beaming information, use lilypond's automatic beaming instead")) + p.add_option ('-o', '--output', metavar = _ ("FILE"), action = "store", @@ -1968,6 +1978,11 @@ def update_score_setup (score_structure, part_list, voices): staves_info.append (format_staff_info (part_id, None, thisstaff_raw_voices)) score_structure.set_part_information (part_id, staves_info) +# Set global values in the \layout block, like auto-beaming etc. +def update_layout_information (): + if not conversion_settings.ignore_beaming and layout_information: + layout_information.set_context_item ('Score', 'autoBeaming = ##f') + def print_ly_preamble (printer, filename): printer.dump_version () printer.print_verbatim ('%% automatically converted from %s\n' % filename) @@ -2031,7 +2046,7 @@ def convert (filename, options): tree = read_musicxml (filename, options.compressed, options.use_lxml) score_information = extract_score_information (tree) - layout_information = extract_layout_information (tree) + paper_information = extract_paper_information (tree) parts = tree.get_typed_children (musicxml.Part) (voices, staff_info) = get_all_voices (parts) @@ -2039,11 +2054,13 @@ def convert (filename, options): score_structure = None mxl_pl = tree.get_maybe_exist_typed_child (musicxml.Part_list) if mxl_pl: - score_structure = extract_score_layout (mxl_pl, staff_info) + score_structure = 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) + # After the conversion, update the list of settings for the \layout block + update_layout_information () if not options.output_name: options.output_name = os.path.basename (filename) @@ -2063,6 +2080,8 @@ def convert (filename, options): print_ly_additional_definitions (printer, filename) if score_information: score_information.print_ly (printer) + if paper_information: + paper_information.print_ly (printer) if layout_information: layout_information.print_ly (printer) print_voice_definitions (printer, part_list, voices) @@ -2104,6 +2123,7 @@ def main (): musicexp.set_pitch_language (options.language) needed_additional_definitions.append (options.language) additional_definitions[options.language] = "\\include \"%s.ly\"\n" % options.language + conversion_settings.ignore_beaming = not options.convert_beaming # Allow the user to leave out the .xml or xml on the filename filename = get_existing_filename_with_extension (args[0], "xml")