qq refactoring avant prise en charge des répétitions.
authorpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 9 Feb 2010 12:48:55 +0000 (12:48 +0000)
committerpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 9 Feb 2010 12:48:55 +0000 (12:48 +0000)
git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@17 fe552daf-6dbe-4428-90eb-1537e0879342

src/songs/musicxmltosong.py

index 826363e..068017f 100755 (executable)
@@ -50,25 +50,24 @@ class Part(object) :
     
     def _parseMusic(self) :
         divisions = 0
-        noteIndex = 0
-        next = previous = None
+        previous = None
+
         for measureNode in self.node.getElementsByTagName('measure') :
+            measureNotes = []
             # divisions de la noire
             divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
             for noteNode in measureNode.getElementsByTagName('note') :
                 note = Note(noteNode, divisions, previous)
                 if not note.isRest :
-                    self.notes.append(note)
-                    try :
-                        self.notes[noteIndex-1].next = note
-                    except IndexError:
-                        pass
+                    measureNotes.append(note)
+                    if previous :
+                        previous.next = note
                 else :
                     previous.addDuration(note)
                     continue
-                    
                 previous = note
-                noteIndex += 1
+
+            self.notes.extend(measureNotes)
 
     def _findChorus(self):
         """ le refrain correspond aux notes pour lesquelles
@@ -118,7 +117,7 @@ class Part(object) :
         
     def pprint(self) :
         for note, verseIndex in self.iterNotes() :
-            print note.nom, note.name, note.midi, note.duration, note.lyrics[verseIndex]
+            print note, note.lyrics[verseIndex]
 
 
     def assignNotesFromMidiNoteNumbers(self):
@@ -131,6 +130,19 @@ class Part(object) :
                 noteInExtendedScale -= 1
             self.notes.append(noteInExtendedScale)
 
+
+class Barline(object) :
+
+    def __init__(self, node) :
+        self.node = node
+        self.location = node.getAttribute('location')
+        try :
+            repeat = node.getElementsByTagName('repeat')[0]
+            repeat = {'direction' : repeat.getAttribute('direction'),
+                      'times' : int(repeat.getAttribute('times') or 1)}
+            self.repeat = repeat
+        except IndexError :
+            self.repeat = None
         
         
 
@@ -158,6 +170,11 @@ class Note(object) :
         self.previous = previous
         self.next = None
     
+    def __str__(self) :
+        return (u'%5s %2s %2d %4s' % (self.nom, self.name, self.midi, round(self.duration, 2))).encode('utf-8')
+    
+    __repr__ = __str__
+    
     def addDuration(self, note) :
         self._duration = self.duration + note.duration
         self.divisions = 1