# this layout and add the corresponding settings
layout_information = musicexp.Layout ()
-def progress (str):
- ly.stderr_write (str + '\n')
- sys.stderr.flush ()
-
-def error_message (str):
- ly.stderr_write (str + '\n')
- sys.stderr.flush ()
-
needed_additional_definitions = []
additional_definitions = {
if value:
header.set_field (field, musicxml.escape_ly_output_string (value))
- movement_title = tree.get_maybe_exist_named_child ('movement-title')
- if movement_title:
- set_if_exists ('title', movement_title.get_text ())
work = tree.get_maybe_exist_named_child ('work')
if work:
- # Overwrite the title from movement-title with work->title
- set_if_exists ('title', work.get_work_title ())
set_if_exists ('worknumber', work.get_work_number ())
set_if_exists ('opus', work.get_opus ())
+ movement_title = tree.get_maybe_exist_named_child ('movement-title')
+
+ # use either work-title or movement-title as title.
+ # if both exist use movement-title as subtitle.
+ # if there is only a movement-title (or work-title is empty or missing) the movement-title should be typeset as a title
+ if work:
+ work_title = work.get_work_title ()
+ set_if_exists ('title', work_title)
+ if work_title == '':
+ set_if_exists ('title', movement_title.get_text ())
+ elif movement_title:
+ set_if_exists ('subtitle', movement_title.get_text ())
+ elif movement_title:
+ set_if_exists ('title', movement_title.get_text ())
+
identifications = tree.get_named_children ('identification')
for ids in identifications:
set_if_exists ('copyright', ids.get_rights ())
set_if_exists ('editor', ids.get_editor ())
set_if_exists ('poet', ids.get_poet ())
- set_if_exists ('tagline', ids.get_encoding_software ())
set_if_exists ('encodingsoftware', ids.get_encoding_software ())
set_if_exists ('encodingdate', ids.get_encoding_date ())
set_if_exists ('encoder', ids.get_encoding_person ())
set_if_exists ('encodingdescription', ids.get_encoding_description ())
+ set_if_exists ('source', ids.get_source ())
+
+ # miscellaneous --> texidoc
set_if_exists ('texidoc', ids.get_file_description ());
# Finally, apply the required compatibility modes
app_description = ignore_beaming_software.get (s, False);
if app_description:
conversion_settings.ignore_beaming = True
- progress (_ ("Encountered file created by %s, containing wrong beaming information. All beaming information in the MusicXML file will be ignored") % app_description)
+ ly.warning (_ ("Encountered file created by %s, containing "
+ "wrong beaming information. All beaming "
+ "information in the MusicXML file will be "
+ "ignored") % app_description)
# TODO: Check for other unsupported features
return header
def add_end (self, g):
self.end[getattr (g, 'number', "1")] = g
def print_ly (self, printer):
- error_message (_ ("Unprocessed PartGroupInfo %s encountered") % self)
+ ly.warning (_ ("Unprocessed PartGroupInfo %s encountered") % self)
def ly_expression (self):
- error_message (_ ("Unprocessed PartGroupInfo %s encountered") % self)
+ ly.warning (_ ("Unprocessed PartGroupInfo %s encountered") % self)
return ''
def musicxml_step_to_lily (step):
d.duration_log = d_log
d.factor = Rational (rational_len.numerator ())
else:
- error_message (_ ("Encountered rational duration with denominator %s, "
+ ly.warning (_ ("Encountered rational duration with denominator %s, "
"unable to convert to lilypond duration") %
- rational_len.denominator ())
+ rational_len.denominator ())
# TODO: Test the above error message
return None
def musicxml_key_to_lily (attributes):
key_sig = attributes.get_key_signature ()
if not key_sig or not (isinstance (key_sig, list) or isinstance (key_sig, tuple)):
- error_message (_ ("Unable to extract key signature!"))
+ ly.warning (_ ("Unable to extract key signature!"))
return None
change = musicexp.KeySignatureChange()
start_pitch.step = n
start_pitch.alteration = a
except KeyError:
- error_message (_ ("unknown mode %s, expecting 'major' or 'minor' "
+ ly.warning (_ ("unknown mode %s, expecting 'major' or 'minor' "
"or a church mode!") % mode)
fifth = musicexp.Pitch()
self.direction = 0
self.event = None
def print_ly (self, printer):
- ly.stderr_write (_ ("Encountered unprocessed marker %s\n") % self)
+ ly.warning (_ ("Encountered unprocessed marker %s\n") % self)
pass
def ly_expression (self):
return ""
if func:
ev = func()
else:
- error_message (_ ('unknown span event %s') % mxl_event)
+ ly.warning (_ ('unknown span event %s') % mxl_event)
type = mxl_event.get_type ()
if span_direction != None:
ev.span_direction = span_direction
else:
- error_message (_ ('unknown span type %s for %s') % (type, name))
+ ly.warning (_ ('unknown span type %s for %s') % (type, name))
ev.set_span_type (type)
ev.line_type = getattr (mxl_event, 'line-type', 'solid')
except ValueError:
pass
else:
- error_message (_ ("Unknown metronome mark, ignoring"))
+ ly.warning (_ ("Unknown metronome mark, ignoring"))
return
return ev
else:
#TODO: Implement the other (more complex) way for tempo marks!
- error_message (_ ("Metronome marks with complex relations (<metronome-note> in MusicXML) are not yet implemented."))
+ ly.warning (_ ("Metronome marks with complex relations (<metronome-note> in MusicXML) are not yet implemented."))
return
# translate directions into Events, possible values:
res = chordkind_dict.get (kind, None)
# Check for None, since a major chord is converted to ''
if res == None:
- error_message (_ ("Unable to convert chord type %s to lilypond.") % kind)
+ ly.warning (_ ("Unable to convert chord type %s to lilypond.") % kind)
return res
def musicxml_harmony_to_lily_chordname (n):
diff = moment - current_end
if diff < Rational (0):
- error_message (_ ('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):
if len (modes_found) > 1:
- error_message (_ ('cannot simultaneously have more than one mode: %s') % modes_found.keys ())
+ ly.warning (_ ('cannot simultaneously have more than one mode: %s') % modes_found.keys ())
if options.relative:
v = musicexp.RelativeMusic ()
part_ly_voices = {}
for n, v in name_voice.items ():
- progress (_ ("Converting to LilyPond expressions..."))
+ ly.progress (_ ("Converting to LilyPond expressions..."), True)
# musicxml_voice_to_lily_voice returns (lily_voice, {nr->lyrics, nr->lyrics})
part_ly_voices[n] = musicxml_voice_to_lily_voice (v)
p.version = ('''%prog (LilyPond) @TOPLEVEL_VERSION@\n\n'''
+
-_ ("""Copyright (c) 2005--2011 by
+_ ("""Copyright (c) 2005--2012 by
Han-Wen Nienhuys <hanwen@xs4all.nl>,
Jan Nieuwenhuizen <janneke@gnu.org> and
Reinhold Kainhofer <reinhold@kainhofer.com>
help=_ ("show version number and exit"))
p.add_option ('-v', '--verbose',
- action = "store_true",
- dest = 'verbose',
+ action="callback",
+ callback=ly.handle_loglevel_option,
+ callback_args=("DEBUG",),
help = _ ("be verbose"))
p.add_option ('', '--lxml',
action = "store",
help = _ ("use LANG for pitch names, e.g. 'deutsch' for note names in German"))
+ p.add_option ("--loglevel",
+ help=_ ("Print log messages according to LOGLEVEL "
+ "(NONE, ERROR, WARNING, PROGRESS (default), DEBUG)"),
+ metavar=_ ("LOGLEVEL"),
+ action='callback',
+ callback=ly.handle_loglevel_option,
+ type='string')
+
p.add_option ('--nd', '--no-articulation-directions',
action = "store_false",
default = True,
type = 'string',
dest = 'output_name',
help = _ ("set output filename to FILE, stdout if -"))
+
+ p.add_option ('-m', '--midi',
+ action = "store_true",
+ default = False,
+ dest = "midi",
+ help = _("add midi-block to .ly file"))
+
p.add_option_group ('',
description = (
_ ("Report bugs via %s")
part_id = part_definition.id
nv_dict = voices.get (part_id)
if not nv_dict:
- error_message (_ ('unknown part in part-list: %s') % part_id)
+ ly.warning (_ ('unknown part in part-list: %s') % part_id)
continue
staves = reduce (lambda x,y: x+ y,
def print_ly_preamble (printer, filename):
printer.dump_version ()
- printer.print_verbatim ('%% automatically converted from %s\n' % filename)
+ printer.print_verbatim ('%% automatically converted by musicxml2ly from %s\n' % filename)
def print_ly_additional_definitions (printer, filename):
if needed_additional_definitions:
raw_string = None
if compressed:
if filename == "-":
- progress (_ ("Input is compressed, extracting raw MusicXML data from stdin") )
+ ly.progress (_ ("Input is compressed, extracting raw MusicXML data from stdin"), True)
# unfortunately, zipfile.ZipFile can't read directly from
# stdin, so copy everything from stdin to a temp file and read
# that. TemporaryFile() will remove the file when it is closed.
bytes_read = sys.stdin.read (8192)
z = zipfile.ZipFile (tmp, "r")
else:
- progress (_ ("Input file %s is compressed, extracting raw MusicXML data") % filename)
+ ly.progress (_ ("Input file %s is compressed, extracting raw MusicXML data") % filename, True)
z = zipfile.ZipFile (filename, "r")
container_xml = z.read ("META-INF/container.xml")
if not container_xml:
def convert (filename, options):
if filename == "-":
- progress (_ ("Reading MusicXML from Standard input ...") )
+ ly.progress (_ ("Reading MusicXML from Standard input ..."), True)
else:
- progress (_ ("Reading MusicXML from %s ...") % filename)
+ ly.progress (_ ("Reading MusicXML from %s ...") % filename, True)
tree = read_musicxml (filename, options.compressed, options.use_lxml)
score_information = extract_score_information (tree)
else:
output_ly_name = options.output_name + '.ly'
- progress (_ ("Output to `%s'") % output_ly_name)
+ ly.progress (_ ("Output to `%s'") % output_ly_name, True)
printer = musicexp.Output_printer()
- #progress (_ ("Output to `%s'") % defs_ly_name)
+ #ly.progress (_ ("Output to `%s'") % defs_ly_name, True)
if (options.output_name == "-"):
printer.set_file (codecs.getwriter ("utf-8")(sys.stdout))
else:
opt_parser.print_usage()
sys.exit (2)
+ if options.midi:
+ musicexp.set_create_midi (options.midi)
+
if options.language:
musicexp.set_pitch_language (options.language)
needed_additional_definitions.append (options.language)
if filename and (filename == "-" or os.path.exists (filename)):
voices = convert (filename, options)
else:
- progress (_ ("Unable to find input file %s") % basefilename)
+ ly.error (_ ("Unable to find input file %s") % basefilename)
if __name__ == '__main__':
main()