X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Fmusicxml2ly.py;h=f6fcaa5cc1096ef5b2c164757addaaba0636494d;hb=a8d59748660a6d6ad4c64679f24e14914164812b;hp=e37702686ea1dc60e03a12b9068cd1bf23e081d2;hpb=413aeab5abbb9ebe01f41154ac6cd49bd806b2fe;p=lilypond.git diff --git a/scripts/musicxml2ly.py b/scripts/musicxml2ly.py index e37702686e..f6fcaa5cc1 100644 --- a/scripts/musicxml2ly.py +++ b/scripts/musicxml2ly.py @@ -99,8 +99,108 @@ eyeglasses = \markup { \with-dimensions #'(0 . 4.4) #'(0 . 2.5) \postscript #ey (den (if denominator denominator (ly:event-property ev 'denominator))) (num (if numerator numerator (ly:event-property ev 'numerator)))) (format "~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): @@ -241,6 +341,10 @@ def extract_score_information (tree): if "Dolet 3.4 for Sibelius" in software: conversion_settings.ignore_beaming = True progress (_ ("Encountered file created by Dolet 3.4 for Sibelius, containing wrong beaming information. All beaming information in the MusicXML file will be ignored")) + # ditto for Dolet 3.5 + if "Dolet 3.5 for Sibelius" in software: + conversion_settings.ignore_beaming = True + progress (_ ("Encountered file created by Dolet 3.5 for Sibelius, containing wrong beaming information. All beaming information in the MusicXML file will be ignored")) if "Noteworthy Composer" in software: conversion_settings.ignore_beaming = True progress (_ ("Encountered file created by Noteworthy Composer's nwc2xml, containing wrong beaming information. All beaming information in the MusicXML file will be ignored")) @@ -726,6 +830,7 @@ def group_tuplets (music_list, events): tsm.element = seq new_list.append (tsm) + #TODO: Handle nested tuplets!!!! new_list.extend (music_list[last:]) return new_list @@ -742,6 +847,8 @@ def musicxml_time_to_lily (attributes): 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'): @@ -1734,8 +1841,9 @@ def musicxml_note_to_lily_main_event (n): # treated like an ordinary note pitch rest = n.get_maybe_exist_typed_child (musicxml.Rest) event = musicexp.RestEvent () - pitch = musicxml_restdisplay_to_lily (rest) - event.pitch = pitch + if options.convert_rest_positions: + pitch = musicxml_restdisplay_to_lily (rest) + event.pitch = pitch elif n.instrument_name: event = musicexp.NoteEvent () @@ -2210,8 +2318,7 @@ def musicxml_voice_to_lily_voice (voice): if len (endslurs) > 1: endslurs[0].message (_ ('Cannot have two simultaneous (closing) slurs')) # record the slur status for the next note in the loop - if not grace: - inside_slur = False + inside_slur = False lily_ev = musicxml_spanner_to_lily_event (endslurs[0]) ev_chord.append (lily_ev) @@ -2223,8 +2330,7 @@ def musicxml_voice_to_lily_voice (voice): if len (startslurs) > 1: startslurs[0].message (_ ('Cannot have two simultaneous slurs')) # record the slur status for the next note in the loop - if not grace: - inside_slur = True + inside_slur = True lily_ev = musicxml_spanner_to_lily_event (startslurs[0]) ev_chord.append (lily_ev) @@ -2470,7 +2576,7 @@ If the given filename is -, musicxml2ly reads from the command line. p.version = ('''%prog (LilyPond) @TOPLEVEL_VERSION@\n\n''' + -_ ("""Copyright (c) 2005--2008 by +_ ("""Copyright (c) 2005--2009 by Han-Wen Nienhuys , Jan Nieuwenhuizen and Reinhold Kainhofer @@ -2525,6 +2631,12 @@ information.""") % 'lilypond') dest = "convert_directions", help = _ ("do not convert directions (^, _ or -) for articulations, dynamics, etc.")) + p.add_option ('--nrp', '--no-rest-positions', + action = "store_false", + default = True, + dest = "convert_rest_positions", + help = _ ("do not convert exact vertical positions of rests")) + p.add_option ('--no-beaming', action = "store_false", default = True, @@ -2539,9 +2651,10 @@ information.""") % 'lilypond') dest = 'output_name', help = _ ("set output filename to FILE, stdout if -")) p.add_option_group ('', - description = (_ ("Report bugs via") - + ''' http://post.gmane.org/post.php''' - '''?group=gmane.comp.gnu.lilypond.bugs\n''')) + description = ( + _ ("Report bugs via %s") + % 'http://post.gmane.org/post.php' + '?group=gmane.comp.gnu.lilypond.bugs') + '\n') return p def music_xml_voice_name_to_lily_name (part_id, name):