Programmation Python et musique MIDI
Dans cette session, nous verrons un aperçu de concepts de programmation à l’aide du langage Python, utilisé notamment pour l’automatisation de tâches. Nous prendrons pour exemple une bibliothèque de manipulation de musique au format MIDI afin d’étudier et de modifier de petits programmes interactifs utilisant un clavier de piano, des fichiers musicaux et la sortie audio.
Objectifs pédagogiques
- Clavier virtuel, connection MIDI, synthétiseur.
- Éditeur de partition musicale.
- Bases du langage Python
- Variables, fonctions, boucles, interfaces entrée/sortie.
- Structure de graphe.
- Bibliothèque python-mito.
Déroulement possible de la session
- Introduction.
- Ouvrez un terminal, cloner ce dépôt (si ce n’est pas déjà fait) et déplacer vous dans le dossier
python-midi
:git clone https://github.com/AECS-17/AECS-informatique.git cd AECS-informatique/python-midi ls
- Mettre en place des connections MIDI (clavier virtuel/physique, qjackctl, qsynth) et vérifier que l’on peut jouer au clavier.
- Étudier et exécuter ports.py: Afficher les ports MIDI disponibles et comparer avec qjackctl.
- Étudier et exécuter listen.py. Connecter une entrée MIDI et vérifier les messages reçus. Modifier le programme pour afficher séparément valeurs de
message.note
,message.velocity
,message.time
etmessage.type
. - Étudier et exécuter play.py. Connecter une sortie MIDI pour jouer les notes entrées par l’utilisateur.
- Utilisez MuseScore pour créer un fichier MIDI (e.g. à partir de
A-E-C-Si.musicxml
). - Étudier et exécuter read-and-play.py. Faire en sorte qu’il lise et joue la musique.
- Selon le temps disponible, écrire ses propres mini-programmes intéragissant entre l’entrée au clavier MIDI, les fichiers MIDI ou la sortie audio (voir quelques idées dans la section suivante).
Idées de mini-programmes
-
Modifier
listen.py
pour écrire le mini-jeu suivant : à l’aide de random.randint une note est tirée au sort et on quitte la boucle lorsque le joueur rentre la bonne note. A chaque message, le programme peut indiquer “plus aïgue/grave” ou si le joueur “chauffe/refroidit”. On peut aussi compter le temps écoulé (à l’aide de time.time) ou le nombre de tentatives pour trouver la bonne note. -
Modifier
play.py
pour jouer une mélodie aléatoire avec un nombre de note, des durées et des hauteurs variables. Indication : La fonction random.choice permet de tirer au sort un élément d’une liste. -
Modifier
read_and_play.py
pour transposer une musique MIDI en augmentant ou diminuant par une constante les notes lues à partir du fichier. Indication : Utiliserhasattr(message, "note")
pour vérifier si un message contient une note à transposer. -
Modifier
listen.py
pour afficher le nom de la note jouée (do, do#, ré, …) et l’octave correspondante (1, 2, 3, 4, …). Comparer avec VMPK (menu affichage, noms des notes). Indication : Les variablesmidi_middle_C
etnote_names
deread_and_play.py
peuvent être utiles, ainsi que les opérateurs%
et//
(reste et quotient de division euclidienne). -
Modifier
play.py
pour jouer des accords. Par exemple, le programme interprète C comme l’accord de trois note “do, mi, sol” (DO majeur). -
Modifier
read_and_play.py
pour compter chacune des notes (do, do#, ré, …). Implémenter une heuristique pour trouver la tonalité d’un morceau.
Installation
L’environnement suivant sera mis à disposition pour cette session:
- Un clavier MIDI
- Linux Mint >= 21
- Paquets
qjackctl alsaplayer-jack vmpk qsynth musescore3
. Accepter l’activation du temps réel (fichier/etc/security/limits.d/audio.conf
présent) et ajouter l’utilisateur au groupeaudio
). Dans VMPK, utiliser ALSA dans les paramètres MIDI de VMPK. Dans QSynth, utiliser alsa_seq en MIDI, jack en Audio et importer les banques de son. - Paquets
python3 python3-mido python3-rtmidi librtmidi4