Skip to content
Snippets Groups Projects
Commit 9cbe3d98 authored by Jean-Marie  FAVREAU's avatar Jean-Marie FAVREAU
Browse files

Mise à jour

parent 040e2d18
Branches
No related tags found
No related merge requests found
......@@ -694,7 +694,7 @@ elise = [
]
if args.exerciceSpectrogramme:
g = GenerateurExercice(gamme.bpm, 0.7)
g = GenerateurExercice(gamme.bpm)
g.genererExerciceSpectrogramme(elise, "exercices/ex-spec-elise.tex", "La lettre à Élise")
else:
print "Génération de la version \"piano\""
......
Ce répertoire contient la liste des exercices générés
......@@ -44,7 +44,7 @@ flic = [ [ [gamme.fad(4), gamme.noire],
if args.exerciceSpectrogramme:
g = GenerateurExercice(gamme.bpm, 0.7)
g = GenerateurExercice(gamme.bpm)
g.genererExerciceSpectrogramme(flic, "exercices/ex-spec-flic.tex", "thème \"le flic de Beverly Hills\"")
else:
print "Génération de la version \"piano\""
......
......@@ -43,7 +43,7 @@ flic2 = [ [ [gamme.mi(4), gamme.croche],
] ]
if args.exerciceSpectrogramme:
g = GenerateurExercice(gamme.bpm, 0.2)
g = GenerateurExercice(gamme.bpm)
g.genererExerciceSpectrogramme(flic2, "exercices/ex-spec-flic2.tex", "thème \"le flic de Beverly Hills\"")
else:
print "Génération du son"
......
......@@ -43,7 +43,7 @@ happy = [ [ [gamme.do(2), gamme.crochepointee],
] ]
if args.exerciceSpectrogramme:
g = GenerateurExercice(gamme.bpm, 0.7)
g = GenerateurExercice(gamme.bpm)
g.genererExerciceSpectrogramme(happy, "exercices/ex-spec-happybirthday.tex", "thème joyeux anniversaire")
else:
print "Génération du son"
......
......@@ -63,7 +63,7 @@ lavieenrose = [ [ [gamme.do(2), gamme.noirepointee],
if args.exerciceSpectrogramme:
g = GenerateurExercice(gamme.bpm, 0.7)
g = GenerateurExercice(gamme.bpm)
g.genererExerciceSpectrogramme(lavieenrose, "exercices/ex-spec-lavieenrose.tex", "La vie en rose")
else:
print "Génération de la version \"piano\""
......
......@@ -11,11 +11,10 @@ class GenerateurExercice(GammeTemperee):
# constructeur par defaut de la classe.
# Paramètres:
# * bpm: nombre de battements par minute (= nombre de noires par minute)
# * dureeSon: duree d'un son (enveloppe complète).
def __init__(self, bpm = 120, dureeSon = 0.1):
# * dureeFrappe: duree de la frappe
def __init__(self, bpm = 120, dureeFrappe = 0.02):
GammeTemperee.__init__(self, bpm)
self.dureeSon = dureeSon
self.dureeFrappe = 0.2 * self. dureeSon # la durée de la frappe
self.dureeFrappe = dureeFrappe
self.margeDocument = 1.0
self.margeDuree = 0.1
self.margeFrequence = 100
......@@ -25,7 +24,6 @@ class GenerateurExercice(GammeTemperee):
# cas où elle est jouée au battement par minute courant
def calculeDureePartition(self, partition):
durees = [p[1] for p in partition]
durees[-1] = max(durees[-1], self.dureeSon)
return sum(durees)
......@@ -138,9 +136,9 @@ class GenerateurExercice(GammeTemperee):
# à l'horodatage donné
def accordSpectrogrammePartition(self, accord, horodatage, couleur):
if isinstance(accord[0], float):
return self.noteSpectrogrammePartition(accord[0], self.dureeSon, horodatage, couleur)
return self.noteSpectrogrammePartition(accord[0], accord[1], horodatage, couleur)
else:
return ''.join([self.noteSpectrogrammePartition(note, self.dureeSon, horodatage, couleur) for note in accord[0]])
return ''.join([self.noteSpectrogrammePartition(note, accord[1], horodatage, couleur) for note in accord[0]])
# dessine sur le spectrogramme les notes données en paramètre
def notesSpectrogrammePartition(self, partition, couleur):
......@@ -151,6 +149,25 @@ class GenerateurExercice(GammeTemperee):
horodatage += note[1]
return resultat
# cette classe dessine les gradations sur les axes des abscisses
def graduationAbscisses(self):
nbGraduations = self.duree
# TODO
return ""
def graduationOrdonnees(self, partitions):
frequences = self.notesDansIntervalle(self.minFrequence(partitions), self.maxFrequence(partitions))
result = ""
for frequence in frequences:
finc = self.frequenceEnCm(frequence)
result += "\draw[black] (-0.1, " + str(finc) + ") -- ";
result += "(0," + str(finc) + ")\n";
result += "(-0.1," + str(finc) + ") node[left]{" + str(frequence).replace(".", ",") + "};\n";
return result
# cette fonction écrit le spectrogramme simplifié correspondant à la
# partition donnée en paramètre
def spectrogramme(self, partitions):
......@@ -171,6 +188,10 @@ class GenerateurExercice(GammeTemperee):
result += "\draw[->, black] (0, " + str(self.frequenceEnCm(self.fmin)) + ") -- ";
result += "(0," + str(self.hauteur) + ") node[rotate=90, left, anchor=south]{fréquence};\n";
# gradations sur les axes
result += self.graduationAbscisses()
result += self.graduationOrdonnees(partitions)
couleur = { 0: "black", 1: "darkgray", 2: "gray"}
for i,p in enumerate(partitions):
result += self.notesSpectrogrammePartition(p, couleur.get(i, "lightgray"))
......
......@@ -8,52 +8,56 @@
class GammeTemperee:
def __init__(self, bpm = 120):
self.frequences = [4186.01, 4434.92, 4698.64, 4978.03, 5274.04, 5587.65, 5919.91, 6271.93, 6644.88, 7040.00, 7458.62, 7902.13]
self.setBPM(bpm)
# Definition de chacune des notes du clavier (leur frequence).
# Paramètre:
# * octave: l'octave où le son est joue. L'octave est comprise entre 0 et 7.
# Plus cette valeur est petite, plus le son est grave.
def do(self, octave=2):
return 4186.01 / (2 ** (7-octave))
return self.note(octave, 0)
def dod(self, octave=2):
return 4434.92 / (2 ** (7-octave))
return self.note(octave, 1)
def reb(self, octave=2):
return self.dod(octave)
def re(self, octave=2):
return 4698.64 / (2 ** (7-octave))
return self.note(octave, 2)
def red(self, octave=2):
return 4978.03 / (2 ** (7-octave))
return self.note(octave, 3)
def mib(self, octave=2):
return self.red(octave)
def mi(self, octave=2):
return 5274.04 / (2 ** (7-octave))
return self.note(octave, 4)
def fa(self, octave=2):
return 5587.65 / (2 ** (7-octave))
return self.note(octave, 5)
def fad(self, octave=2):
return 5919.91 / (2 ** (7-octave))
return self.note(octave, 6)
def solb(self, octave=2):
return self.fad(octave)
def sol(self, octave=2):
return 6271.93 / (2 ** (7-octave))
return self.note(octave, 7)
def sold(self, octave=2):
return 6644.88 / (2 ** (7-octave))
return self.note(octave, 8)
def lab(self, octave=2):
return self.sold(octave)
def la(self, octave=2):
return 7040.00 / (2 ** (7-octave))
return self.note(octave, 9)
def lad(self, octave=2):
return 7458.62 / (2 ** (7-octave))
return self.note(octave, 10)
def sib(self, octave=2):
return self.lad(octave)
def si(self, octave=2):
return 7902.13 / (2 ** (7-octave))
return self.note(octave, 11)
def note(self, octave, idNote):
return self.frequences[idNote] / (2 ** (7 - octave))
# definition de la frequence du silence
def silence(self):
......@@ -71,6 +75,39 @@ class GammeTemperee:
def quartDeSoupir(self):
return [ self.silence(), self.doublecroche ]
# étant donnée une fréquence, retourne l'octave et l'identifiant
# de la note correspondante
def getOctaveEtIDNote(self, note):
for o in range(-2, 9):
if note < self.do(o + 1) and note >= self.do(o):
for i in range(len(self.frequences)):
if self.note(o, i) == note:
return (o, i)
print("erreur, note inconnue: " + str(note))
return (-1, -1)
# retourne la liste des notes dans l'intervalle donné
def notesDansIntervalle(self, noteMin, noteMax):
if noteMin > noteMax:
return self.notesDansIntervalle(noteMax, noteMin)
(octaveMin, idNoteMin) = self.getOctaveEtIDNote(noteMin)
(octaveMax, idNoteMax) = self.getOctaveEtIDNote(noteMax)
if octaveMin == octaveMax:
return [self.note(octaveMin, freq) for freq in range(idNoteMin, idNoteMax + 1)]
result = [self.note(octaveMin, freq) for freq in range(idNoteMin, len(self.frequences))]
for o in range(octaveMin + 1, octaveMax):
result += [self.note(o, freq) for freq in range(0, len(self.frequences))]
result += [self.note(octaveMax, freq) for freq in range(0, idNoteMax + 1)]
return result
def minFrequence(self, partitions):
return min([min([note[0] if isinstance(note[0], float) else min(note[0]) for note in partition]) for partition in partitions])
def maxFrequence(self, partitions):
return max([max([note[0] if isinstance(note[0], float) else max(note[0]) for note in partition]) for partition in partitions])
# Etant donne un nombre de battements par minute, cette fonction fixe la duree
# de chacune des notes, exprimée en secondes
# Paramètre:
......
......@@ -43,7 +43,7 @@ gamme.pause(),
] ]
if args.exerciceSpectrogramme:
g = GenerateurExercice(gamme.bpm, 0.7)
g = GenerateurExercice(gamme.bpm)
g.genererExerciceSpectrogramme(rainbow, "exercices/ex-spec-rainbow.tex", "Rainbow")
else:
print "Génération du son"
......
......@@ -46,7 +46,7 @@ stair = [ [
] ]
if args.exerciceSpectrogramme:
g = GenerateurExercice(gamme.bpm, 0.7)
g = GenerateurExercice(gamme.bpm)
g.genererExerciceSpectrogramme(stair, "exercices/ex-spec-stairway.tex", "Stairway")
else:
print "Génération du son"
......
......@@ -55,7 +55,7 @@ starwars = [
]]
if args.exerciceSpectrogramme:
g = GenerateurExercice(gamme.bpm, 0.7)
g = GenerateurExercice(gamme.bpm)
g.genererExerciceSpectrogramme(starwars, "exercices/ex-spec-starwars.tex", "thème StarWars")
else:
print "Génération de la version \"piano\""
......
......@@ -74,7 +74,7 @@ if args.full:
s.genererMelodie(tabac, "sons/tabac-frappe.wav")
if args.exerciceSpectrogramme:
g = GenerateurExercice(gamme.bpm, 0.7)
g = GenerateurExercice(gamme.bpm)
g.genererExerciceSpectrogramme(tabac, "exercices/ex-spec-tabac.tex", "j'ai du bon tabac")
else:
print "Génération de la version \"piano\""
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment