import string
import codecs
import zipfile
+import tempfile
import StringIO
"""
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:
# 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 = {
(let* ((ev (event-cause grob))
(den (if denominator denominator (ly:event-property ev 'denominator)))
(num (if numerator numerator (ly:event-property ev 'numerator))))
- (format "~a:~a" den num)))
+ (format #f "~a:~a" den num)))
""",
-
- "compound-time-signature": """%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Formatting of (possibly complex) compound time signatures
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-#(define-public (insert-markups l m)
- (let* ((ll (reverse l)))
- (let join-markups ((markups (list (car ll)))
- (remaining (cdr ll)))
- (if (pair? remaining)
- (join-markups (cons (car remaining) (cons m markups)) (cdr remaining))
- markups))))
-
-% Use a centered-column inside a left-column, because the centered column
-% moves its reference point to the center, which the left-column undoes.
-% The center-column also aligns its contented centered, which is not undone...
-#(define-public (format-time-fraction time-sig-fraction)
- (let* ((revargs (reverse (map number->string time-sig-fraction)))
- (den (car revargs))
- (nums (reverse (cdr revargs))))
- (make-override-markup '(baseline-skip . 0)
- (make-number-markup
- (make-left-column-markup (list
- (make-center-column-markup (list
- (make-line-markup (insert-markups nums "+"))
- den))))))))
-
-#(define-public (format-complex-compound-time time-sig)
- (let* ((sigs (map format-time-fraction time-sig)))
- (make-override-markup '(baseline-skip . 0)
- (make-number-markup
- (make-line-markup
- (insert-markups sigs (make-vcenter-markup "+")))))))
-
-#(define-public (format-compound-time time-sig)
- (cond
- ((not (pair? time-sig)) (null-markup))
- ((pair? (car time-sig)) (format-complex-compound-time time-sig))
- (else (format-time-fraction time-sig))))
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Measure length calculation of (possibly complex) compound time signatures
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-#(define-public (calculate-time-fraction time-sig-fraction)
- (let* ((revargs (reverse time-sig-fraction))
- (den (car revargs))
- (nums (cdr revargs)))
- (ly:make-moment (apply + nums) den)))
-
-#(define-public (calculate-complex-compound-time time-sig)
- (let* ((sigs (map calculate-time-fraction time-sig)))
- (let add-moment ((moment ZERO-MOMENT)
- (remaining sigs))
- (if (pair? remaining)
- (add-moment (ly:moment-add moment (car remaining)) (cdr remaining))
- moment))))
-
-#(define-public (calculate-compound-measure-length time-sig)
- (cond
- ((not (pair? time-sig)) (ly:make-moment 4 4))
- ((pair? (car time-sig)) (calculate-complex-compound-time time-sig))
- (else (calculate-time-fraction time-sig))))
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Base beat lenth
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-#(define-public (calculate-compound-base-beat-full time-sig)
- (let* ((den (map last time-sig)))
- (apply max den)))
-
-#(define-public (calculate-compound-base-beat time-sig)
- (ly:make-moment 1 (cond
- ((not (pair? time-sig)) 4)
- ((pair? (car time-sig)) (calculate-compound-base-beat-full time-sig))
- (else (calculate-compound-base-beat-full (list time-sig))))))
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% The music function to set the complex time signature
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-compoundMeter =
-#(define-music-function (parser location args) (pair?)
- (let ((mlen (calculate-compound-measure-length args))
- (beat (calculate-compound-base-beat args)))
- #{
-\once \override Staff.TimeSignature #'stencil = #ly:text-interface::print
-\once \override Staff.TimeSignature #'text = #(format-compound-time $args)
-% \set Staff.beatGrouping = #(reverse (cdr (reverse $args)))
-\set Timing.measureLength = $mlen
-\set Timing.timeSignatureFraction = #(cons (ly:moment-main-numerator $mlen)
- (ly:moment-main-denominator $mlen))
-\set Timing.beatLength = $beat
-
-% TODO: Implement beatGrouping and auto-beam-settings!!!
-#} ))
-"""
}
def round_to_two_digits (val):
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):
+ if step:
+ return (ord (step) - ord ('A') + 7 - 2) % 7
+ else:
+ return None
+
+
def staff_attributes_to_string_tunings (mxl_attr):
details = mxl_attr.get_maybe_exist_named_child ('staff-details')
if not details:
if staff_lines:
lines = string.atoi (staff_lines.get_text ())
- tunings = [0]*lines
+ tunings = [musicexp.Pitch()] * lines
staff_tunings = details.get_named_children ('staff-tuning')
for i in staff_tunings:
p = musicexp.Pitch()
group_starts.append (pos)
pos += 1
- if len (staves) == 1:
- return staves[0]
for i in staves:
structure.append_staff (i)
return score
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
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
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
# <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 ()
return None
change = musicexp.TimeSignatureChange()
change.fractions = sig
- if (len(sig) != 2) or isinstance (sig[0], list):
- needed_additional_definitions.append ("compound-time-signature")
time_elm = attributes.get_maybe_exist_named_child ('time')
if time_elm and hasattr (time_elm, 'symbol'):
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()
(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
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()
else:
# Non-standard key signature of the form [[step,alter<,octave>],...]
- change.non_standard_alterations = key_sig
+ # MusicXML contains C,D,E,F,G,A,B as steps, lily uses 0-7, so convert
+ alterations = []
+ for k in key_sig:
+ k[0] = musicxml_step_to_lily (k[0])
+ alterations.append (k)
+ change.non_standard_alterations = alterations
return change
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
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,
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')
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:
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
if high:
commandname += "H"
command += """\\combine
- \\raise #2.5 \\musicglyph #\"accordion.accDot\"
+ \\raise #2.5 \\musicglyph #\"accordion.dot\"
"""
middle = mxl_event.get_maybe_exist_named_child ('accordion-middle')
if middle:
if txt == 3:
commandname += "MMM"
command += """\\combine
- \\raise #1.5 \\musicglyph #\"accordion.accDot\"
+ \\raise #1.5 \\musicglyph #\"accordion.dot\"
\\combine
- \\raise #1.5 \\translate #(cons 1 0) \\musicglyph #\"accordion.accDot\"
+ \\raise #1.5 \\translate #(cons 1 0) \\musicglyph #\"accordion.dot\"
\\combine
- \\raise #1.5 \\translate #(cons -1 0) \\musicglyph #\"accordion.accDot\"
+ \\raise #1.5 \\translate #(cons -1 0) \\musicglyph #\"accordion.dot\"
"""
elif txt == 2:
commandname += "MM"
command += """\\combine
- \\raise #1.5 \\translate #(cons 0.5 0) \\musicglyph #\"accordion.accDot\"
+ \\raise #1.5 \\translate #(cons 0.5 0) \\musicglyph #\"accordion.dot\"
\\combine
- \\raise #1.5 \\translate #(cons -0.5 0) \\musicglyph #\"accordion.accDot\"
+ \\raise #1.5 \\translate #(cons -0.5 0) \\musicglyph #\"accordion.dot\"
"""
elif not txt <= 0:
commandname += "M"
command += """\\combine
- \\raise #1.5 \\musicglyph #\"accordion.accDot\"
+ \\raise #1.5 \\musicglyph #\"accordion.dot\"
"""
low = mxl_event.get_maybe_exist_named_child ('accordion-low')
if low:
commandname += "L"
command += """\\combine
- \\raise #0.5 \musicglyph #\"accordion.accDot\"
+ \\raise #0.5 \musicglyph #\"accordion.dot\"
"""
- command += "\musicglyph #\"accordion.accDiscant\""
+ command += "\musicglyph #\"accordion.discant\""
command = "\\markup { \\normalsize %s }" % command
# Define the newly built command \accReg[H][MMM][L]
additional_definitions[commandname] = "%s = %s" % (commandname, command)
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:
if ev:
# TODO: set the correct direction! Unfortunately, \mark in ly does
# not seem to support directions!
+ ev.force_direction = dir
res.append (ev)
continue
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):
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:
}
def musicxml_note_to_lily_main_event (n):
- pitch = None
+ pitch = None
duration = None
event = None
acc = n.get_maybe_exist_named_child ('accidental')
if acc:
- # let's not force accs everywhere.
- event.cautionary = acc.editorial
+ # 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
elif n.get_maybe_exist_typed_child (musicxml.Unpitched):
- # Unpitched elements have display-step and can also have
- # display-octave.
- unpitched = n.get_maybe_exist_typed_child (musicxml.Unpitched)
- event = musicexp.NoteEvent ()
- event.pitch = musicxml_unpitched_to_lily (unpitched)
+ # Unpitched elements have display-step and can also have
+ # display-octave.
+ unpitched = n.get_maybe_exist_typed_child (musicxml.Unpitched)
+ event = musicexp.NoteEvent ()
+ event.pitch = musicxml_unpitched_to_lily (unpitched)
elif n.get_maybe_exist_typed_child (musicxml.Rest):
# rests can have display-octave and display-step, which are
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 ()
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
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):
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)):
self.lyrics_dict = {}
self.lyrics_order = []
-def musicxml_step_to_lily (step):
- if step:
- return (ord (step) - ord ('A') + 7 - 2) % 7
- else:
- return None
-
def measure_length_from_attributes (attr, current_measure_length):
len = attr.get_measure_length ()
if not len:
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 ()
p = None
step = mxl_unpitched.get_step ()
if step:
- p = musicexp.Pitch ()
- p.step = musicxml_step_to_lily (step)
+ p = musicexp.Pitch ()
+ p.step = musicxml_step_to_lily (step)
octave = mxl_unpitched.get_octave ()
if octave and p:
- p.octave = octave - 4
+ p.octave = octave - 4
return p
def musicxml_restdisplay_to_lily (mxl_rest):
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--2010 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',
p.add_option ('-l', '--language',
metavar = _ ("LANG"),
action = "store",
- help = _ ("use a different language file 'LANG.ly' and corresponding pitch names, e.g. 'deutsch' for deutsch.ly"))
+ 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",
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 = _("activate midi-block"))
+
p.add_option_group ('',
description = (
_ ("Report bugs via %s")
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,
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") )
- z = zipfile.ZipFile (sys.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.
+ tmp = tempfile.TemporaryFile()
+ sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0) # Make sys.stdin binary
+ bytes_read = sys.stdin.read (8192)
+ while bytes_read:
+ for b in bytes_read:
+ tmp.write(b)
+ 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)
- additional_definitions[options.language] = "\\include \"%s.ly\"\n" % options.language
+ additional_definitions[options.language] = "\\language \"%s\"\n" % options.language
conversion_settings.ignore_beaming = not options.convert_beaming
conversion_settings.convert_page_layout = options.convert_page_layout
# Allow the user to leave out the .xml or xml on the filename
basefilename = args[0].decode('utf-8')
if basefilename == "-": # Read from stdin
- basefilename = "-"
+ filename = "-"
else:
filename = get_existing_filename_with_extension (basefilename, "xml")
if not filename:
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()