AECS-informatique

Dépôt git pour les ateliers d’informatique à l’AECS

View project on GitHub

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.

Capture d’écran

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

  1. Introduction.
  2. 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
    
  3. Mettre en place des connections MIDI (clavier virtuel/physique, qjackctl, qsynth) et vérifier que l’on peut jouer au clavier.
  4. Étudier et exécuter ports.py: Afficher les ports MIDI disponibles et comparer avec qjackctl.
  5. É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 et message.type.
  6. Étudier et exécuter play.py. Connecter une sortie MIDI pour jouer les notes entrées par l’utilisateur.
  7. Utilisez MuseScore pour créer un fichier MIDI (e.g. à partir de A-E-C-Si.musicxml).
  8. Étudier et exécuter read-and-play.py. Faire en sorte qu’il lise et joue la musique.
  9. 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

  1. 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.

  2. 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.

  3. Modifier read_and_play.py pour transposer une musique MIDI en augmentant ou diminuant par une constante les notes lues à partir du fichier. Indication : Utiliser hasattr(message, "note") pour vérifier si un message contient une note à transposer.

  4. 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 variables midi_middle_C et note_names de read_and_play.py peuvent être utiles, ainsi que les opérateurs % et // (reste et quotient de division euclidienne).

  5. 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).

  6. 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 groupe audio). 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