Ajout d'une classe "Part" en vue de la gestion des répétitions.
[minwii.git] / src / songs / musicxmltosong.py
index ffb5247..25822b3 100755 (executable)
@@ -22,16 +22,50 @@ DIATO_SCALE = {'C' : 60,
                'B' : 71}
 _marker = []
 
+class Part(object) :
+    
+    def __init__(self, node) :
+        self.node = node
+        self.notes = []
+        self._parseMusic()
+    
+    def _parseMusic(self) :
+        divisions = 0
+        
+        for measureNode in self.node.getElementsByTagName('measure') :
+            divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
+            next = previous = None
+            for i, noteNode in enumerate(measureNode.getElementsByTagName('note')) :
+                note = Note(noteNode, divisions, previous)
+                self.notes.append(note)
+                try :
+                    self.notes[i-1].next = note
+                except IndexError:
+                    pass
+                previous = note
+    
+    def pprint(self) :
+        for note in self.notes :
+            print note.name, note.midi, note.duration, note.lyrics
+                
+                
+        
+        
 
 class Note(object) :
-    def __init__(self, node, divisions) :
+    def __init__(self, node, divisions, previous) :
+        self.node = node
         self.step = _getNodeValue(node, 'pitch/step')
         self.octave = int(_getNodeValue(node, 'pitch/octave'))
         self.alter = int(_getNodeValue(node, 'pitch/alter', 0))
         self._duration = float(_getNodeValue(node, 'duration'))
-        self.lyric = _getNodeValue(node, 'lyric/text')
+        self.lyrics = []
+        for ly in node.getElementsByTagName('lyric') :
+            self.lyrics.append(Lyric(ly))
 
         self.divisions = divisions
+        self.previous = previous
+        self.next = None
     
     @property
     def midi(self) :
@@ -53,6 +87,17 @@ class Note(object) :
             alterext = '#'
         name = '%s%s' % (name, abs(self.alter) * alterext)
         return name
+    
+
+class Lyric(object) :
+    def __init__(self, node) :
+        self.node = node
+        self.syllabic = _getNodeValue(node, 'syllabic', 'single')
+        self.text = _getNodeValue(node, 'text')
+    
+    def __str__(self) :
+        return self.text.encode('utf-8')
+    __repr__  = __str__
         
         
 
@@ -81,26 +126,31 @@ def musicXml2Song(input, output, partIndex=0, printNotes=False) :
     parts = doc.getElementsByTagName('part')
     leadPart = parts[partIndex]
     
+    part = Part(leadPart)
+    
+    if printNotes :
+        part.pprint()
+    
     # divisions de la noire
-    divisions = 0
-    midiNotes, durations, lyrics = [], [], []
-
-    for measureNode in leadPart.getElementsByTagName('measure') :
-        divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
-        for noteNode in measureNode.getElementsByTagName('note') :
-            note = Note(noteNode, divisions)
-            if printNotes :
-                print note.name, note.midi, note.duration, note.lyric
-            midiNotes.append(note.midi)
-            durations.append(note.duration)
-            lyrics.append(note.lyric)
-    
-    song = Song(None,
-                midiNoteNumbers = midiNotes,
-                noteLengths = durations,
-                lyrics = lyrics,
-                notesInExtendedScale=None)
-    song.save(output)
+#    divisions = 0
+#    midiNotes, durations, lyrics = [], [], []
+#
+#    for measureNode in leadPart.getElementsByTagName('measure') :
+#        divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
+#        for noteNode in measureNode.getElementsByTagName('note') :
+#            note = Note(noteNode, divisions)
+#            if printNotes :
+#                print note.name, note.midi, note.duration, note.lyric
+#            midiNotes.append(note.midi)
+#            durations.append(note.duration)
+#            lyrics.append(note.lyric)
+#    
+#    song = Song(None,
+#                midiNoteNumbers = midiNotes,
+#                noteLengths = durations,
+#                lyrics = lyrics,
+#                notesInExtendedScale=None)
+#    song.save(output)
     
     
 def main() :