diff --git a/musique/exercice.py b/musique/exercice.py
index d10f6c30d313d38842026c9580d8d83d509f25fb..211833b168870ad2bdf4f357cf1f5f710b993168 100644
--- a/musique/exercice.py
+++ b/musique/exercice.py
@@ -179,16 +179,23 @@ class GenerateurExercice(GammeTemperee):
# retourne un tableau des durées des notes possibles dans la partition
- def tableauDurees(self, partitions):
+ def tableauDurees(self, partitions, beamer = False):
result = "\n"
- 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"
+
+ if not beamer:
+ 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)
- result += "\\begin{table}[H]\n\centering\n"
+
+
+ if beamer:
+ result += '\\resizebox{1\\textwidth}{!}{%\n'
+ else:
+ result += "\\begin{table}[H]\n\centering\n"
result += "\\begin{tabular}{|l" + "".join(["|c" for d in ds ]) + "|}\n"
result += "\\hline\n"
@@ -201,7 +208,7 @@ class GenerateurExercice(GammeTemperee):
result += "\\\\ \n"
result += "\\hline\n"
- if not self.tableauSimplifie:
+ if not self.tableauSimplifie and not beamer:
result += "\\textbf{Longueur} (cm) "
for duree in ds:
result += "& " + '{0:.2f}'.format(self.dureeEnCm(duree)).replace(".", ",")
@@ -222,8 +229,12 @@ class GenerateurExercice(GammeTemperee):
result += "\\end{tabular}\n"
- result += "\\caption{Table des durées}\n"
- result += "\\end{table}\n"
+ if beamer:
+ result += "}\n"
+ else:
+ result += "\\caption{Table des durées}\n"
+ result += "\\end{table}\n"
+
return result
@@ -233,6 +244,8 @@ class GenerateurExercice(GammeTemperee):
# on ne va utiliser que la première partition
partition = partitions[0]
+ self.setShiftOctave(partitions)
+
result = "\\renewcommand{\\arraystretch}{1.3}"
result += "\\begin{table}[H]\n\centering\n"
if len(partition) > 30:
@@ -248,7 +261,19 @@ class GenerateurExercice(GammeTemperee):
if isinstance(note[0], float):
if note[0] > 0:
result += self.frequenceToLaTeX(note[0],
- self.minOctave, self.maxOctave) + "& " + self.nomDuree(note[1]) + " & \\\\\n"
+ self.minOctave, self.maxOctave) + "& " + self.nomDuree(note[1]) + " & "
+
+ # ajout note graphique
+ result += "\\begin{tikzpicture}[]"
+ nid = self.shiftNote(self.getOctaveEtIDNote(note[0]), self.shiftOctave)
+ mw = self.boomwhackers[nid]
+ if len(partition) > 30:
+ result += self.pointColore(mw, 0, 0, 0.15)
+ else:
+ result += self.pointColore(mw, 0, 0, 0.2)
+ result += "\\end{tikzpicture}"
+
+ result += " \\\\\n"
result += "\\hline\n"
else:
result += " & " + self.nomDuree(note[1]) + " & \\\\\n"
@@ -272,14 +297,19 @@ class GenerateurExercice(GammeTemperee):
return result
- def tableauFrequences(self, partitions):
+ def tableauFrequences(self, partitions, beamer = False):
result = ""
notes = self.getOctaveEtIDNoteDansIntervalle(self.minFrequence(partitions), self.maxFrequence(partitions))
- result += "Fréquences de chacune des notes utilisées sur la partition (arrondies à l'entier le plus proche):"
- result += "\\begin{table}[H]\n\centering\n"
+ if not beamer:
+ result += "Fréquences de chacune des notes utilisées sur la partition (arrondies à l'entier le plus proche):"
+
+ if beamer:
+ result += "{\\footnotesize\n \\begin{center}\n"
+ else:
+ result += "\\begin{table}[H]\n\\centering\n"
result += "\\begin{tabular}{|c|c|}\n"
result += "\\hline\n"
result += "\\textbf{Fréquence} (Hz) & \\textbf{Note} \\\\ \n"
@@ -291,11 +321,15 @@ class GenerateurExercice(GammeTemperee):
result += "\\hline\n"
result += "\\end{tabular}\n"
- result += "\\caption{Table des fréquences de la gamme tempérée}\n"
- result += "\\end{table}\n"
+ if not beamer:
+ result += "\\caption{Table des fréquences de la gamme tempérée}\n"
+ result += "\\end{table}\n"
- if self.contientSilences(partitions):
+ if self.contientSilences(partitions) and not beamer:
result += "Attention, la partition peut également contenir des silences, dont on peut mesurer la longueur, comme les notes"
+
+ if beamer:
+ result += "\\end{center}}\n"
return result
# retourne la translation d'octave nécessaire pour jouer avec
@@ -311,15 +345,11 @@ class GenerateurExercice(GammeTemperee):
nN = self.shiftNote(note, shiftOctave)
return nN in self.boomwhackers
- def estDessinable(self, partitions):
- if len(partitions) != 1:
- print "La partition contient plusieurs mains."
- return False
-
+ def setShiftOctave(self, partitions):
notes = [ self.getOctaveEtIDNote(p) for p in self.notesDansPartition(partitions) ]
minNote = min(notes)
-
+
self.shiftOctave = self.getTranslationOctaveBoomwhackers(minNote)
if self.shiftOctave > 100:
@@ -335,10 +365,18 @@ class GenerateurExercice(GammeTemperee):
if not self.estJouable(n, self.shiftOctave):
self.shiftOctave -= 1
break
-
-
return True
+
+ def estDessinable(self, partitions):
+ if len(partitions) != 1:
+ print "La partition contient plusieurs mains."
+ return False
+
+ return self.setShiftOctave(partitions)
+
+
+
def couleurBoomwhackerToTikz(self, mw):
return "\\definecolor{tempcolor}{rgb}{ "+ \
str(mw["couleur"][0] / 255.) + ", " + \
@@ -372,50 +410,52 @@ class GenerateurExercice(GammeTemperee):
notesTotales = sorted(list(set(frequences)))
- result += "\\begin{table}[H]\n\centering\n"
+ result += "\\begin{table}[H]\centering\n"
if len(notesTotales) > 12:
n = [ notesTotales[:12], notesTotales[12:] ]
+ else:
+ n = [notesTotales]
- for notes in n:
- result += '\\resizebox{1\\textwidth}{!}{%\n'
- if not beamer:
- result += "\\begin{tabular}{|r|" + "".join(["c|"] * len(notes)) + "}\n"
- else:
- result += "\\begin{tabular}{r|" + "".join(["c"] * len(notes)) + "}\n"
- if not beamer:
- result += "\\hline\n"
-
- result += "Notes"
- for n in notes:
- result += "&"
- if beamer:
- result += "\\hspace*{.2cm}"
- result += self.frequenceToLaTeX(n, self.minOctave, self.maxOctave)
- if beamer:
- result += "\\hspace*{.2cm}"
- result += "\\\\ \n"
- result += "Forme"
+ for notes in n:
+ result += '\\resizebox{1\\textwidth}{!}{%\n'
+ if not beamer:
+ result += "\\begin{tabular}{|r|" + "".join(["c|"] * len(notes)) + "}\n"
+ else:
+ result += "\\begin{tabular}{r|" + "".join(["c"] * len(notes)) + "}\n"
+ if not beamer:
+ result += "\\hline\n"
+
+ result += "Notes"
+ for n in notes:
+ result += "&"
+ if beamer:
+ result += "\\hspace*{.2cm}"
+ result += self.frequenceToLaTeX(n, self.minOctave, self.maxOctave)
+ if beamer:
+ result += "\\hspace*{.2cm}"
+ result += "\\\\ \n"
+ result += "Forme"
+ for n in notes:
+ result += "&"
+ result += "\\begin{tikzpicture}[]"
+ 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:
+ result += "Prénom"
for n in notes:
result += "&"
- result += "\\begin{tikzpicture}[]"
- nid = self.shiftNote(self.getOctaveEtIDNote(n), self.shiftOctave)
- mw = self.boomwhackers[nid]
- result += self.pointColore(mw, 0, 0, radius)
-
- result += "\\end{tikzpicture}"
+ result += "\\hspace*{2cm}"
result += "\\\\ \n"
- if not beamer:
- result += "Prénom"
- for n in notes:
- result += "&"
- result += "\\hspace*{2cm}"
- result += "\\\\ \n"
- if not beamer:
- result += "\\hline\n"
- result += "\\end{tabular}\n"
- result += "}\n"
- result += " \\newline \n \\ \n"
+ if not beamer:
+ result += "\\hline\n"
+ result += "\\end{tabular}\n"
+ result += "}\n"
+ #result += " \\newline \n"
result += "\\caption{Représentation colorée des notes}\n"
result += "\\end{table}\n"
@@ -428,7 +468,7 @@ class GenerateurExercice(GammeTemperee):
if beamer:
result += "\\frame{"
- result += "\\frametitle{Représentation graphique}"
+ result += "\\frametitle{Représentation graphique}\n"
frequences = self.notesDansPartition(partitions)
@@ -458,9 +498,9 @@ class GenerateurExercice(GammeTemperee):
if beamer:
result += self.ensembleDesNotesGraphiques(frequences, radius, beamer)
- result += "}"
- result += "\\frame{"
- result += "\\frametitle{Représentation graphique}"
+ result += "}\n"
+ result += "\\frame{\n"
+ result += "\\frametitle{Représentation graphique}\n"
result += self.ensembleDesNotesGraphiques(frequences, radius, beamer)
@@ -497,7 +537,7 @@ class GenerateurExercice(GammeTemperee):
result += "Cette partition n'est pas représentable sous forme de partition pour boomwhackers diatoniques."
if beamer:
- result += "}"
+ result += "}\n"
return result
def partitionMusicale(self, partitions, beamer = False):
@@ -539,7 +579,7 @@ class GenerateurExercice(GammeTemperee):
if note[0] != 0:
result += self.dureeToMusicTex(note[1]) + "{"
result += self.frequenceToMusicTeX(note[0], midOctave)
- result += "}"
+ result += "}\n"
longueurCourante += note[1]
else:
# TODO
@@ -561,7 +601,7 @@ class GenerateurExercice(GammeTemperee):
result += "Le générateur d'exercice ne prend pas en charge cette partition."
if beamer:
- result += "}"
+ result += "}\n"
return result
@@ -783,7 +823,7 @@ class GenerateurExercice(GammeTemperee):
result += "\\end{tikzpicture}"
if beamer:
- result += "}"
+ result += "}\n"
return result
@@ -853,15 +893,24 @@ class GenerateurExercice(GammeTemperee):
l_fichier.write(self.spectrogramme(partitions, True))
+ l_fichier.write("\\frame{\n")
+ l_fichier.write("\\frametitle{Durées et notes}\n")
+ # on écrit le tableau de durées
+ l_fichier.write(self.tableauDurees(partitions, True))
+ # on écrit le tableau des fréquences
+ l_fichier.write(self.tableauFrequences(partitions, True))
+ l_fichier.write("}\n")
+
+
l_fichier.write(self.partitionGraphique(partitions, True))
l_fichier.write(self.partitionMusicale(partitions, True))
if nomSolution != "":
- result = "\\frame{"
+ result = "\\frame{\n"
result += "\\frametitle{Solution}\n"
result += "\\begin{center}\Large Cette mélodie s'appelle " + nomSolution + "\\end{center}"
- result += "}"
+ result += "}\n"
l_fichier.write(result)