Prise en charge des pauses / soupirs etc : on augmente la durée de la note précédente.
[minwii.git] / src / songs / musicxmltosong.py
index ed7dddf..826363e 100755 (executable)
@@ -9,6 +9,7 @@ import sys
 from types import StringTypes
 from xml.dom.minidom import parse
 from optparse import OptionParser
 from types import StringTypes
 from xml.dom.minidom import parse
 from optparse import OptionParser
+from itertools import cycle
 #from Song import Song
 
 # Do4 <=> midi 60
 #from Song import Song
 
 # Do4 <=> midi 60
@@ -56,11 +57,16 @@ class Part(object) :
             divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
             for noteNode in measureNode.getElementsByTagName('note') :
                 note = Note(noteNode, divisions, previous)
             divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
             for noteNode in measureNode.getElementsByTagName('note') :
                 note = Note(noteNode, divisions, previous)
-                self.notes.append(note)
-                try :
-                    self.notes[noteIndex-1].next = note
-                except IndexError:
-                    pass
+                if not note.isRest :
+                    self.notes.append(note)
+                    try :
+                        self.notes[noteIndex-1].next = note
+                    except IndexError:
+                        pass
+                else :
+                    previous.addDuration(note)
+                    continue
+                    
                 previous = note
                 noteIndex += 1
 
                 previous = note
                 noteIndex += 1
 
@@ -133,9 +139,16 @@ class Note(object) :
     
     def __init__(self, node, divisions, previous) :
         self.node = node
     
     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.isRest = False
+        self.step = _getNodeValue(node, 'pitch/step', None)
+        if self.step is not None :
+            self.octave = int(_getNodeValue(node, 'pitch/octave'))
+            self.alter = int(_getNodeValue(node, 'pitch/alter', 0))
+        elif self.node.getElementsByTagName('rest') :
+            self.isRest = True
+        else :
+            NotImplementedError(self.node.toxml('utf-8'))
+            
         self._duration = float(_getNodeValue(node, 'duration'))
         self.lyrics = []
         for ly in node.getElementsByTagName('lyric') :
         self._duration = float(_getNodeValue(node, 'duration'))
         self.lyrics = []
         for ly in node.getElementsByTagName('lyric') :
@@ -145,6 +158,10 @@ class Note(object) :
         self.previous = previous
         self.next = None
     
         self.previous = previous
         self.next = None
     
+    def addDuration(self, note) :
+        self._duration = self.duration + note.duration
+        self.divisions = 1
+    
     @property
     def midi(self) :
         mid = DIATO_SCALE[self.step]
     @property
     def midi(self) :
         mid = DIATO_SCALE[self.step]