From f890332656201a3482990ff86b5122173d4b748d Mon Sep 17 00:00:00 2001
From: Jean-Marie Favreau <jm.trivial@gmail.com>
Date: Mon, 21 Jan 2019 12:36:51 +0100
Subject: [PATCH] =?UTF-8?q?D=C3=A9but=20de=20prise=20en=20charge=20des=20p?=
 =?UTF-8?q?artitions=20graphiques?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 musique/exercice.py | 37 ++++++++++++++++++++++++++++++++++++-
 musique/gamme.py    | 16 ++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/musique/exercice.py b/musique/exercice.py
index 9ce1cf8..3ab4079 100644
--- a/musique/exercice.py
+++ b/musique/exercice.py
@@ -233,6 +233,39 @@ class GenerateurExercice(GammeTemperee):
       result += "\\end{table}\n"
       return result
         
+    
+    def estDessinable(self, partitions):
+      if len(partitions) != 1:
+        print "plus d'une partition"
+        return False
+      if self.contientNoteAlteree(partitions):
+        print "note alteree"
+        return False
+      
+      notes = [ self.getOctaveEtIDNote(p) for p in self.notesDansPartition(partitions) ]
+      
+      minNote = min(notes)
+      maxNote = max(notes)
+      
+      print notes
+      # si les notes sont dans une même gamme
+      # ou qu'elles sont sur deux gammes, avec le do dans la gamme suivante
+      return minNote[0] == maxNote[0] or (minNote[0] == maxNote[0] + 1 and maxNote[1] == 0)
+
+    
+    def partitionGraphique(self, partitions):
+      result = ""
+      
+      frequences = self.notesDansPartition(partitions)
+      
+      if self.estDessinable(partitions):
+        p = partitions[0]
+        # TODO
+        result += "On peut la dessiner."
+      else:
+        result += "Cette partition n'est pas représentable sous forme de partition pour boomwhackers diatoniques."
+      
+      return result
 
     # cette fonction écrit la fin de l'exercice spectrogramme
     def finExerciceSpectrogramme(self, partitions):
@@ -261,6 +294,9 @@ class GenerateurExercice(GammeTemperee):
         # on écrit le tableau solution de l'exercice
         result += self.tableauNotesBrutes(partitions, True)
 
+        result += "\\section{Partition graphique}\n"
+        # on écrit le tableau solution de l'exercice
+        result += self.partitionGraphique(partitions)
 
         return result
     
@@ -288,7 +324,6 @@ class GenerateurExercice(GammeTemperee):
     # à l'horodatage donné
     def accordSpectrogrammePartition(self, accord, horodatage, couleur):
       if isinstance(accord[0], float):
-        print "duree", accord[1], self.nomDuree(accord[1])
         return self.noteSpectrogrammePartition(accord[0], accord[1], horodatage, couleur)
       else:
         return ''.join([self.noteSpectrogrammePartition(note, accord[1], horodatage, couleur) for note in accord[0]])
diff --git a/musique/gamme.py b/musique/gamme.py
index 0681876..56938b7 100644
--- a/musique/gamme.py
+++ b/musique/gamme.py
@@ -125,6 +125,22 @@ class GammeTemperee:
       l = [[ x for x in [note[0] if isinstance(note[0], float) else note[0] for note in partition] if x != 0.] for partition in partitions]
       return list(set([ j for i in l for j in i ]))
       
+      
+    def isNoteAlteree(self, frequence):
+      (o, i) = self.getOctaveEtIDNote(frequence)
+      return i in [ 1, 3, 6, 8, 10 ]
+      
+    def contientNoteAlteree(self, partitions):
+      for partition in partitions:
+        for note in partition:
+          if isinstance(note[0], float):
+            if self.isNoteAlteree(note[0]):
+              return True
+          else:
+            for n in note:
+              if self.isNoteAlteree(n[0]):
+                return True
+      return False
 
     # retourne la fréquence minimum utilisée dans les partitions
     def minFrequence(self, partitions):
-- 
GitLab