diff --git a/boomwhackers-8.json b/boomwhackers-8.json index 475c8906c51b910c8d072862cbb0d7c7583bbe50..b3d54980d16e6cc59c52730dfe3e3fb148f0efe1 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 97c7f9b2a62b7aa5ca9d613047532d4b36f89c28..9ee27c92df50d0da04c1350993000f56d81487c3 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 3d6e6f8ad30ce1672bd198b29caae16c48c93ce9..0b9b15189bcbc35ecf6982f08c143f6642937170 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 47196036527de68e46fbfb16fd5f681efc00f8ba..255ccb0c9ce29cf7fb16afb99f87d53e7d85775b 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. »