diff --git a/Makefile b/Makefile
index 7c9ae6b4d4dc28c8c521f7efc1766c47447159b8..530843001df78112e8f373c497c4bffe4ce75778 100644
--- a/Makefile
+++ b/Makefile
@@ -2,38 +2,61 @@
 EXERCICESDIR=exercices/
 SONS=sons/
 SCRIPTS=$(wildcard *.py)
-EXESPECTEX=$(addprefix $(EXERCICESDIR)/ex-spec-,$(SCRIPTS:.py=.tex))
-EXESPECPDF=$(EXESPECTEX:.tex=.pdf)
-
-EXEPROJTEX=$(EXERCICESDIR)/ex-proj-joie.tex $(EXERCICESDIR)/ex-proj-brahms.tex $(EXERCICESDIR)/ex-proj-lune.tex  $(EXERCICESDIR)/ex-proj-tabac2.tex
+EXECOLLTEX=$(addprefix $(EXERCICESDIR)/ex-college-,$(SCRIPTS:.py=.tex))
+EXECOLLPDF=$(EXECOLLTEX:.tex=.pdf)
+EXEPRIMTEX=$(addprefix $(EXERCICESDIR)/ex-primaire-,$(SCRIPTS:.py=.tex))
+EXEPRIMPDF=$(EXEPRIMTEX:.tex=.pdf)
+EXEPROJTEX=$(addprefix $(EXERCICESDIR)/ex-proj-,$(SCRIPTS:.py=.tex))
 EXEPROJPDF=$(EXEPROJTEX:.tex=.pdf)
+EXECORRTEX=$(addprefix $(EXERCICESDIR)/ex-correction-,$(SCRIPTS:.py=.tex))
+EXECORRPDF=$(EXECORRTEX:.tex=.pdf)
+
+TEX=$(EXECOLLTEX) $(EXEPROJTEX) $(EXEPRIMTEX) $(EXECORRTEX)
+PDF=$(EXECOLLPDF) $(EXEPROJPDF) $(EXEPRIMPDF) $(EXECORRPDF)
+
 WAVES=$(addprefix $(SONS)/,$(SCRIPTS:.py=.wav))
+
 BOOMWHACKERS=boomwhackers-8.json
 
-.PRECIOUS: $(EXESPECTEX) $(EXEPROJTEX)
+.PRECIOUS: $(TEX)
 
 all: waves pdf
 
 waves: $(WAVES)
 
-pdf: $(EXESPECPDF) $(EXEPROJPDF)
+pdf: $(PDF)
 
-tex: $(EXESPECTEX) $(EXEPROJTEX)
+tex: $(TEX)
 
 $(EXERCICESDIR)/%.pdf: $(EXERCICESDIR)/%.tex
 	cd $(EXERCICESDIR); pdflatex $(<:$(EXERCICESDIR)/%=%); cd ..
 	
-$(EXERCICESDIR)/ex-spec-%.tex: %.py
-	python $< --exercice-spectrogramme --boomwhackers=$(BOOMWHACKERS)
+$(EXERCICESDIR)/ex-college-%.tex: %.py
+	python $< --exercice-spectrogramme $@ --boomwhackers=$(BOOMWHACKERS)
+
+$(EXERCICESDIR)/ex-primaire-%.tex: %.py
+	python $< --exercice-spectrogramme $@ --primaire --boomwhackers=$(BOOMWHACKERS)
 
-$(EXERCICESDIR)/ex-proj-%.tex: %.py
-	python $< --exercice-spectrogramme-transparent --boomwhackers=$(BOOMWHACKERS)
 	
+$(EXERCICESDIR)/ex-proj-%.tex: %.py
+	python $< --exercice-spectrogramme-transparent $@ --boomwhackers=$(BOOMWHACKERS)
+
+$(EXERCICESDIR)/ex-correction-%.tex: %.py
+	python $< --exercice-spectrogramme-correction $@ --boomwhackers=$(BOOMWHACKERS)
+
+
 $(SONS)/%.wav: %.py
 	python $< 
 	
 cleantex:
-	rm -f $(EXESPECTEX) 
+	rm -f $(TEX)
+	
+
+cleanpdf:
+	rm -f $(PDF)
+
+cleanwaves:
+	rm -f $(WAVES)
+	
+clean: cleantex cleanpdf cleanwaves
 	
-clean: cleantex
-	rm -f $(EXESPECPDF) $(WAVES)
diff --git a/boomwhackers-8.json b/boomwhackers-8.json
index 060f61bf9a831829efb85a5503e994d84b701c37..7d1d8e62084789d107b4ba0ca6f60c0a079a6ed3 100644
--- a/boomwhackers-8.json
+++ b/boomwhackers-8.json
@@ -1,6 +1,6 @@
 {
   "do1": { "couleur": [255, 0, 0], "capsule": "0", "court": "1" },
-  "re1": { "couleur": [255, 119, 0], "capsule": "0", "court": "1" },
+  "re1": { "couleur": [255, 170, 20], "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" },
diff --git a/brahms.py b/brahms.py
index 0310b3e27304f5a68b8d99c9a976c8c982ce5ef1..d6e29ce984a83fe2a3a057417321f12ebc492a64 100644
--- a/brahms.py
+++ b/brahms.py
@@ -8,9 +8,11 @@ from musique.exercice import GenerateurExercice
 from musique.gamme import GammeTemperee
 
 parser = argparse.ArgumentParser(description='Génère des documents à partir de la partition du thème Lullaby, berceuse de Brahms.')
-parser.add_argument('--exercice-spectrogramme', help="Génère un exercice plutôt que le fichier son", dest='exerciceSpectrogramme', action='store_true',default=False)
-parser.add_argument('--exercice-spectrogramme-transparent', help="Génère un exercice à projeter", dest='transparent', action='store_true',default=False)
+parser.add_argument('--exercice-spectrogramme', help="Génère un exercice plutôt que le fichier son", dest='exerciceSpectrogramme', nargs=1)
+parser.add_argument('--exercice-spectrogramme-transparent', help="Génère un exercice à projeter", dest='transparent', nargs=1)
+parser.add_argument('--exercice-spectrogramme-correction', help="Génère la correction pour l'enseignant", dest='correction', nargs=1)
 parser.add_argument('--boomwhackers', help="Fichier décrivant la configuration de boomwhackers disponible.", dest='boomwhackers', nargs=1)
+parser.add_argument('--primaire', help="Génère un exercice destiné aux primaires", dest='primaire', action='store_true',default=False)
 
 args = parser.parse_args()
 
@@ -56,15 +58,19 @@ brahms = [ [ [gamme.mi(3), gamme.croche],
         ] ]
 
 
-if args.exerciceSpectrogramme or args.transparent:
+if args.exerciceSpectrogramme or args.transparent or args.correction:
   g = GenerateurExercice(gamme.bpm)
   g.setBoomwhackers(boomwhackers)
   g.setLongueurPartitionColoree(6)
   g.setLongueurPartitionMusicale(12)
+  if args.primaire:
+    g.setTableauSimplifie(True)
   if args.exerciceSpectrogramme:
-    g.genererExerciceSpectrogramme(brahms, "exercices/ex-spec-brahms.tex", "thème 4", "Lullaby, berceuse de Brahms")
+    g.genererExerciceSpectrogramme(brahms, args.exerciceSpectrogramme[0], "thème 4")
   if args.transparent:
-    g.genererTransparentSpectrogramme(brahms, "exercices/ex-proj-brahms.tex", "thème 4", "Lullaby, berceuse de Brahms")
+    g.genererTransparentSpectrogramme(brahms, args.transparent[0], "thème 4", "Lullaby, berceuse de Brahms")
+  if args.correction:
+    g.genererCorrectionSpectrogramme(brahms, args.correction[0], "thème 4", "Lullaby, berceuse de Brahms")
   
 else:
   print "Génération du son"
diff --git a/joie.py b/joie.py
index e3dfbab87bca93d1cb708fca93027340fd4c1218..51f36182e185ca41b26aa2b56abd25227a3925a7 100644
--- a/joie.py
+++ b/joie.py
@@ -8,9 +8,11 @@ from musique.exercice import GenerateurExercice
 from musique.gamme import GammeTemperee
 
 parser = argparse.ArgumentParser(description='Génère des documents à partir de la partition du thème ode à la joie.')
-parser.add_argument('--exercice-spectrogramme', help="Génère un exercice plutôt que le fichier son", dest='exerciceSpectrogramme', action='store_true',default=False)
-parser.add_argument('--exercice-spectrogramme-transparent', help="Génère un exercice à projeter", dest='transparent', action='store_true',default=False)
+parser.add_argument('--exercice-spectrogramme', help="Génère un exercice plutôt que le fichier son", dest='exerciceSpectrogramme', nargs=1)
+parser.add_argument('--exercice-spectrogramme-transparent', help="Génère un exercice à projeter", dest='transparent', nargs=1)
+parser.add_argument('--exercice-spectrogramme-correction', help="Génère la correction pour l'enseignant", dest='correction', nargs=1)
 parser.add_argument('--boomwhackers', help="Fichier décrivant la configuration de boomwhackers disponible.", dest='boomwhackers', nargs=1)
+parser.add_argument('--primaire', help="Génère un exercice destiné aux primaires", dest='primaire', action='store_true',default=False)
 
 args = parser.parse_args()
 
@@ -68,15 +70,19 @@ joie = [ [ [E, gamme.noire],
         ] ]
 
 
-if args.exerciceSpectrogramme or args.transparent:
+if args.exerciceSpectrogramme or args.transparent or args.correction:
   g = GenerateurExercice(gamme.bpm)
   g.setBoomwhackers(boomwhackers)
   g.setLongueurPartitionColoree(8)
   g.setLongueurPartitionMusicale(16)
+  if args.primaire:
+    g.setTableauSimplifie(True)
   if args.exerciceSpectrogramme:
-    g.genererExerciceSpectrogramme(joie, "exercices/ex-spec-joie.tex", "thème 1", "Hymne à la joie")
+    g.genererExerciceSpectrogramme(joie, args.exerciceSpectrogramme[0], "thème 1")
   if args.transparent:
-    g.genererTransparentSpectrogramme(joie, "exercices/ex-proj-joie.tex", "thème 1", "Hymne à la joie")
+    g.genererTransparentSpectrogramme(joie, args.transparent[0], "thème 1", "Hymne à la joie")
+  if args.correction:
+    g.genererCorrectionSpectrogramme(joie, args.correction[0], "thème 1", "Hymne à la joie")
 else:
   print "Génération du son"
   s = BasicSequenceur(1, gamme.bpm, 0)
diff --git a/lune.py b/lune.py
index c054f12b700e5e637deb101fe9c899e727c6ad2c..93682e8539013cfc7303fe1c2296d9f686291820 100644
--- a/lune.py
+++ b/lune.py
@@ -8,9 +8,11 @@ from musique.exercice import GenerateurExercice
 from musique.gamme import GammeTemperee
 
 parser = argparse.ArgumentParser(description='Génère des documents à partir de la partition du thème au clair de la lune.')
-parser.add_argument('--exercice-spectrogramme', help="Génère un exercice plutôt que le fichier son", dest='exerciceSpectrogramme', action='store_true',default=False)
-parser.add_argument('--exercice-spectrogramme-transparent', help="Génère un exercice à projeter", dest='transparent', action='store_true',default=False)
+parser.add_argument('--exercice-spectrogramme', help="Génère un exercice plutôt que le fichier son", dest='exerciceSpectrogramme', nargs=1)
+parser.add_argument('--exercice-spectrogramme-transparent', help="Génère un exercice à projeter", dest='transparent', nargs=1)
+parser.add_argument('--exercice-spectrogramme-correction', help="Génère la correction pour l'enseignant", dest='correction', nargs=1)
 parser.add_argument('--boomwhackers', help="Fichier décrivant la configuration de boomwhackers disponible.", dest='boomwhackers', nargs=1)
+parser.add_argument('--primaire', help="Génère un exercice destiné aux primaires", dest='primaire', action='store_true',default=False)
 
 args = parser.parse_args()
 
@@ -42,15 +44,19 @@ lune = [ [ [gamme.do(4), gamme.croche],
         ] ]
 
 
-if args.exerciceSpectrogramme or args.transparent:
+if args.exerciceSpectrogramme or args.transparent or args.correction:
   g = GenerateurExercice(gamme.bpm)
   g.setBoomwhackers(boomwhackers)
   g.setLongueurPartitionColoree(4)
+  if args.primaire:
+    g.setTableauSimplifie(True)
   if args.exerciceSpectrogramme:
-    g.genererExerciceSpectrogramme(lune, "exercices/ex-spec-lune.tex", "thème 2", "Au clair de la lune")
+    g.genererExerciceSpectrogramme(lune, args.exerciceSpectrogramme[0], "thème 2")
   if args.transparent:
-    g.genererTransparentSpectrogramme(lune, "exercices/ex-proj-lune.tex", "thème 2", "Au clair de la lune")
-    
+    g.genererTransparentSpectrogramme(lune, args.transparent[0], "thème 2", "Au clair de la lune")
+  if args.correction:
+    g.genererCorrectionSpectrogramme(lune, args.correction[0], "thème 2", "Au clair de la lune")
+
 else:
   print "Génération du son"
   s = BasicSequenceur(1, gamme.bpm, 0)
diff --git a/musique/exercice.py b/musique/exercice.py
index a9b75f5d163cce1d9a19b03beb80a404c5dcc24a..2671e0c303078aaf1e8bd89dbf3888be00f2665b 100644
--- a/musique/exercice.py
+++ b/musique/exercice.py
@@ -25,6 +25,16 @@ class GenerateurExercice(GammeTemperee):
         self.boomwhackers = []
         self.longueurPartitionColoree = 4
         self.longueurPartitionMusicale = 16
+        self.tableauSimplifie = False
+
+
+    def setMinMaxOctaves(self, partitions):
+      notes = self.getOctaveEtIDNoteDansIntervalle(self.minFrequence(partitions), self.maxFrequence(partitions))
+      self.minOctave = min([n[0] for n in notes])
+      self.maxOctave = max([n[0] for n in notes])
+
+    def setTableauSimplifie(self, simplifie):
+      self.tableauSimplifie = simplifie
 
     # donne la largeur d'une ligne de partition colorée, exprimée
     # en nombre de noires
@@ -147,7 +157,7 @@ class GenerateurExercice(GammeTemperee):
     def piedBeamer(self):
         return "\\end{document}\n"
     # cette fonction écrit le début de l'exercice spectrogramme
-    def debutExerciceSpectrogramme(self):
+    def debutExerciceSpectrogramme(self, section = True):
         result = "\n"
         #result += "\\section{Les fréquences de la gamme tempérée}\n"
         #result += "La fréquence associée à chacune des notes notées sur une partition a varié au fil du temps. La conférence internationale de Londres de 1953 a fixé à 440~Hz la fréquence du $la^3$, ou \emph{$la$ du diapason}. Le système d'accord le plus répandu aujourd'hui est la gamme tempérée, qui divise l'octave en 12 intervalles chromatiques égaux, en s'éloignant légèrement des intonations justes afin de simplifier la gamme tout en permettant les accords conçus aux siècles précédents. Le tableau ci-dessous donne les fréquences pour chacune des notes de l'octave contenant le $la$ du diapason.\n"
@@ -162,8 +172,8 @@ class GenerateurExercice(GammeTemperee):
         #result += "\n"
         #result += "\n"
         result += "\n"
-        result += "\\section{Analyse de spectrogramme}\n"
-        # TODO
+        if section:
+          result += "\\section{Analyse de spectrogramme}\n"
         return result
 
 
@@ -171,7 +181,10 @@ class GenerateurExercice(GammeTemperee):
     # retourne un tableau des durées des notes possibles dans la partition
     def tableauDurees(self, partitions):
         result = "\n"
-        result += "Cette partition est proposée à une fréquence de " + str(self.bpm) + " noires par minute, ce qui donne les durées suivantes."
+        if not self.tableauSimplifie:
+          result += "Cette partition est proposée à une fréquence de " + str(self.bpm) + " noires par minute, ce qui donne les durées suivantes."
+        else:
+          result += "Les durées traits sur le graphique peuvent être traduites en durée musicale"
         
         ds = self.durees(partitions)
         
@@ -188,20 +201,20 @@ class GenerateurExercice(GammeTemperee):
         result += "\\\\ \n"
         result += "\\hline\n"
         
+        if not self.tableauSimplifie:
+          result += "\\textbf{Longueur} (cm) "
+          for duree in ds:
+            result += "& " + '{0:.2f}'.format(self.dureeEnCm(duree)).replace(".", ",")
+          result += "\\\\ \n"
+          result += "\\hline\n"
+          
+          result += "\\textbf{Durée} (s)"
+          for duree in ds:
+            result += "& " + '{0:.2f}'.format(duree).replace(".", ",")
+          result += "\\\\ \n"
+          result += "\\hline\n"
         
-        result += "\\textbf{Longueur} (cm) "
-        for duree in ds:
-          result += "& " + '{0:.2f}'.format(self.dureeEnCm(duree)).replace(".", ",")
-        result += "\\\\ \n"
-        result += "\\hline\n"
-        
-        result += "\\textbf{Durée} (s)"
-        for duree in ds:
-          result += "& " + '{0:.2f}'.format(duree).replace(".", ",")
-        result += "\\\\ \n"
-        result += "\\hline\n"
-        
-        result += "\\textbf{Tête de note}"
+        result += "\\textbf{Durée musicale}"
         for duree in ds:
           result += "& " + self.nomDuree(duree)
         result += "\\\\ \n"
@@ -222,31 +235,22 @@ class GenerateurExercice(GammeTemperee):
         
         result = "\\renewcommand{\\arraystretch}{1.3}"
         result += "\\begin{table}[H]\n\centering\n"
-        if solution:
-          result += "\\begin{tabular}{|c||c|c||c|c|}\n"
-        else:
-          result += "\\begin{tabular}{|c||c|c|}\n"
+        result += "\\begin{tabular}{|c||c|c|}\n"
         result += "\\hline\n"
-        if solution:
-          result += " & \multicolumn{2}{c||}{Transcription} & \multicolumn{2}{c|}{Codage} \\\\ \n"
-          result += "\\textbf{Note} & \\textbf{Fréquence} (Hz) & \\textbf{Durée} (s) &\qquad\\textbf{Note}\qquad~ & \qquad\\textbf{Tête}\qquad~ \\\\ \n"
-        else:
-          result += " & \multicolumn{2}{c|}{Codage} \\\\ \n"
-          result += "\\textbf{Durée} (s) &\qquad\\textbf{Note}\qquad~ & \qquad\\textbf{Tête}\qquad~ \\\\ \n"
+        result += " & \multicolumn{2}{c|}{Codage} \\\\ \n"
+        result += " &\qquad\\textbf{Note}\qquad~ & \qquad\\textbf{Durée}\qquad~ \\\\ \n"
         result += "\\hline \n"
         for i, note in enumerate(partition):
           result += str(i + 1) + " & "
           if solution:
             if isinstance(note[0], float):
               if note[0] > 0:
-                result +=  str(int(round(note[0]))) + " & " + '{0:.2f}'.format(note[1]).replace(".", ",") + " & "
-                result += self.frequenceToLaTeX(note[0]) +  "& " + self.nomDuree(note[1]) + " \\\\\n"
+                result += self.frequenceToLaTeX(note[0], 
+                                                self.minOctave, self.maxOctave) +  "& " + self.nomDuree(note[1]) + " \\\\\n"
               else:
-                result += " & "+ '{0:.2f}'.format(note[1]).replace(".", ",") + " & "
                 result += " & " + self.nomDuree(note[1]) + " \\\\\n"
                 result += "\\hline\n"
             else:
-              result +=  ', '.join(['{0:.2f}'.format(n) for n in note[0]]) + " & " + '{0:.2f}'.format(note[1]).replace(".", ",")
               result += " & " + ', '.join([self.frequenceToLaTeX(n) for n in note[0]]) + " & " + self.nomDuree(note[1]) + " \\\\\n"
               result += "\\hline\n"
           else:
@@ -277,7 +281,8 @@ class GenerateurExercice(GammeTemperee):
       result += "\\hline \n"
       
       for note in notes:
-        result += str(int(round(self.note(note[0], note[1])))) + " & " + self.toLaTeX(note[0], note[1]) + "\\\\\n"
+        result += str(int(round(self.note(note[0], note[1])))) + " & " + self.toLaTeX(note[0], note[1], 
+                                                                                      self.minOctave, self.maxOctave) + "\\\\\n"
         result += "\\hline\n"
       
       result += "\\end{tabular}\n"
@@ -358,7 +363,7 @@ class GenerateurExercice(GammeTemperee):
         result += "&"
         if beamer:
           result += "\\hspace*{.2cm}"
-        result += self.frequenceToLaTeX(n)
+        result += self.frequenceToLaTeX(n, self.minOctave, self.maxOctave)
         if beamer:
           result += "\\hspace*{.2cm}"
       result += "\\\\ \n"
@@ -517,7 +522,7 @@ class GenerateurExercice(GammeTemperee):
 
 
     # cette fonction écrit la fin de l'exercice spectrogramme
-    def finExerciceSpectrogramme(self, partitions, nomSolution):
+    def finExerciceSpectrogramme(self, partitions):
         result = "\n"
 
         result += "~\\clearpage\n"
@@ -538,7 +543,11 @@ class GenerateurExercice(GammeTemperee):
         
         result += self.tableauNotesBrutes(partitions, False)
 
-
+        return result
+      
+      
+    def finCorrectionSpectrogramme(self, partitions, nomSolution):
+        result = "\n"
         result += "~\\clearpage\n"
         result += "\\section{Solution}\n"
         # on écrit le tableau solution de l'exercice
@@ -555,9 +564,9 @@ class GenerateurExercice(GammeTemperee):
         if nomSolution != "":
           result += "\\section{Solution}\n"
           result += "Cette mélodie s'appelle " + nomSolution
-
-
+          
         return result
+
     
     def frequenceEnCm(self, frequence):
       return (self.margeFrequence + frequence - self.fmin) * self.echelleY
@@ -742,7 +751,9 @@ class GenerateurExercice(GammeTemperee):
     #   où chaque liste décrit la partition d'une "main". Une partition est décrite comme 
     #   une liste d'éléments composés d'une ou plusieurs notes (quantifiée par une frequence) et d'une duree exprimee en seconde.
     # * nomFichier: le nom d'un fichier où sera sauvée la feuille d'exercice
-    def genererExerciceSpectrogramme(self, partitions, nomFichier, nomMelodie, nomSolution=""):
+    def genererExerciceSpectrogramme(self, partitions, nomFichier, nomMelodie):
+       
+        self.setMinMaxOctaves(partitions)
        
         # on ouvre le fichier
         l_fichier = open(nomFichier, "w")
@@ -757,16 +768,39 @@ class GenerateurExercice(GammeTemperee):
         l_fichier.write(self.spectrogramme(partitions))
         
         # on écrit la suite de l'exercice
-        l_fichier.write(self.finExerciceSpectrogramme(partitions, nomSolution))
+        l_fichier.write(self.finExerciceSpectrogramme(partitions))
         
         # on écrit la fin du document LaTeX
         l_fichier.write(self.piedLaTeX())
         
         # on ferme le fichier
         l_fichier.close()
+
+    # Genère une feuille de correction de l'exercice, au format LaTeX 
+    # à partir des notes donnees en paramètre.
+    def genererCorrectionSpectrogramme(self, partitions, nomFichier, nomMelodie, nomSolution=""):
+        self.setMinMaxOctaves(partitions)
         
-    def genererTransparentSpectrogramme(self, partitions, nomFichier, nomMelodie, nomSolution=""):
+        # on ouvre le fichier
+        l_fichier = open(nomFichier, "w")
+        
+        # on écrit les entêtes du document LaTeX
+        l_fichier.write(self.enteteLaTex("Correction de " + nomMelodie))
         
+        # on écrit le début de l'exercice
+        l_fichier.write(self.debutExerciceSpectrogramme(False))
+        
+        # on écrit la suite de l'exercice
+        l_fichier.write(self.finCorrectionSpectrogramme(partitions, nomSolution))
+        
+        # on écrit la fin du document LaTeX
+        l_fichier.write(self.piedLaTeX())
+        
+        # on ferme le fichier
+        l_fichier.close()
+        
+    def genererTransparentSpectrogramme(self, partitions, nomFichier, nomMelodie, nomSolution=""):
+        self.setMinMaxOctaves(partitions)
         # on ouvre le fichier
         l_fichier = open(nomFichier, "w")
         
diff --git a/musique/gamme.py b/musique/gamme.py
index 7695aa760a8c636d8b25febab7bf4be32ce870d5..86f47e5547fe5b497dcb470cdfb3cb577d548619 100644
--- a/musique/gamme.py
+++ b/musique/gamme.py
@@ -63,10 +63,22 @@ class GammeTemperee:
       return self.frequences[idNote] / (2 ** (7 - octave))
     
     # converti une note en son écriture en LaTeX
-    def toLaTeX(self, octave, idNote):
-      notes = [ ["do"], ["do$\\sharp$", "ré$\\flat$"], ["ré"], ["ré$\\sharp$", "mi$\\flat$"],
-               ["mi"], ["fa"], ["fa$\\sharp$", "sol$\\flat$"], ["sol"], ["sol$\\sharp$", "la$\\flat$"],
-               ["la"], ["la$\\sharp$", "si$\\flat$"], ["si"]]
+    # si minOctave et maxOctave sont différents de None, il s'agit
+    # des octaves minimum et maximum qui seront utilisées dans le morceau
+    # et qui entraîneront une notation simplifiée s'il y a peu d'amplitude
+    def toLaTeX(self, octave, idNote, minOctave = None, maxOctave = None):
+      notes = [ ["do"], ["do$\\sharp$"], ["ré"], ["mi$\\flat$"],
+               ["mi"], ["fa"], ["fa$\\sharp$"], ["sol"], ["sol$\\sharp$"],
+               ["la"], ["si$\\flat$"], ["si"]]
+      if (not minOctave is None) and (not maxOctave is None):
+        if minOctave == maxOctave:
+          return ", ".join([str(n) for n in notes[idNote]])
+        elif maxOctave - minOctave == 1:
+          if octave == minOctave:
+            return ", ".join([str(n) + "$_\\bullet$" for n in notes[idNote]])
+          else:
+            return ", ".join([str(n) + "$^\\bullet$" for n in notes[idNote]])
+      # otherwise, full version
       return ", ".join([n + " $^" + str(octave) + "$" for n in notes[idNote]])
 
     # definition de la frequence du silence
@@ -102,10 +114,13 @@ class GammeTemperee:
       print("erreur, note inconnue: " + str(note))
       return (-1, -1)
 
-    # converti une note donnée en fréquence en son écriture LaTeX
-    def frequenceToLaTeX(self, frequence):
+    # converti une note donnée en fréquence en son écriture LaTeX
+    # si minOctave et maxOctave sont différents de None, il s'agit
+    # des octaves minimum et maximum qui seront utilisées dans le morceau
+    # et qui entraîneront une notation simplifiée s'il y a peu d'amplitude
+    def frequenceToLaTeX(self, frequence, minOctave = None, maxOctave = None):
       (o, i) = self.getOctaveEtIDNote(frequence)
-      return self.toLaTeX(o, i)
+      return self.toLaTeX(o, i, minOctave, maxOctave)
     
     def dureeToMusicTex(self, duree):
       if duree == self.ronde:
diff --git a/tabac2.py b/tabac2.py
index b2f76afd9638b858baafa0b77253b2befb19c18b..0aef532e71fa6b3ea15513382997dfab16608d9c 100644
--- a/tabac2.py
+++ b/tabac2.py
@@ -8,9 +8,11 @@ from musique.exercice import GenerateurExercice
 from musique.gamme import GammeTemperee
 
 parser = argparse.ArgumentParser(description='Génère des documents à partir de la partition du thème j\'ai du bon tabac.')
-parser.add_argument('--exercice-spectrogramme', help="Génère un exercice plutôt que le fichier son", dest='exerciceSpectrogramme', action='store_true',default=False)
-parser.add_argument('--exercice-spectrogramme-transparent', help="Génère un exercice à projeter", dest='transparent', action='store_true',default=False)
+parser.add_argument('--exercice-spectrogramme', help="Génère un exercice plutôt que le fichier son", dest='exerciceSpectrogramme', nargs=1)
+parser.add_argument('--exercice-spectrogramme-transparent', help="Génère un exercice à projeter", dest='transparent', nargs=1)
+parser.add_argument('--exercice-spectrogramme-correction', help="Génère la correction pour l'enseignant", dest='correction', nargs=1)
 parser.add_argument('--boomwhackers', help="Fichier décrivant la configuration de boomwhackers disponible.", dest='boomwhackers', nargs=1)
+parser.add_argument('--primaire', help="Génère un exercice destiné aux primaires", dest='primaire', action='store_true',default=False)
 
 args = parser.parse_args()
 
@@ -53,15 +55,19 @@ tabac = [ [ [gamme.do(3), gamme.croche],
         ] ]
 
 
-if args.exerciceSpectrogramme or args.transparent:
+if args.exerciceSpectrogramme or args.transparent or args.correction:
   g = GenerateurExercice(gamme.bpm)
   g.setBoomwhackers(boomwhackers)
   g.setLongueurPartitionColoree(6)
   g.setLongueurPartitionMusicale(8)
+  if args.primaire:
+    g.setTableauSimplifie(True)
   if args.exerciceSpectrogramme:
-    g.genererExerciceSpectrogramme(tabac, "exercices/ex-spec-tabac2.tex", "thème 3", "j'ai du bon tabac")
+    g.genererExerciceSpectrogramme(tabac, args.exerciceSpectrogramme[0], "thème 3")
   if args.transparent:
-    g.genererTransparentSpectrogramme(tabac, "exercices/ex-proj-tabac2.tex", "thème 3", "j'ai du bon tabac")
+    g.genererTransparentSpectrogramme(tabac, args.transparent[0], "thème 3", "j'ai du bon tabac")
+  if args.correction:
+    g.genererCorrectionSpectrogramme(tabac, args.correction[0], "thème 3", "j'ai du bon tabac")
 else:
   print "Génération du son"
   s = BasicSequenceur(1, gamme.bpm, 0)