commentaires--
[minwii.git] / src / app / musicxml.py
index 7eedf53..49e1984 100755 (executable)
@@ -47,15 +47,12 @@ FR_NOTES = {'C' : u'Do',
 _marker = []
 
 class Part(object) :
 _marker = []
 
 class Part(object) :
-    
-    requiresExtendedScale = False
-    scale = [55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72]
-    quarterNoteLength = 400
-    
+        
     def __init__(self, node, autoDetectChorus=True) :
         self.node = node
         self.notes = []
         self.repeats = []
     def __init__(self, node, autoDetectChorus=True) :
         self.node = node
         self.notes = []
         self.repeats = []
+        self.distinctNotes = []
         self._parseMusic()
         self.verses = [[]]
         self.chorus = []
         self._parseMusic()
         self.verses = [[]]
         self.chorus = []
@@ -66,6 +63,7 @@ class Part(object) :
     def _parseMusic(self) :
         divisions = 0
         previous = None
     def _parseMusic(self) :
         divisions = 0
         previous = None
+        distinctNotesDict = {}
 
         for measureNode in self.node.getElementsByTagName('measure') :
             measureNotes = []
 
         for measureNode in self.node.getElementsByTagName('measure') :
             measureNotes = []
@@ -83,7 +81,13 @@ class Part(object) :
                     previous.addDuration(note)
                     continue
                 previous = note
                     previous.addDuration(note)
                     continue
                 previous = note
+
             self.notes.extend(measureNotes)
             self.notes.extend(measureNotes)
+
+            for note in measureNotes :
+                if not distinctNotesDict.has_key(note.midi) :
+                    distinctNotesDict[note.midi] = True
+                    self.distinctNotes.append(note)
             
             # barres de reprises
             try :
             
             # barres de reprises
             try :
@@ -94,6 +98,9 @@ class Part(object) :
             barline = Barline(barlineNode, measureNotes)
             if barline.repeat :
                 self.repeats.append(barline)
             barline = Barline(barlineNode, measureNotes)
             if barline.repeat :
                 self.repeats.append(barline)
+        
+        self.distinctNotes.sort(lambda a, b : cmp(a.midi, b.midi))
+        
 
     def _findChorus(self):
         """ le refrain correspond aux notes pour lesquelles
 
     def _findChorus(self):
         """ le refrain correspond aux notes pour lesquelles
@@ -273,37 +280,10 @@ class Note(Tone) :
         self._duration = self.duration + note.duration
         self.divisions = 1
     
         self._duration = self.duration + note.duration
         self.divisions = 1
     
-#    @property
-#    def midi(self) :
-#        mid = DIATO_SCALE[self.step]
-#        mid = mid + (self.octave - OCTAVE_REF) * 12
-#        mid = mid + self.alter
-#        return mid
-    
     @property
     def duration(self) :
         return self._duration / self.divisions
     
     @property
     def duration(self) :
         return self._duration / self.divisions
     
-#    @property
-#    def name(self) :
-#        name = '%s%d' % (self.step, self.octave)
-#        if self.alter < 0 :
-#            alterext = 'b'
-#        else :
-#            alterext = '#'
-#        name = '%s%s' % (name, abs(self.alter) * alterext)
-#        return name
-#    
-#    @property
-#    def nom(self) :
-#        name = FR_NOTES[self.step]
-#        if self.alter < 0 :
-#            alterext = 'b'
-#        else :
-#            alterext = '#'
-#        name = '%s%s' % (name, abs(self.alter) * alterext)
-#        return name
-    
     @property
     def column(self):
         return self.scale.index(self.midi)
     @property
     def column(self):
         return self.scale.index(self.midi)