diff options
author | Tobias Kretschmar <tobias.kretschmar@gmx.de> | 2016-02-28 09:31:21 +0000 |
---|---|---|
committer | James Lowe <pkx166h@gmail.com> | 2016-03-04 20:33:24 +0000 |
commit | 9b42d0677d9dd04c0e9ccdb7a61d1529b5f7b434 (patch) | |
tree | f899c21c76ffc7b3bf5895974388704c57d81f60 /python | |
parent | 1d9fc4b1512eb69a28677890dc26658c3552c6cd (diff) |
Musicxml: Fix musicxml.py for Reg Test 42a
MusicXML regression test
42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml
is missing the first note in
voice 2.
Subsequently the lyrics
of voice 2 is moved one note
to the right.
Diffstat (limited to 'python')
-rw-r--r-- | python/musicxml.py | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/python/musicxml.py b/python/musicxml.py index 6eb3b45aba..a061b6ea6e 100644 --- a/python/musicxml.py +++ b/python/musicxml.py @@ -143,6 +143,7 @@ class Music_xml_node (Xml_node): Xml_node.__init__ (self) self.duration = Rational (0) self.start = Rational (0) + self.voice_id = None; class Work (Xml_node): def get_work_information (self, tag): @@ -282,11 +283,11 @@ class Unpitched (Music_xml_node): class Measure_element (Music_xml_node): def get_voice_id (self): - voice_id = self.get_maybe_exist_named_child ('voice') - if voice_id: - return voice_id.get_text () + voice = self.get_maybe_exist_named_child ('voice') + if voice: + return voice.get_text () else: - return None + return self.voice_id; def is_first (self): # Look at all measure elements (previously we had self.__class__, which @@ -657,7 +658,25 @@ class Part (Music_xml_node): measure_start_moment = now measure_position = Rational (0) + voice_id = None; + assign_to_next_voice = [] for n in m.get_all_children (): + # assign a voice to all measure elements + if (n.get_name() == 'backup'): + voice_id = None; + + if isinstance(n, Measure_element): + if n.get_voice_id (): + voice_id = n.get_voice_id () + for i in assign_to_next_voice: + i.voice_id = voice_id + assign_to_next_voice = [] + else: + if voice_id: + n.voice_id = voice_id + else: + assign_to_next_voice.append (n) + # figured bass has a duration, but applies to the next note # and should not change the current measure position! if isinstance (n, FiguredBass): @@ -862,15 +881,10 @@ class Part (Music_xml_node): continue if isinstance (n, Direction): - staff_id = n.get_maybe_exist_named_child (u'staff') - if staff_id: - staff_id = staff_id.get_text () - if staff_id: - dir_voices = staff_to_voice_dict.get (staff_id, voices.keys ()) + if (n.voice_id): + voices[n.voice_id].add_element (n) else: - dir_voices = voices.keys () - for v in dir_voices: - voices[v].add_element (n) + assign_to_next_note.append (n) continue if isinstance (n, Harmony) or isinstance (n, FiguredBass): @@ -1069,7 +1083,7 @@ class Grace (Music_xml_node): class Staff (Music_xml_node): pass -class Direction (Music_xml_node): +class Direction (Measure_element): pass class DirType (Music_xml_node): pass |