On en reste là pour le support des répétitions (non implémenté pour l'instant).
authorpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 9 Feb 2010 14:39:18 +0000 (14:39 +0000)
committerpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 9 Feb 2010 14:39:18 +0000 (14:39 +0000)
git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@19 fe552daf-6dbe-4428-90eb-1537e0879342

src/songs/musicxmltosong.py

index 91feeae..eb5d5c3 100755 (executable)
@@ -41,6 +41,7 @@ class Part(object) :
     def __init__(self, node, autoDetectChorus=True) :
         self.node = node
         self.notes = []
+        self.repeats = []
         self._parseMusic()
         self.verses = [[]]
         self.chorus = []
@@ -54,6 +55,8 @@ class Part(object) :
 
         for measureNode in self.node.getElementsByTagName('measure') :
             measureNotes = []
+            
+            # iteration sur les notes
             # divisions de la noire
             divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
             for noteNode in measureNode.getElementsByTagName('note') :
@@ -66,8 +69,17 @@ class Part(object) :
                     previous.addDuration(note)
                     continue
                 previous = note
-
             self.notes.extend(measureNotes)
+            
+            # barres de reprises
+            try :
+                barlineNode = measureNode.getElementsByTagName('barline')[0]
+            except IndexError :
+                continue
+            
+            barline = Barline(barlineNode, measureNotes)
+            if barline.repeat :
+                self.repeats.append(barline)
 
     def _findChorus(self):
         """ le refrain correspond aux notes pour lesquelles
@@ -133,17 +145,32 @@ class Part(object) :
 
 class Barline(object) :
 
-    def __init__(self, node) :
+    def __init__(self, node, measureNotes) :
         self.node = node
-        self.location = node.getAttribute('location')
+        location = self.location = node.getAttribute('location') or 'right'
         try :
-            repeat = node.getElementsByTagName('repeat')[0]
-            repeat = {'direction' : repeat.getAttribute('direction'),
-                      'times' : int(repeat.getAttribute('times') or 1)}
+            repeatN = node.getElementsByTagName('repeat')[0]
+            repeat = {'direction' : repeatN.getAttribute('direction'),
+                      'times' : int(repeatN.getAttribute('times') or 1)}
+            if location == 'left' :
+                repeat['note'] = measureNotes[0]
+            elif location == 'right' :
+                repeat['note'] = measureNotes[-1]
+            else :
+                raise ValueError(location)
             self.repeat = repeat
         except IndexError :
             self.repeat = None
-        
+    
+    def __str__(self)  :
+        if self.repeat :
+            if self.location == 'left' :
+                return '|:'
+            elif self.location == 'right' :
+                return ':|'
+        return '|'
+
+    __repr__ = __str__
         
 
 class Note(object) :