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)