diff --git a/Makefile b/Makefile
index 2991122938b88c9a34ff8b623559b6a93db04e44..69a99a548d007f9021f48b6cd5e8468ea57572c5 100644
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ PDF=$(EXECOLLPDF) $(EXEPROJPDF) $(EXEPRIMPDF) $(EXECORRPDF)
 
 WAVES=$(addprefix $(SONS)/,$(SCRIPTS:.py=.wav))
 
-BOOMWHACKERS=boomwhackers-8+5.json
+BOOMWHACKERS=boomwhackers-8+5+c.json
 
 .PRECIOUS: $(TEX)
 
diff --git a/boomwhackers-8+5+c.json b/boomwhackers-8+5+c.json
new file mode 100644
index 0000000000000000000000000000000000000000..3e1da36ffb3e66725a3ba343d0c9b2d15d056d13
--- /dev/null
+++ b/boomwhackers-8+5+c.json
@@ -0,0 +1,31 @@
+{
+  "do1": { "couleur": [255, 0, 0], "capsule": "1", "court": "1" },
+  "re1": { "couleur": [255, 170, 20], "capsule": "1", "court": "1" },
+  "mi1": { "couleur": [255, 238, 0], "capsule": "1", "court": "1" },
+  "fa1": { "couleur": [81, 255, 0], "capsule": "1", "court": "1" },
+  "sol1": { "couleur": [0, 118, 88], "capsule": "1", "court": "1" },
+  "la1": { "couleur": [140, 0, 255], "capsule": "1", "court": "1" },
+  "si1": { "couleur": [221, 0, 115], "capsule": "1", "court": "1" },
+  
+  "dod1": { "couleur": [255, 0, 0], "capsule": "1", "court": "1", "alteration": "\\#" },
+  "mib1": { "couleur": [255, 238, 0], "capsule": "1", "court": "1", "alteration" : "b"},
+  "fad1": { "couleur": [81, 255, 0], "capsule": "1", "court": "1", "alteration": "\\#" },
+  "sold1": { "couleur": [0, 118, 88], "capsule": "1", "court": "1", "alteration": "\\#" },
+  "sib1": { "couleur": [221, 0, 115], "capsule": "1", "court": "1", "alteration" : "b"  },
+  
+  "do2": { "couleur": [255, 0, 0], "capsule": "0", "court": "1" },
+  "re2": { "couleur": [255, 170, 20], "capsule": "0", "court": "1" },
+  "mi2": { "couleur": [255, 238, 0], "capsule": "0", "court": "1" },
+  "fa2": { "couleur": [81, 255, 0], "capsule": "0", "court": "1" },
+  "sol2": { "couleur": [0, 118, 88], "capsule": "0", "court": "1" },
+  "la2": { "couleur": [140, 0, 255], "capsule": "0", "court": "1" },
+  "si2": { "couleur": [221, 0, 115], "capsule": "0", "court": "1" },
+  "do3": { "couleur": [255, 0, 0], "capsule": "0", "court": "0" },
+  
+  "dod2": { "couleur": [255, 0, 0], "capsule": "0", "court": "1", "alteration": "\\#" },
+  "mib2": { "couleur": [255, 238, 0], "capsule": "0", "court": "1", "alteration" : "b"},
+  "fad2": { "couleur": [81, 255, 0], "capsule": "0", "court": "1", "alteration": "\\#" },
+  "sold2": { "couleur": [0, 118, 88], "capsule": "0", "court": "1", "alteration": "\\#" },
+  "sib2": { "couleur": [221, 0, 115], "capsule": "0", "court": "1", "alteration" : "b"  }
+
+}
diff --git a/boomwhackers-8+5.json b/boomwhackers-8+5.json
index 3cf596ee2a4a714b8d7bd2dbf24486bfe48c4e29..8c57bbb030285ae947139e3cca010c05463ed91e 100644
--- a/boomwhackers-8+5.json
+++ b/boomwhackers-8+5.json
@@ -1,16 +1,31 @@
 {
-  "do1": { "couleur": [255, 0, 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" },
-  "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" },
+  "do1": { "couleur": [255, 0, 0], "capsule": "1", "court": "1" },
+  "re1": { "couleur": [255, 170, 20], "capsule": "1", "court": "1" },
+  "mi1": { "couleur": [255, 238, 0], "capsule": "1", "court": "1" },
+  "fa1": { "couleur": [81, 255, 0], "capsule": "1", "court": "1" },
+  "sol1": { "couleur": [0, 118, 88], "capsule": "1", "court": "1" },
+  "la1": { "couleur": [140, 0, 255], "capsule": "1", "court": "1" },
+  "si1": { "couleur": [221, 0, 115], "capsule": "1", "court": "1" },
   
-  "dod1": { "couleur": [255, 0, 0], "capsule": "0", "court": "1", "alteration": "#" },
-  "mib1": { "couleur": [255, 238, 0], "capsule": "0", "court": "1", "alteration" : "b"},
-  "fad1": { "couleur": [81, 255, 0], "capsule": "0", "court": "1", "alteration": "#" },
-  "sold1": { "couleur": [0, 118, 88], "capsule": "0", "court": "1", "alteration": "#" },
-  "sib1": { "couleur": [221, 0, 115], "capsule": "0", "court": "1", "alteration" : "b"  }
+  "dod1": { "couleur": [255, 0, 0], "capsule": "1", "court": "1", "alteration": "#" },
+  "mib1": { "couleur": [255, 238, 0], "capsule": "1", "court": "1", "alteration" : "b"},
+  "fad1": { "couleur": [81, 255, 0], "capsule": "1", "court": "1", "alteration": "#" },
+  "sold1": { "couleur": [0, 118, 88], "capsule": "1", "court": "1", "alteration": "#" },
+  "sib1": { "couleur": [221, 0, 115], "capsule": "1", "court": "1", "alteration" : "b"  },
+  
+  "do2": { "couleur": [255, 0, 0], "capsule": "1", "court": "1" },
+  "re2": { "couleur": [255, 170, 20], "capsule": "0", "court": "1" },
+  "mi2": { "couleur": [255, 238, 0], "capsule": "0", "court": "1" },
+  "fa2": { "couleur": [81, 255, 0], "capsule": "0", "court": "1" },
+  "sol2": { "couleur": [0, 118, 88], "capsule": "0", "court": "1" },
+  "la2": { "couleur": [140, 0, 255], "capsule": "0", "court": "1" },
+  "si2": { "couleur": [221, 0, 115], "capsule": "0", "court": "1" },
+  "do3": { "couleur": [255, 0, 0], "capsule": "0", "court": "0" },
+  
+  "dod2": { "couleur": [255, 0, 0], "capsule": "0", "court": "1", "alteration": "#" },
+  "mib2": { "couleur": [255, 238, 0], "capsule": "0", "court": "1", "alteration" : "b"},
+  "fad2": { "couleur": [81, 255, 0], "capsule": "0", "court": "1", "alteration": "#" },
+  "sold2": { "couleur": [0, 118, 88], "capsule": "0", "court": "1", "alteration": "#" },
+  "sib2": { "couleur": [221, 0, 115], "capsule": "0", "court": "1", "alteration" : "b"  }
+
 }
diff --git a/elise.py b/elise.py
new file mode 100644
index 0000000000000000000000000000000000000000..79f6817dedafa7de9d1f7d66fe46ca6bb0d954e8
--- /dev/null
+++ b/elise.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python
+# coding: utf8
+
+import argparse
+from musique.basicsynth import BasicSequenceur
+from musique.exercice import GenerateurExercice
+from musique.gamme import GammeTemperee
+
+parser = argparse.ArgumentParser(description='Génère des documents à partir de la partition de "la lettre à Élise".')
+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()
+
+gamme = GammeTemperee(95)
+
+
+boomwhackers = ""
+if not args.boomwhackers is None:
+  boomwhackers = args.boomwhackers[0]
+
+
+elise =  [
+          [ [gamme.mi(3), gamme.doublecroche], 
+          [gamme.red(3), gamme.doublecroche],
+          [gamme.mi(3), gamme.doublecroche],
+          [gamme.red(3), gamme.doublecroche],
+          [gamme.mi(3), gamme.doublecroche],
+          [gamme.si(2), gamme.doublecroche],
+          [gamme.re(3), gamme.doublecroche],
+          [gamme.do(3), gamme.doublecroche],
+          [gamme.la(2), gamme.croche],
+          [gamme.silence(), gamme.croche],
+          [gamme.do(2), gamme.doublecroche],
+          [gamme.mi(2), gamme.doublecroche],
+          [gamme.la(2), gamme.doublecroche],
+          [gamme.si(2), gamme.croche],
+          [gamme.silence(), gamme.doublecroche],
+          [gamme.mi(2), gamme.doublecroche],
+          [gamme.sold(2), gamme.doublecroche],
+          [gamme.si(2), gamme.doublecroche],
+          [gamme.do(3), gamme.croche],
+          [gamme.silence(), gamme.doublecroche],
+          [gamme.mi(2), gamme.doublecroche],
+          [gamme.mi(3), gamme.doublecroche],
+          [gamme.red(3), gamme.doublecroche],
+          [gamme.mi(3), gamme.doublecroche],
+          [gamme.red(3), gamme.doublecroche],
+          [gamme.mi(3), gamme.doublecroche],
+          [gamme.si(2), gamme.doublecroche],
+          [gamme.re(3), gamme.doublecroche],
+          [gamme.do(3), gamme.doublecroche],
+          [gamme.la(2), gamme.croche],
+          [gamme.silence(), gamme.doublecroche],          
+          [gamme.do(2), gamme.doublecroche],
+          [gamme.mi(2), gamme.doublecroche],
+          [gamme.la(2), gamme.doublecroche],
+          [gamme.si(2), gamme.croche],
+          [gamme.silence(), gamme.doublecroche],          
+          [gamme.mi(2), gamme.doublecroche],
+          [gamme.do(3), gamme.doublecroche],
+          [gamme.si(2), gamme.doublecroche],
+          [gamme.la(2), gamme.croche]
+          ]]
+
+if args.exerciceSpectrogramme or args.transparent or args.correction:
+  g = GenerateurExercice(gamme.bpm)
+  g.setBoomwhackers(boomwhackers)
+  g.setLongueurPartitionColoree(3)
+  g.setLongueurPartitionMusicale(5)
+  if args.primaire:
+    g.setTableauSimplifie(True)
+  if args.exerciceSpectrogramme:
+    g.genererExerciceSpectrogramme(elise, args.exerciceSpectrogramme[0], "thème 6")
+  if args.transparent:
+    g.genererTransparentSpectrogramme(elise, args.transparent[0], "thème 6", "La lettre à Élise")
+  if args.correction:
+    g.genererCorrectionSpectrogramme(elise, args.correction[0], "thème 6", "La lettre à Élise")
+else:
+  print "Génération de la version \"piano\""
+  s = BasicSequenceur(1, gamme.bpm, 3)
+  s.genererMelodie(elise, "sons/elise.wav")
diff --git a/musique/exercice.py b/musique/exercice.py
index 1f52c082fefc036fdd9d36fed90870fb97210332..73303f12ca9dffd8e4233f06269b4e2723ac1145 100644
--- a/musique/exercice.py
+++ b/musique/exercice.py
@@ -294,7 +294,7 @@ class GenerateurExercice(GammeTemperee):
     # les boomwhackers, ou une valeur supérieure à 100 si la note 
     # n'est pas disponible
     def getTranslationOctaveBoomwhackers(self, minNote):
-      octaveCible = min([ n[0] for n in self.boomwhackers if n[1] == minNote[1] ] + [10000])
+      octaveCible = min([ n[0] for n in self.boomwhackers if n[1] == minNote[1]] + [10000])
       return octaveCible - minNote[0]
     
     def shiftNote(self, note, shiftOctave):
@@ -319,7 +319,15 @@ class GenerateurExercice(GammeTemperee):
       
       for n in notes:
         if not self.estJouable(n, self.shiftOctave):
+          print n, "n'est pas jouable"
           return False
+      # we try with a smaller shift
+      self.shiftOctave += 1
+      for n in notes:
+        if not self.estJouable(n, self.shiftOctave):
+          self.shiftOctave -= 1
+          break
+
       
       return True
     
@@ -380,6 +388,7 @@ class GenerateurExercice(GammeTemperee):
         nid = self.shiftNote(self.getOctaveEtIDNote(n), self.shiftOctave)
         mw = self.boomwhackers[nid]
         result += self.pointColore(mw, 0, 0, radius)
+
         result += "\\end{tikzpicture}"
       result += "\\\\ \n"
       if not beamer:
@@ -416,9 +425,15 @@ class GenerateurExercice(GammeTemperee):
       else:
         stepx = 2
         stepy = 2.5
-
+        
       radius = stepx * 0.22
       
+      # if the notes are all short, we increase space between circles
+      maxSpace = max(self.dureeEnNoires(note[1]) for note in partitions[0])
+      if maxSpace < self.noire:
+        stepx *= 2
+      print stepx
+      
       finDeLigne = self.longueurPartitionColoree * stepx
       
       nbl = 1
diff --git a/tabac2.py b/tabac2.py
index 0aef532e71fa6b3ea15513382997dfab16608d9c..eb8bf541afedbd9f02919fb5300ffd89e24fd7f1 100644
--- a/tabac2.py
+++ b/tabac2.py
@@ -58,7 +58,7 @@ tabac = [ [ [gamme.do(3), gamme.croche],
 if args.exerciceSpectrogramme or args.transparent or args.correction:
   g = GenerateurExercice(gamme.bpm)
   g.setBoomwhackers(boomwhackers)
-  g.setLongueurPartitionColoree(6)
+  g.setLongueurPartitionColoree(8)
   g.setLongueurPartitionMusicale(8)
   if args.primaire:
     g.setTableauSimplifie(True)