diff --git a/boomwhackers-8.json b/boomwhackers-8.json
index eada19bfb460588ccab4ec9601e4518aec3b5caa..060f61bf9a831829efb85a5503e994d84b701c37 100644
--- a/boomwhackers-8.json
+++ b/boomwhackers-8.json
@@ -1,10 +1,10 @@
 {
-  "do1": { "couleur": [167, 56, 36], "capsule": "0", "court": "1" },
-  "re1": { "couleur": [197, 101, 40], "capsule": "0", "court": "0" },
-  "mi1": { "couleur": [244, 226, 54], "capsule": "0", "court": "0" },
-  "fa1": { "couleur": [150, 197, 40], "capsule": "0", "court": "0" },
-  "sol1": { "couleur": [46, 72, 109], "capsule": "0", "court": "0" },
-  "la1": { "couleur": [62, 58, 135], "capsule": "0", "court": "0" },
-  "si1": { "couleur": [106, 41, 131], "capsule": "0", "court": "0" },
-  "do2": { "couleur": [151, 55, 30], "capsule": "0", "court": "0" }
+  "do1": { "couleur": [255, 0, 0], "capsule": "0", "court": "1" },
+  "re1": { "couleur": [255, 119, 0], "capsule": "0", "court": "1" },
+  "mi1": { "couleur": [255, 238, 0], "capsule": "0", "court": "1" },
+  "fa1": { "couleur": [81, 255, 0], "capsule": "0", "court": "1" },
+  "sol1": { "couleur": [0, 118, 88], "capsule": "0", "court": "1" },
+  "la1": { "couleur": [140, 0, 255], "capsule": "0", "court": "1" },
+  "si1": { "couleur": [221, 0, 115], "capsule": "0", "court": "1" },
+  "do2": { "couleur": [255, 0, 0], "capsule": "0", "court": "0" }
 }
diff --git a/musique/exercice.py b/musique/exercice.py
index 479b50387363355eeb4885d2f87be89d5efe436c..2c61a60afe70fb3b111dfdf5eafb0cef3a625d88 100644
--- a/musique/exercice.py
+++ b/musique/exercice.py
@@ -95,6 +95,8 @@ class GenerateurExercice(GammeTemperee):
         result += "\\usetikzlibrary{arrows}\n"
         result += "\\pagestyle{empty}\n"
         result += "\\usepackage{helvet}"
+        result += "\\usepackage{musixtex}"
+        result += "\\usepackage{harmony}"
         result += "\\renewcommand{\\familydefault}{\\sfdefault}"
 
 
@@ -293,7 +295,7 @@ class GenerateurExercice(GammeTemperee):
     
     def pointColore(self, boomwhacker, x, y, r):
       result = self.couleurBoomwhackerToTikz(boomwhacker)
-      rayon = r if boomwhacker["court"] == "0" else r * 0.7
+      rayon = r * 1.2 if boomwhacker["court"] == "0" else r
       result += "\\fill[fill=tempcolor] ("+ \
                 str(x) + "," +  str(y) + ") circle (" + str(rayon) + ");"
       if boomwhacker["capsule"] == "1":
@@ -329,7 +331,7 @@ class GenerateurExercice(GammeTemperee):
       result += "Prénom"
       for n in notes:
         result += "&"
-        result += "\\hspace*{2.5cm}"
+        result += "\\hspace*{2cm}"
       result += "\\\\ \n"
       result += "\\hline\n"
       result += "\\end{tabular}\n"
@@ -347,7 +349,7 @@ class GenerateurExercice(GammeTemperee):
       
       stepx = 2
       stepy = 2.5
-      radius = stepx / 4.
+      radius = stepx * 0.22
       
       finDeLigne = self.longueurPartitionColoree * stepx
       
@@ -389,6 +391,49 @@ class GenerateurExercice(GammeTemperee):
             
       return result
 
+    def partitionMusicale(self, partitions):
+      result = ""
+      if len(partitions) == 1:
+        partition = partitions[0]
+        
+        for n in partition:
+          if not isinstance(n[0], float):
+            result += "Le générateur d'exercice ne prend pas en charge cette partition."
+            return result
+        
+        notes = [ self.getOctaveEtIDNote(p) for p in self.notesDansPartition(partitions) ]
+        minNote = min([ n for n in notes if n[1] > 0])
+        (minoctave, minidnote) = minNote
+        maxNote = max([ n for n in notes if n[1] > 0])
+        (maxoctave, maxidnote) = maxNote
+        midOctave = int((maxoctave + minoctave) / 2)
+      
+        result += "\\begin{figure}[H]"
+        result += "\\begin{music}"
+        result += "\\parindent10mm"
+        result += "\\startextract"
+        result += "\\notes "
+        for note in partition:
+          if note[0] != 0:
+            result += self.dureeToMusicTex(note[1]) + "{"
+            result += self.frequenceToMusicTeX(note[0], midOctave)
+            result += "}"
+          else:
+            # TODO
+            pass
+        
+        result +="\enotes"
+        result += "\\zendextract"
+        result += "\\end{music}"
+        result += "\\caption{Partition simplifiée}"
+        result += "\\end{figure}"
+
+      else:
+        result += "Le générateur d'exercice ne prend pas en charge cette partition."
+        
+      return result
+
+
     # cette fonction écrit la fin de l'exercice spectrogramme
     def finExerciceSpectrogramme(self, partitions):
         result = "\n"
@@ -417,9 +462,12 @@ class GenerateurExercice(GammeTemperee):
         result += self.tableauNotesBrutes(partitions, True)
 
         result += "\\section{Partition graphique}\n"
-        # on écrit le tableau solution de l'exercice
         result += self.partitionGraphique(partitions)
 
+        result += "\\section{Partition musicale}\n"
+        result += self.partitionMusicale(partitions)
+
+
         return result
     
     def frequenceEnCm(self, frequence):
diff --git a/musique/gamme.py b/musique/gamme.py
index 221aac81c41074674f38579987ea0b50f1bdc73a..7695aa760a8c636d8b25febab7bf4be32ce870d5 100644
--- a/musique/gamme.py
+++ b/musique/gamme.py
@@ -106,6 +106,64 @@ class GammeTemperee:
     def frequenceToLaTeX(self, frequence):
       (o, i) = self.getOctaveEtIDNote(frequence)
       return self.toLaTeX(o, i)
+    
+    def dureeToMusicTex(self, duree):
+      if duree == self.ronde:
+        return "\\wh"
+      elif duree == self.rondepointee:
+        return "\\whp"
+      elif duree == self.blanche:
+        return "\\ha"
+      elif duree == self.blanchepointee:
+        return "\\hap"
+      elif duree == self.noire:
+        return "\\qa"
+      elif duree == self.noirepointee:
+        return "\\qap"
+      elif duree == self.croche:
+        return "\\ca"
+      elif duree == self.crochepointee:
+        return "\\clp"
+      elif duree == self.doublecroche:
+        return "\\cca"
+      elif duree == self.doublecrochepointee:
+        return "\\cclp"
+      elif duree == self.triplecroche:
+        return "\\ccca"
+      elif duree == self.triplecrochepointee:
+        return "\\ccclp"
+    
+    def toMusicTeX(self, octave, idNote, octaveRef):
+      # voir https://fr.wikibooks.org/wiki/LaTeX/%C3%89crire_de_la_musique
+      if octave == octaveRef:
+        notes = [ "c", "^c", "d", "^d",
+                "e", "f", "^f", "g", "^g",
+                "h", "^h", "i"]
+        return notes[idNote]
+      elif octave - octaveRef == 1:
+        notes = [ "j", "^j", "k", "^k",
+                "l", "m", "^m", "n", "^n",
+                "o", "^o", "p"]
+        return notes[idNote]
+      elif octave - octaveRef == -1:
+        notes = [ "J", "^J", "K", "^K",
+                "L", "M", "^M", "N", "^N",
+                "a", "^a", "b"]
+        return notes[idNote]
+      elif octave - octaveRef == -2:
+        notes = [ "C", "^C", "D", "^D",
+                "E", "F", "^F", "G", "^G",
+                "H", "^H", "I"]
+        return notes[idNote]
+      elif octave - octaveRef == 2:
+        notes = [ "q", "^q", "r", "^r",
+                "s", "t", "^t", "u", "^u",
+                "v", "^v", "w"]
+        return notes[idNote]
+      
+    def frequenceToMusicTeX(self, frequence, octaveRef):
+      (o, i) = self.getOctaveEtIDNote(frequence)
+      return self.toMusicTeX(o, i, octaveRef)
 
     # retourne l'octave et l'identifiant de la note pour chacune des notes de l'intervalle donné en fréquence
     def getOctaveEtIDNoteDansIntervalle(self, noteMin, noteMax):