X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=python%2Fmusicxml.py;h=5afd4f27952e6b3d6701c2e3700991b2b7a7fd29;hb=8e54676f70107ed3f4152370515e51b9af97c4be;hp=adfd1027cbc53bb396325947ab5bdae7cad3748b;hpb=855e680d327f49088fb2f9f3ca4dbf0875c43bc0;p=lilypond.git diff --git a/python/musicxml.py b/python/musicxml.py index adfd1027cb..5afd4f2795 100644 --- a/python/musicxml.py +++ b/python/musicxml.py @@ -21,6 +21,22 @@ def escape_ly_output_string (input_string): return return_string +def musicxml_duration_to_log (dur): + return {'256th': 8, + '128th': 7, + '64th': 6, + '32nd': 5, + '16th': 4, + 'eighth': 3, + 'quarter': 2, + 'half': 1, + 'whole': 0, + 'breve': -1, + 'longa': -2, + 'long': -2}.get (dur, 0) + + + class Xml_node: def __init__ (self): self._children = [] @@ -330,17 +346,7 @@ class Note (Measure_element): if ch: log = ch.get_text ().strip() - return {'256th': 8, - '128th': 7, - '64th': 6, - '32nd': 5, - '16th': 4, - 'eighth': 3, - 'quarter': 2, - 'half': 1, - 'whole': 0, - 'breve': -1, - 'longa': -2}.get (log, 0) + return musicxml_duration_to_log (log) elif self.get_maybe_exist_named_child (u'grace'): # FIXME: is it ok to default to eight note for grace notes? return 3 @@ -866,6 +872,48 @@ class Words (Music_xml_node): class Harmony (Music_xml_node): pass +class ChordPitch (Music_xml_node): + def step_class_name (self): + return u'root-step' + def alter_class_name (self): + return u'root-alter' + def get_step (self): + ch = self.get_unique_typed_child (get_class (self.step_class_name ())) + return ch.get_text ().strip () + def get_alteration (self): + ch = self.get_maybe_exist_typed_child (get_class (self.alter_class_name ())) + alter = 0 + if ch: + alter = int (ch.get_text ().strip ()) + return alter + +class Root (ChordPitch): + pass + +class Bass (ChordPitch): + def step_class_name (self): + return u'bass-step' + def alter_class_name (self): + return u'bass-alter' + +class ChordModification (Music_xml_node): + def get_type (self): + ch = self.get_maybe_exist_typed_child (get_class (u'degree-type')) + return {'add': 1, 'alter': 1, 'subtract': -1}.get (ch.get_text ().strip (), 0) + def get_value (self): + ch = self.get_maybe_exist_typed_child (get_class (u'degree-value')) + value = 0 + if ch: + value = int (ch.get_text ().strip ()) + return value + def get_alter (self): + ch = self.get_maybe_exist_typed_child (get_class (u'degree-alter')) + value = 0 + if ch: + value = int (ch.get_text ().strip ()) + return value + + class Frame (Music_xml_node): def get_frets (self): return self.get_named_child_value_number ('frame-frets', 4) @@ -873,6 +921,7 @@ class Frame (Music_xml_node): return self.get_named_child_value_number ('frame-strings', 6) def get_first_fret (self): return self.get_named_child_value_number ('first-fret', 1) + class Frame_Note (Music_xml_node): def get_string (self): return self.get_named_child_value_number ('string', 1) @@ -890,6 +939,15 @@ class Frame_Note (Music_xml_node): class FiguredBass (Music_xml_node): pass +class BeatUnit (Music_xml_node): + pass + +class BeatUnitDot (Music_xml_node): + pass + +class PerMinute (Music_xml_node): + pass + ## need this, not all classes are instantiated @@ -902,11 +960,15 @@ class_dict = { 'attributes': Attributes, 'barline': Barline, 'bar-style': BarStyle, + 'bass': Bass, 'beam' : Beam, + 'beat-unit': BeatUnit, + 'beat-unit-dot': BeatUnitDot, 'bend' : Bend, 'bracket' : Bracket, 'chord': Chord, 'dashes' : Dashes, + 'degree' : ChordModification, 'dot': Dot, 'direction': Direction, 'direction-type': DirType, @@ -927,9 +989,11 @@ class_dict = { 'part-group': Part_group, 'part-list': Part_list, 'pedal': Pedal, + 'per-minute': PerMinute, 'pitch': Pitch, 'rest': Rest, - 'score-part': Score_part, + 'root': Root, + 'score-part': Score_part, 'slide': Slide, 'slur': Slur, 'staff': Staff,