bugfix : le refrain n'est plus répété à la fin de la chanson.
authorpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 29 Jun 2010 12:44:46 +0000 (12:44 +0000)
committerpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 29 Jun 2010 12:44:46 +0000 (12:44 +0000)
git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@259 fe552daf-6dbe-4428-90eb-1537e0879342

src/minwii/musicxml.py

index d7651b2..ff819e1 100755 (executable)
@@ -57,9 +57,8 @@ class Part(object) :
         self._parseMusic()
         self.verses = [[]]
         self.chorus = []
-        if autoDetectChorus :
-            self._findChorus()
-        self._findVersesLoops()
+        self.songStartsWithChorus = False
+        self._findVersesLoops(autoDetectChorus)
     
     def _parseMusic(self) :
         divisions = 0
@@ -121,25 +120,7 @@ class Part(object) :
         self.quarterNoteDuration = int(round(60000/tempo))
         
         
-
-    def _findChorus(self):
-        """ le refrain correspond aux notes pour lesquelles
-            il n'existe q'une seule syllable attachée.
-        """
-        start = stop = None
-        for i, note in enumerate(self.notes) :
-            ll = len(note.lyrics)
-            if start is None and ll == 1 :
-                start = i
-            elif start is not None and ll > 1 :
-                stop = i
-                break
-        if not (start or stop) :
-            self.chorus = []
-        else :
-            self.chorus = self.notes[start:stop]
-    
-    def _findVersesLoops(self) :
+    def _findVersesLoops(self, autoDetectChorus) :
         "recherche des couplets / boucles"
         verse = self.verses[0]
         for note in self.notes[:-1] :
@@ -151,6 +132,13 @@ class Part(object) :
                 self.verses.append(verse)
         verse.append(self.notes[-1])
         
+        if autoDetectChorus and len(self.verses) > 1 :
+            for i, verse in enumerate(self.verses) :
+                if len(verse[0].lyrics) == 1 :
+                    self.chorus = self.verses.pop(i)
+                    self.songStartsWithChorus = i==0
+                    break
+        
     
     def iterNotes(self, indefinitely=True) :
         "exécution de la chanson avec l'alternance couplets / refrains"
@@ -159,6 +147,10 @@ class Part(object) :
         else :
             iterable = cycle(self.verses)
         for verse in iterable :
+            if self.songStartsWithChorus :
+                for note in self.chorus :
+                    yield note, 0
+                
             #print "---partie---"
             repeats = len(verse[0].lyrics)
             if repeats > 1 :