From 854de4f5c959c322755e6aab11d902d853b757c4 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer Date: Wed, 6 Feb 2008 16:27:56 +0100 Subject: [PATCH] MusicXML: Better support for dynamics -) Use #(make-dynamic-script...) instead of \markup for unknown dynamics -) Add definitions of unknown dynamics at the top of the converted file -) Add test case for note-attached dynamics --- .../musicxml/02a-Notations-MusicXML.xml | 54 ++++++++++++++++++- python/musicexp.py | 18 ++----- scripts/musicxml2ly.py | 27 +++++++--- 3 files changed, 76 insertions(+), 23 deletions(-) diff --git a/input/regression/musicxml/02a-Notations-MusicXML.xml b/input/regression/musicxml/02a-Notations-MusicXML.xml index aad78ffc58..0e3f1c9c29 100644 --- a/input/regression/musicxml/02a-Notations-MusicXML.xml +++ b/input/regression/musicxml/02a-Notations-MusicXML.xml @@ -1130,8 +1130,60 @@ - + + + + C5 + + 1 + 1 + quarter + + + + f + + + + C5 + + 1 + 1 + quarter + + + + ppp + + + + C5 + + 1 + 1 + quarter + + + + sfp + + + + C5 + + 1 + 1 + quarter + + sfffz + + Oth.dyn. + + + + + diff --git a/python/musicexp.py b/python/musicexp.py index 60c93521c3..07e4f5d792 100644 --- a/python/musicexp.py +++ b/python/musicexp.py @@ -872,27 +872,17 @@ class HairpinEvent (SpanEvent): class DynamicsEvent (Event): def __init__ (self): self.type = None - self.available_commands = [ "ppppp", "pppp", "ppp", "pp", "p", - "mp", "mf", - "f", "ff", "fff", "ffff", - "fp", "sf", "sff", "sp", "spp", "sfz", "rfz" ]; def wait_for_note (self): return True; def ly_expression (self): - if self.type == None: - return; - elif self.type in self.available_commands: + if self.type: return '\%s' % self.type else: - return '-\markup{ \dynamic %s }' % self.type - + return; + def print_ly (self, printer): - if self.type == None: - return - elif self.type in self.available_commands: + if self.type: printer.dump ("\\%s" % self.type) - else: - printer.dump ("-\\markup{ \\dynamic %s }" % self.type) class TextEvent (Event): diff --git a/scripts/musicxml2ly.py b/scripts/musicxml2ly.py index 14c09dadbd..cbed28f62a 100644 --- a/scripts/musicxml2ly.py +++ b/scripts/musicxml2ly.py @@ -49,8 +49,7 @@ additional_definitions = { ) ) ) -) -""" +)""" } def round_to_two_digits (val): @@ -928,15 +927,26 @@ def musicxml_articulation_to_lily_event (mxl_event): return ev + def musicxml_dynamics_to_lily_event (dynentry): - dynamics_available = ( "p", "pp", "ppp", "pppp", "ppppp", "pppppp", - "f", "ff", "fff", "ffff", "fffff", "ffffff", - "mp", "mf", "sf", "sfp", "sfpp", "fp", - "rf", "rfz", "sfz", "sffz", "fz" ) - if not dynentry.get_name() in dynamics_available: + dynamics_available = ( + "ppppp", "pppp", "ppp", "pp", "p", "mp", "mf", + "f", "ff", "fff", "ffff", "fp", "sf", "sff", "sp", "spp", "sfz", "rfz" ) + dynamicsname = dynentry.get_name () + if dynamicsname == "other-dynamics": + dynamicsname = dynentry.get_text () + if not dynamicsname: return + + if not dynamicsname in dynamics_available: + # Get rid of - in tag names (illegal in ly tags!) + dynamicstext = dynamicsname + dynamicsname = string.replace (dynamicsname, "-", "") + additional_definitions[dynamicsname] = dynamicsname + \ + "=#(make-dynamic-script \"" + dynamicstext + "\")" + needed_additional_definitions.append (dynamicsname) event = musicexp.DynamicsEvent () - event.type = dynentry.get_name () + event.type = dynamicsname return event # Convert single-color two-byte strings to numbers 0.0 - 1.0 @@ -1804,6 +1814,7 @@ def print_ly_additional_definitions (printer, filename): printer.newline () for a in set(needed_additional_definitions): printer.print_verbatim (additional_definitions.get (a, '')) + printer.newline () printer.newline () # Read in the tree from the given I/O object (either file or string) and -- 2.39.2