Skip to content
Snippets Groups Projects
Commit b683dbc0 authored by Jean-Marie Favreau's avatar Jean-Marie Favreau
Browse files

On sépare la gamme du synthétiseur

parent 5c44eb68
Branches
No related tags found
No related merge requests found
......@@ -459,74 +459,14 @@ class Partition:
return result
# La class BasicSequenceur decrit un sequenceur très simple,
# qui permet de jouer des notes à l'aide de leur notation à la française
# (do, re, mi, ...) et de leur duree (noire, blanche, etc.).
# Ce synthetiseur imite un instrument à touches (type piano), où chaque touche
# frappee produirait un son d'une duree fixe. Ce son peut être decrit par une
# enveloppe pour moduler son amplitude au fil du temps.
class BasicSequenceur:
nbOctet = 2 # taille d'un echantillon : 1 octet = 8 bits
fech = 44100 # frequence d'echantillonnage: nombre d'echantillon par seconde
maxVol = 2**15-1.0
# la classe GammeTemperee décrit les notes de la gamme dite tempérée. Il s'agit du système d'accord
# utilisé par les pianos, qui divise l'octave en intervalles chromatiques égaux.
# Cette classe décrit également les durées telles qu'elles sont notées sur les partitions (noires,
# blanches, etc), suivant un battement par minutes donné.
class GammeTemperee:
# constructeur par defaut de la classe.
# Paramètres:
# * nbCanaux: nombre de canaux (1: mono, 2: stereo, ...)
# * bpm: nombre de battements par minute (= nombre de noires par minute)
# * dureeSon: duree d'un son (enveloppe complète).
def __init__(self, nbCanaux = 1, bpm = 120, dureeSon = 0.1, nbHarmoniques = 0):
self.generateurDeNote = GenerateurDeNote(self.fech)
self.nbHarmoniques = nbHarmoniques
def __init__(self, bpm = 120):
self.setBPM(bpm)
self.setEnveloppeFrappeSimple(dureeSon)
self.setNbCanaux(nbCanaux)
# Permet d'ajuster l'enveloppe d'un son produit par le synthetiseur, sans aucune attaque, relâche...
# le son passe d'un volume nul à un volume maximal instantanément, et inversement à la fin.
# Paramètres:
# * dureeEnSeconde: duree du son produit par le synthetiseur lorsqu'une note est jouee
def setEnveloppeZeroUn(self, dureeEnSeconde):
self.dureeAttaqueEnveloppe = 0
self.enveloppe = Enveloppe.enveloppeZeroUn(dureeEnSeconde, self.fech)
# Permet d'ajuster l'enveloppe d'un son produit par le synthetiseur, sous forme d'une montée
# progressive, puis d'une descente: "/\"
# Paramètres:
# * dureeEnSeconde: duree du son produit par le synthetiseur lorsqu'une note est jouee
def setEnveloppeMonteeDescente(self, dureeEnSeconde):
self.dureeAttaqueEnveloppe = 0
self.enveloppe = Enveloppe.enveloppeMonteeDescente(dureeEnSeconde, self.fech)
# Permet d'ajuster l'enveloppe d'un son produit par le synthetiseur, en imitant un instrument
# percussif, comme celui d'un piano.
# Paramètres:
# * dureeEnSeconde: duree du son produit par le synthetiseur lorsqu'une note est jouee
# * dureeFrappe: duree de la frappe (première partie du son, correspondant dans l'enveloppe
# à l'attaque et au declin).
def setEnveloppeFrappeSimple(self, dureeEnSeconde, dureeFrappe = 0.02):
self.dureeAttaqueEnveloppe = dureeFrappe / 4
self.enveloppe = Enveloppe.enveloppeAvecFrappeSimple(dureeEnSeconde, dureeFrappe, self.fech)
# ajustement du volume du morceau
# Paramètre:
# * niveau: une valeur comprise entre 0 et 1 pour ajuster le volume du son le plus fort genere par
# le synthetiseur
def setVolume(self, niveau):
self.niveaux = [ niveau for x in range(0, self.nbCanal) ]
# Ajustement du nombre de canaux dans le son genere
# Paramètre:
# * nbCanaux: nombre de canaux (1: mono, 2: stereo, ...)
def setNbCanaux(self, nb):
self.nbCanal = nb
self.niveaux = [ 1. for x in range(0, nb) ]
# 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.
......@@ -574,7 +514,7 @@ class BasicSequenceur:
# definition de la frequence du silence
def silence(self):
def silence():
return 0.
# definition des pauses (un silence joue pendant une duree donnee)
......@@ -612,6 +552,75 @@ class BasicSequenceur:
self.rondepointee = self.ronde * 1.5
self.carreepointee = self.carree * 1.5
# La class BasicSequenceur decrit un sequenceur très simple, utilisant les notes
# de la gamme chromatique.
# Ce synthetiseur imite un instrument à touches (type piano), où chaque touche
# frappee produirait un son d'une duree fixe. Ce son peut être decrit par une
# enveloppe pour moduler son amplitude au fil du temps.
class BasicSequenceur(GammeTemperee):
nbOctet = 2 # taille d'un echantillon : 1 octet = 8 bits
fech = 44100 # frequence d'echantillonnage: nombre d'echantillon par seconde
maxVol = 2**15-1.0
# constructeur par defaut de la classe.
# Paramètres:
# * nbCanaux: nombre de canaux (1: mono, 2: stereo, ...)
# * bpm: nombre de battements par minute (= nombre de noires par minute)
# * dureeSon: duree d'un son (enveloppe complète).
def __init__(self, nbCanaux = 1, bpm = 120, dureeSon = 0.1, nbHarmoniques = 0):
GammeTemperee.__init__(self, bpm)
self.generateurDeNote = GenerateurDeNote(self.fech)
self.nbHarmoniques = nbHarmoniques
self.setEnveloppeFrappeSimple(dureeSon)
self.setNbCanaux(nbCanaux)
# Permet d'ajuster l'enveloppe d'un son produit par le synthetiseur, sans aucune attaque, relâche...
# le son passe d'un volume nul à un volume maximal instantanément, et inversement à la fin.
# Paramètres:
# * dureeEnSeconde: duree du son produit par le synthetiseur lorsqu'une note est jouee
def setEnveloppeZeroUn(self, dureeEnSeconde):
self.dureeAttaqueEnveloppe = 0
self.enveloppe = Enveloppe.enveloppeZeroUn(dureeEnSeconde, self.fech)
# Permet d'ajuster l'enveloppe d'un son produit par le synthetiseur, sous forme d'une montée
# progressive, puis d'une descente: "/\"
# Paramètres:
# * dureeEnSeconde: duree du son produit par le synthetiseur lorsqu'une note est jouee
def setEnveloppeMonteeDescente(self, dureeEnSeconde):
self.dureeAttaqueEnveloppe = 0
self.enveloppe = Enveloppe.enveloppeMonteeDescente(dureeEnSeconde, self.fech)
# Permet d'ajuster l'enveloppe d'un son produit par le synthetiseur, en imitant un instrument
# percussif, comme celui d'un piano.
# Paramètres:
# * dureeEnSeconde: duree du son produit par le synthetiseur lorsqu'une note est jouee
# * dureeFrappe: duree de la frappe (première partie du son, correspondant dans l'enveloppe
# à l'attaque et au declin).
def setEnveloppeFrappeSimple(self, dureeEnSeconde, dureeFrappe = 0.02):
self.dureeAttaqueEnveloppe = dureeFrappe / 4
self.enveloppe = Enveloppe.enveloppeAvecFrappeSimple(dureeEnSeconde, dureeFrappe, self.fech)
# ajustement du volume du morceau
# Paramètre:
# * niveau: une valeur comprise entre 0 et 1 pour ajuster le volume du son le plus fort genere par
# le synthetiseur
def setVolume(self, niveau):
self.niveaux = [ niveau for x in range(0, self.nbCanal) ]
# Ajustement du nombre de canaux dans le son genere
# Paramètre:
# * nbCanaux: nombre de canaux (1: mono, 2: stereo, ...)
def setNbCanaux(self, nb):
self.nbCanal = nb
self.niveaux = [ 1. for x in range(0, nb) ]
# Construit une nouvelle note, d'une frequence et d'une duree donnee, en utilisant l'enveloppe courante du synthetiseur
# Paramètres:
# * frequence: la frequence de la note à jouer
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment