From ebb2dbd28b066434132a3a7f0bdea84e999bebcd Mon Sep 17 00:00:00 2001
From: Jean-Marie Favreau <J-Marie.Favreau@uca.fr>
Date: Tue, 29 Jan 2019 15:51:32 +0100
Subject: [PATCH] =?UTF-8?q?G=C3=A9n=C3=A9ration=20d'une=20partition=20colo?=
 =?UTF-8?q?r=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 boomwhackers-8.json | 16 +++++-----
 crescendo.py        |  1 +
 musique/exercice.py | 75 ++++++++++++++++++++++++++++++++++++++++-----
 musique/gamme.py    |  6 ++--
 4 files changed, 81 insertions(+), 17 deletions(-)

diff --git a/boomwhackers-8.json b/boomwhackers-8.json
index 475c890..b3d5498 100644
--- a/boomwhackers-8.json
+++ b/boomwhackers-8.json
@@ -1,10 +1,10 @@
 {
-  "do1": { "couleur": "#a73824", "capsule": "0" },
-  "re1": { "couleur": "#c56528", "capsule": "0" },
-  "mi1": { "couleur": "#f4e236", "capsule": "0" },
-  "fa1": { "couleur": "#f4e236", "capsule": "0" },
-  "sol1": { "couleur": "#27476d", "capsule": "0" },
-  "la1": { "couleur": "#413a88", "capsule": "0" },
-  "si1": { "couleur": "#682174", "capsule": "0" },
-  "do2": { "couleur": "#9c3922", "capsule": "0" }
+  "do1": { "couleur": [167, 56, 36], "capsule": "0" },
+  "re1": { "couleur": [197, 101, 40], "capsule": "0" },
+  "mi1": { "couleur": [244, 226, 54], "capsule": "0" },
+  "fa1": { "couleur": [150, 197, 40], "capsule": "0" },
+  "sol1": { "couleur": [46, 72, 109], "capsule": "0" },
+  "la1": { "couleur": [62, 58, 135], "capsule": "0" },
+  "si1": { "couleur": [106, 41, 131], "capsule": "0" },
+  "do2": { "couleur": [151, 55, 30], "capsule": "0" }
 }
diff --git a/crescendo.py b/crescendo.py
index 97c7f9b..9ee27c9 100644
--- a/crescendo.py
+++ b/crescendo.py
@@ -38,6 +38,7 @@ crescendo = [ [ [gamme.do(3), gamme.noire],
 if args.exerciceSpectrogramme:
   g = GenerateurExercice(gamme.bpm)
   g.setBoomwhackers(boomwhackers)
+  g.setLongueurPartitionColoree(4)
   g.genererExerciceSpectrogramme(crescendo,
                                  "exercices/ex-spec-crescendo.tex",
                                  "Crescendo")
diff --git a/musique/exercice.py b/musique/exercice.py
index 3d6e6f8..0b9b151 100644
--- a/musique/exercice.py
+++ b/musique/exercice.py
@@ -23,6 +23,13 @@ class GenerateurExercice(GammeTemperee):
         self.margeFrequenceLegende = 20
         self.margeLegende = 2.0
         self.boomwhackers = []
+        self.longueurPartitionColoree = 4
+
+    # donne la largeur d'une ligne de partition colorée, exprimée
+    # en nombre de noires
+    def setLongueurPartitionColoree(self, longueur):
+      self.longueurPartitionColoree = longueur
+    
 
     def setBoomwhackers(self, mw):
       import json
@@ -245,8 +252,10 @@ class GenerateurExercice(GammeTemperee):
       octaveCible = min([ n[0] for n in self.boomwhackers if n[1] == minNote[1] ] + [10000])
       return octaveCible - minNote[0]
     
+    def shiftNote(self, note, shiftOctave):
+      return (note[0] + shiftOctave, note[1])
     def estJouable(self, note, shiftOctave):
-      nN = (note[0] + shiftOctave, note[1])
+      nN = self.shiftNote(note, shiftOctave)
       return nN in self.boomwhackers
     
     def estDessinable(self, partitions):
@@ -258,30 +267,82 @@ class GenerateurExercice(GammeTemperee):
       
       minNote = min(notes)
       
-      shiftOctave = self.getTranslationOctaveBoomwhackers(minNote)
+      self.shiftOctave = self.getTranslationOctaveBoomwhackers(minNote)
       
-      if shiftOctave > 100:
+      if self.shiftOctave > 100:
         return False
       
       for n in notes:
-        if not self.estJouable(n, shiftOctave):
+        if not self.estJouable(n, self.shiftOctave):
           return False
       
       return True
     
+    def couleurBoomwhackerToTikz(self, mw):
+      return "\\definecolor{tempcolor}{rgb}{ "+ \
+          str(mw["couleur"][0] / 255.) +  ", " + \
+          str(mw["couleur"][1] / 255.) +  ", " + \
+          str(mw["couleur"][2] / 255.) +  "}"
+        
+      #return "{rgb, 255 :red, " + str(mw["couleur"][0]) \
+            #+ "; green, " + str(mw["couleur"][1]) \
+            #+ "; blue, " + str(mw["couleur"][2]) + "}"
+    
+    def pointColore(self, boomwhacker, x, y, r):
+      result = self.couleurBoomwhackerToTikz(boomwhacker)
+      result += "\\fill[fill=tempcolor] ("+ \
+                str(x) + "," +  str(y) + ") circle (" + str(r) + ");"
+      if boomwhacker["capsule"] == "1":
+         result += "\\fill [black] (" + str(x - r) + "," + str(y - 1.2 * r) + \
+                    ") rectangle (" + str(x + r) + ", " + str(y - 1.9 * r) + ");"
+
+      
+      return result
+    
     def partitionGraphique(self, partitions):
       result = ""
       
       frequences = self.notesDansPartition(partitions)
       
+      x = 0.
+      y = 0.
+      
+      stepx = 2
+      stepy = 2.5
+      
+      finDeLigne = self.longueurPartitionColoree * stepx
+      
+      nbl = 1
       if self.estDessinable(partitions):
         p = partitions[0]
-        result += "On peut la dessiner."
-        print "on peut la dessiner"
-        # TODO
+
+        result += "\\begin{tikzpicture}[]"
+        
+        
+        for note in p:
+          print note
+          if x == 0:
+            result += "\\node[draw] at (- " + str(stepx) + "," + str(y) + ") {" + str(nbl) + "};"
+          if isinstance(note[0], float):
+            # on dessine le point
+            if note[0] != 0:
+              n = self.shiftNote(self.getOctaveEtIDNote(note[0]), self.shiftOctave)
+              mw = self.boomwhackers[n]
+              result += self.pointColore(mw, x, y, stepx / 4.)
+            # on calcule la translation pour le point suivant
+            x += self.dureeEnNoires(note[1]) * stepx
+            if x >= finDeLigne:
+              x = 0
+              y -= stepy
+              nbl += 1
+              
+        
+        result += "\\end{tikzpicture}"
       else:
         result += "Cette partition n'est pas représentable sous forme de partition pour boomwhackers diatoniques."
       
+      print result
+      
       return result
 
     # cette fonction écrit la fin de l'exercice spectrogramme
diff --git a/musique/gamme.py b/musique/gamme.py
index 4719603..255ccb0 100644
--- a/musique/gamme.py
+++ b/musique/gamme.py
@@ -184,8 +184,10 @@ class GammeTemperee:
         return noms[duree]
       else:
         return "inconnue"
-
-    
+      
+    def dureeEnNoires(self, duree):
+      return duree / self.noire
+      
     # d'après wikipédia, «le triolet est une division exceptionnelle du temps, formée d'un 
     #groupe de trois figures égales dont la somme équivaut à deux figures identiques dans un 
     # temps normalement binaire. »
-- 
GitLab