Projets

Tutoriel – Création d’une pièce musicale générée en langage python

Créé par

Garo

Publié le

30 octobre 2017

Modifié le

30 octobre 2017

Audio Niveau intermédiaire Création individuelle

Dans ce deuxième tutoriel avec le logiciel e-pyo, il y a le nécessaire pour apprendre à programmer sa première pièce musicale. Bien évidemment, la pièce musicale sera générée de manière semi-aléatoire, c’est ce qui rend l’exercice intéressant !

La première bonne nouvelle est que nous pouvons générée une pièce avec seulement trois objets dans e-pyo :

  1. Une liste de note;
  2. Un sélecteur aléatoire et;
  3. Un générateur de signal.

La première étape est d’ouvrir le modèle Pyo : FileNew From Template – Pyo Template.

Rappel : il faut absolument écrire nos lignes de codes entre les lignes

s = Server(sr=44100, nchnls=2, buffersize=512, duplex=1).boot()

et

s.gui(locals())

Notre deuxième étape est d’écrire une liste de notes que nous souhaitons utiliser pour notre pièce. Dans e-pyo, les notes en questions sont des notes MIDI, soit un total de 127 notes possibles.

Un être humain normal n’a aucune idée de ce que la note MIDI 60 est. Pour nous aider, il existe différentes ressources en lignes qui offrent la conversion des notes MIDI en fréquence. Voici un site web que j’affectionne par sa simplicité : http://www.indiana.edu/~emusic/hertz.htm. En plus de mentionner la fréquence à laquelle la note est associée, le site précise la note (Do, Ré, Mi, Fa, Sol, La, Si).

Voici un tableau de conversion des notes anglais-français :

C

D

E

F

G

A

B

Do

Mi

Fa

Sol

La

Si

 

Dans ma liste de notes, je dois indiquer des valeurs situées entre 0 et 127.

**Question : Mais pourquoi, sur le site web, les notes commencent-elles à 12 ?

**Réponse : Parce que les premières notes contiennent des fréquences trop basses, théoriquement inaudibles à plusieurs oreilles humaines ! La tranche de fréquence audible par les humains se situe entre 20 Hz et 20 000 Hz.

Revenons-en à notre note MIDI 60 : elle représente donc la fréquence 261.6 Hz et il s’agit d’un Do. En sommes, un exemple d’une octave simple en notes MIDI irait comme suit : 60, 62, 64, 65, 67, 69, 71.

Nous avons donc notre liste de notes !

Maintenant que nous avons établi notre liste de notes, comment l’écrire dans notre éditeur de texte ?

Il faut appeler l’objet : midiToHz.

midiToHz ne contient aucun attribut, seulement une liste.

Notre première ligne de codes irait alors comme suit :

liste = midiToHz([60, 62, 64, 65, 67, 69, 71])

**En programmation, les crochets [ ] désignent la création d’une liste : que ce soit une suite de chiffres, de lettres, de mots. De plus, il faut séparer chaque donnée par une virgule.

 

Ensuite, il faut appeler notre deuxième objet : le sélecteur aléatoire.

Dans le tutoriel précédent, nous avons utilisé un autre objet aléatoire : Randi.

Bref rappel, Randi sélectionne de manières aléatoires différentes valeurs entre un minimum et un maximum à une vitesse de sélection variable. À l’écoute, l’objet Randi donne l’impression qu’une valeur « se promène » entre deux points donnés.

Dans notre contexte actuel, le sélecteur aléatoire désiré est l’objet Choice.

Les attributs sont les suivantes :

  • Choice : notre liste
  • Freq: la fréquence de changement de note
  • Mul : Amplitude, valeur par défaut = 1
  • Add : ne pas changer

Notre ligne de code s’écrirait ainsi :

rdmnotes = Choice(liste, freq = 1)

C’est-à-dire que chaque seconde, notre objet Choice choisira une nouvelle note de manière aléatoire à partir de notre liste.

Dernières étapes avant l’essai de notre programme : il nous faut un générateur de signal.

Dans e-pyo, nous avons le choix entre plusieurs générateurs de signal :

  • Générateurs de bruit blanc, rose et brun
  • Synthèse FM
  • Onde sinusoïdale, dent de scie, etc.
  • Et plus encore !

Personnellement, j’aime beaucoup le générateur d’onde en dent de scie. Dans e-pyo, il se nomme SuperSaw.

Voici les différents attributs de SuperSaw :

  • Freq : la fréquence de notre onde
  • Detune : si nous souhaitons ajouté une dissonance dans le son
  • Bal : Non défini
  • Mul : amplitude de l’onde
  • Add : ne pas changer

Notre ligne de code s’écrira ainsi :

synth = SuperSaw(rdmnotes).out()

**Pourquoi le .out() ?

**Réponse : l’extension .out() à la fin d’une ligne de code est l’indication au compilateur de fournir un résultat audible.

Il ne suffit que de compiler le programme avec l’aide des touches : Ctrl+R ou l’onglet ProcessRun. Finalement, appuyer sur la touche Start.

 

Voici un aperçu du code, tel qu’il a été écrit dans ce tutoriel :

 

#!/usr/bin/env python

# encoding: utf-8

from pyo import *

s = Server(sr=44100, nchnls=2, buffersize=512, duplex=1).boot()

liste = midiToHz([60, 62, 64, 65, 67, 69, 71])

rdmnotes = Choice(liste, freq = 1)

synth = SuperSaw(rdmnotes).out()

s.gui(locals())

 

Voilà ! Vous avez généré une première mélodie à l’aide du langage de programmation python.

Bien évidemment, le résultat est… Ordinaire.

 

Je vous encourage fortement à pousser plus loin dans votre programmation : ajouter d’autres ondes, ajouter des notes, changer d’octaves, ajouter des effets, etc. Les possibilités sont infinies.

 

Voici un exemple :

J’ai ajouté un générateur d’onde qui s’occupe de faire la basse, j’ai mis un filtre différent sur les deux générateurs et finalement, j’ai fait passer mes deux générateurs dans une légère réverbération.

 

Crédit image: Image: pixabay.com/en/retro-perspectiv…tron-synth-2426631/

BAnQBanque Nationaleprogrammationpyopythonsquaretutoriel

Inscription

Ce projet n'est inscrit à aucun concours pour le moment.

Commentaires

Laisser un commentaire

Tu dois être connecté pour laisser un commentaire.