Purr Data (Pd-l2ork) – Programmer un Lecteur-Enregistreur Live de fichiers MIDI

Après la présentation de Purr Data, nous allons construire une Lecteur-Enregistreur Live de fichiers MIDI qui pourra servir de base pour des projets plus ambitieux

Cet article est la suite de :

‘Purr Data’ = Environnement de programmation visuelle Pure Data Vanilla enrichi porté sur une interface graphique HTML5 (la dernière révision majeure du HTML) et fonctionnant au moins sous les systèmes d’exploitation libres GNU/Linux, et propriétaires macOS et Windows

Contenu de cet article :

  • Objets Purr Data nécessaires pour ce projet
  • Schéma du Lecteur-Enregistreur de Fichiers (LEF) MIDI v.1.0 (base)
  • Fonctionnement du LEF MIDI v.1.0 (base)
  • Schéma du LEF MIDI v.1.1 (améliorée)
  • Schéma du LEF MIDI v.1.2 (améliorée+)
  • Schéma du LEF MIDI v.2
  • Configuration Audio / MIDI des v.1 et v.2
  • Clavier virtuel MIDI-IN et/ou MIDI-OUT des v.1 et v.2
  • Baie de brassage Audio/MIDI des v.1 et v.2

♦ Objets Purr Data nécessaires

Pour ce projet (base), nous allons principalement nous servir de la douzaine d’objets suivants :

  • [seq] – Un lecteur et enregistreur simple de fichiers MIDI. L’entrée de [seq] de Cyclone (bibliothèque) accepte les fichiers Midi et les messages Midi en temps réel via [midiin]. Tous les morceaux d’un fichier Midi multi-piste sont fusionnés en un seul (format 0). [notein] peut être connecté via un objet [midiformat]. La sortie gauche envoie les données Midi à [midiout]. [noteout] peut être connecté via un objet [midiparse]. La sortie droite envoie un message ‘bang’ à la fin de la séquence, utile pour réaliser des boucles. [seq] a son propre éditeur de liste Midi.
  • [midiin] – Cet objet est toujours en mode OMNI ON (répond aux 16 canaux Midi en même temps) et génère le numéro de port à la place du canal (Linux uniquement).
  • [midiout] – Cet objet génère une sortie Midi brute, la deuxième sortie est le numéro de port (Linux uniquement).
  • [midiparse] – Cet objet désassemble les messages Midi.
  • [unpack] – Cet objet divise un message (pas que Midi) en atomes. [unpack] prend une liste et distribue les éléments à ses sorties.
  • [message] – Objet boîte de message cliquable, en cliquant dessus nous envoyons son contenu. Nous pouvons donc utiliser les boîtes de message comme des boutons-poussoirs avec envoie de messages uniques.
  • [number] – Cet objet est utilisé pour afficher et stocker des nombres qui peuvent être changés avec la souris et/ou le clavier. L’objet [number2] peut également enregistrer des nombres lorsque cette fonction est définie dans ses propriétés.
  • [spigot] – Cet objet transmet ou bloque des messages (pas que Midi). [spigot] transmet des messages de son entrée gauche à sa sortie, tant qu’un numéro différent de zéro est envoyé à son entrée droite. Lorsque son entrée droite atteint zéro, les messages entrants sont bloqués (c’est-à-dire ignorés). Associé aux objets [mod] et [div] il va nous servir de filtre pour les notes/octaves.
  • [Hslider] – Objet curseur horizontal avec interface utilisateur acceptant des valeurs sur son entrée, envoyant des valeurs sur sa sortie et pouvant être réglé manuellement.
  • [Hradio] – Objet rangée horizontale de boutons radio avec interface utilisateur  acceptant des valeurs sur son entrée, envoyant des valeurs sur sa sortie et pouvant être réglé manuellement.
  • Pour plus de détails sur ces objets comme tous les autres, consultez la documentation (+/- complète) intégrée à Purr Data (en anglais).

♦ Schéma du Lecteur-Enregistreur Live de Fichiers MIDI v.1.0 (base)

Le projet est organisé en 3 blocs principaux :
  • Le cœur avec les objets Midi [seq] + [midiin] + [midiout]
  • Les commandes du cœur avec les objets messages cliquables [read], [record], [stop record], [write] et [stop], [pause] et [continue]
  • L’affichage des notes et de certains de leurs paramètres avec les objets [midiparse], [unpack], [spigot], [Hslider] et [Hradio]

Le Lecteur-Enregistreur MIDI v.1.0 en action (3 slides)

Purr Data (Pd-l2ork v.2) : Lecteur-Enregistreur de Fichiers MIDI sous GNU/Linux (GIF animé)

Nous pouvons aussi utiliser d’autres techniques d’affichage des notes comme décrit dans mes précédents articles sur Pure Data Vanilla, ainsi que plus bas dans cet article avec VMPK (Virtual MIDI Piano Keyboard).

♦ Fonctionnement du Lecteur-Enregistreur Live de Fichiers MIDI v.1.0 (base)

JOUER des Fichiers MIDI depuis le disque du PC

Dans l’exemple ci-dessus, nous avons 3 fichiers MIDI (format 1) black-velvet.mid, europa_sax.mid et 2blues.mid (fichier de test Drums – canal 10) qui sont stockés dans le même dossier que le patch sequencer-test.pd.

Pour lire un de ces 3 fichiers Midi
  • Clic sur la boite message read nom-fichier.mid (black-velvet.mid, europa_sax.mid ou 2blues.mid)
    • Puis sur bang (JOUER)
    • En cours de lecture, clic sur stop, pause, continue pour effectuer les actions éponymes
  • Tant que stop n’est pas cliqué, la lecture du fichier Midi s’effectue en boucle (LOOP) et l’objet clignote à chaque relecture

Nous pouvons ajouter et/ou enlever des fichiers MIDI à lire en ajoutant et/ou enlevant des objets messages cliquables contenant l’action read (espace) nom-fichier.mid (fichiers Midi stockés dans le même dossier que le patch qui l’appelle).

ENREGISTRER des Fichiers MIDI sur le disque du PC

Dans l’exemple ci-dessus, nous avons un fichier MIDI test1.mid qui sera stocké dans le même dossier que le patch sequencer-test.pd.

Pour enregistrer puis lire un fichier Midi
  • Pour enregistrer un fichier Midi
    • Clic sur la boite message record
    • Quand la performance est terminée, clic sur stop record
    • Puis clic sur write test1.mid
  • Pour lire le fichier Midi que nous venons d’enregistrer
    • Clic sur read test1.mid
      • Puis sur bang (JOUER)
      • En cours de lecture, clic sur stop, pause, continue pour effectuer les actions éponymes
    • Tant que stop n’est pas cliqué, la lecture du fichier Midi s’effectue en boucle (LOOP) et l’objet clignote à chaque relecture

Nous pouvons ajouter et/ou enlever des fichiers MIDI à lire une fois enregistrés en ajoutant et/ou enlevant des objets messages cliquables (deux pour un même nom de fichier Midi) contenant l’action write (espace) nom-fichier.midread (espace) nom-fichier.mid (fichiers Midi stockés dans le même dossier que le patch qui l’appelle).

AFFICHAGE en temps réel d’INFORMATIONS utiles

Nous utilisons 4 objets pour afficher des informations utiles :
  • 2 Hradio pour les notes jouées avec un dédié au notes (filtrées avec l’objet [spigot] différent du canal 10) et un deuxième aux Drums (filtrés avec l’objet [spigot] égal au canal 10), et
  • 2 Hslider pour les canaux et les vélocités globales.

♦ Schéma du Lecteur-Enregistreur Live de Fichiers MIDI v.1.1 (améliorée)

La version 1.1 du projet est identique à celle de base mais avec une évolution majeure pour l’accès direct aux fichiers MIDI sur les disques durs et l’affichage de leurs noms, ainsi que quelques améliorations cosmétiques.

Le performeur peut maintenant accéder directement depuis le patch aux dossiers/fichiers sur ses disques durs aussi bien en lecture qu’en écriture au travers de l’interface graphique de son Gestionnaire de fichiers (ici Nemo sous Linux Mint). C’est nettement plus conviviale et pratique.

Le Lecteur-Enregistreur MIDI v.1.1 en action (8 slides)

Purr Data (Pd-l2ork v.2) : Lecteur-Enregistreur de Fichiers MIDI v.1.1 amélioré sous GNU/Linux (GIF animé)

Pour ce faire, nous utilisons les deux objets openpanel et savepanel avec un peu de glue autour.
– Lecture : Un clic sur bang (Ouvrir dossier ‘Utilisateur Linux’) va ouvrir la fenêtre du dossier Utilisateur Linux par défaut. Il ne reste plus qu’à naviguer graphiquement jusqu’au dossier/fichier Midi souhaité. Une fois le fichier sélectionné, nous validons avec le bouton Open du gestionnaire de fichier (GdeF). Le chemin complet du fichier va s’afficher dans l’objet symbol (Fichier en cours de lecture…). Puis pour lancer sa lecture, un clic sur l’objet bang (dans le canevas gris – à droite de => Clic = LIRE ->).
– Enregistrement : Un clic sur record, nous jouons notre performance, un clic sur stop record, un clic sur bang (Ouvrir dossier ‘Utilisateur Linux’) va ouvrir la fenêtre du dossier Utilisateur Linux par défaut. Il ne reste plus qu’à naviguer graphiquement jusqu’au dossier ou nous voulons enregistrer notre nouveau fichier Midi. Une fois choisi, nous entrons le nom-fichier.mid et validons avec le bouton Save du gestionnaire de fichiers (GdeF). Le chemin complet du nouveau fichier va s’afficher dans l’objet symbol (Fichier écrit sur le disque…).
Puis pour lancer sa lecture, nous procédons comme pour une Lecture classique ci-dessus : un clic sur l’objet bang (dans le canevas gris – à droite de => Clic = LIRE ->).

Que ce soit pour la Lecture ou l’Enregistrement, nous pouvons aussi définir un ou des dossiers spécifiques. Dans la version 1.1 ci-dessus, nous avons pour la Lecture : /home/joe/Musique/MIDI Songs et pour l’Enregistrement : /home/joe/Prd/patchs/mf.

♦ Schéma du Lecteur-Enregistreur Live de Fichiers MIDI v.1.2 (améliorée+)

La version 1.2 du projet est identique à la précédente v.1.1 ci-dessus mais avec :
– des ajustements sur les commandes du séquenceur par l’ajout de ‘start’ qui est paramétrable (à la place de ‘bang’) et de ‘append’ qui démarre-ajoute un nouvel enregistrement à la fin de la séquence déjà enregistrée, sans effacer la séquence existante,
– la suppression automatique des notes suspendues en fin de lecture du fichier MIDI en combinant le commande ‘stop’ avec l’objet [midiflush], et
– quelques évolutions cosmétiques.

Le Lecteur-Enregistreur MIDI v.1.2 en action (12 slides)

Purr Data (Pd-l2ork v.2) : Lecteur-Enregistreur de Fichiers MIDI v.1.2 améliorée+ sous GNU/Linux (GIF animé)

Pour mémoire, dans l’image ci-dessus (slide 1/12), les 13 ‘messages’ coloriés en jaune sont cliquables et génèrent une action Purr Data quand le patch est exécuté en Live, par exemple :
‘bang’ (en haut à gauche et à droite) = ouvre avec le Gestionnaire de fichiers le dossier par défaut de l’utilisateur sous GNU/Linux (ici /home/joe),
‘start’ = lance la lecture du fichier MIDI qui a été sélectionné à vitesse normale. Il est paramétrable avec ‘start 1024’ = vitesse de lecture normale – ‘start 2048’ = vitesse normale x2 et ‘start 512’ = vitesse normale /2, et
‘0’ (+/-_Ch1-16_Clavier-souris) = réglage de deux numéros de canal (ci-dessus identiques = 10) permettant d’afficher un canal unique (comme Drums) sur le Hradio jaune et les 15 autres canaux (Drums exclus) sur le Hradio violet, mais ils pourraient être différents en fonction de ce que nous voulons afficher.

Ces améliorations peuvent bien entendu être appliquées à la version 2 ci-dessous.

♦ Schéma du Lecteur-Enregistreur Live de Fichiers MIDI v.2

La version 2 du projet est identique à la version 1.0 (base) mis à part pour l’affichage des notes lues. Ici, nous utilisons des objets Hradio pour voir plus précisément la paire Nom (système anglais) et Numéro de l’octave des Notes MIDI lues, et nous pouvons changer à la volée en cours de lecture les canaux MIDI à afficher avec Régler_CH (de 1 à 16).

Le Lecteur-Enregistreur MIDI v.2 en action (4 slides)

Purr Data (Pd-l2ork v.2) : Lecteur-Enregistreur de Fichiers MIDI v.2 sous GNU/Linux (GIF animé)

Pour filtrer les notes/octaves par canal, nous utilisons les objets mod 12 (partie restante de la division pour les notes) + div 12 (partie entière de la division pour les octaves) + spigot avec contrôle d’égalité (ouvre la porte que pour un canal donné) et pour choisir le canal l’objet Number (valeur réglable avec la souris et/ou le clavier durant la lecture du fichier Midi).

♦ Configuration Audio / MIDI des v.1 et v.2

Nous utilisons QjackCtl (JACK Audio Connection Kit – Qt GUI Interface) avec JACK en arrière plan pour contrôler le serveur Audio prioritaire + faible latence -et- Qsynth (A Fluidsynth Qt GUI Interface) pour contrôler les SoundFonts SF2 installées, avec ici ‘Timbres Of Heaven GM_GS_XG_SFX V 3.4 Final.sf2’ en action, pour produire les sonorités synthétisées à partir des notes MIDI jouées.

Purr Data (Pd-l2ork v.2) : Lecteur-Enregistreur de Fichiers MIDI avec QjackCtl + Qsynth avec SoundFonts SF2 sous GNU/Linux

Pendant la lecture des fichiers MIDI, la fenêtre Canaux de Qsynth permet de changer à la volée les sonorités des instruments pour chacun des 16 canaux MIDI.

♦ Clavier virtuel MIDI-IN et/ou MIDI-OUT des v.1 et v.2

Pour visualiser (Midi-In) et/ou jouer (Midi-Out) les notes MIDI en temps réel, et plus, nous utilisons VMPK (Virtual MIDI Piano Keyboard), version 0.7 ou supérieure. Lors de la lecture d’un fichier par le Lecteur MIDI, les notes s’affichent sur le clavier avec un couleur différente pour chacun des 16 canaux MIDI.

Purr Data (Pd-l2ork v.2) : Lecteur-Enregistreur de Fichiers MIDI avec QjackCtl + Qsynth avec SoundFonts SF2 + VPMK sous GNU/Linux

Ci-dessus dans VMPK les Paramètres MIDI sont configurés comme suit :
  • Activer l’entrée MIDI : Oui
  • Mode MIDI Omni : Oui
  • Pilote MIDI-IN : Pure Data:1
  • Pilote MIDI-OUT : Pure Data:0

♦ Baie de brassage Audio/MIDI des v.1 et v.2

Nous pouvons utiliser la baie de brassage Audio / MIDI incorporée dans QjackCtl et/ou la dédiée de Patchage comme ci-dessous. Les deux baies permettent au performeur de changer graphiquement et à la volée les connexions compatibles entre les différentes entrés/sorties Audio et MIDI.
Pour ma part je préfère utiliser Patchage car elle offre dans une unique fenêtre une vue d’ensemble de toutes les connexions Audio et MIDI au contraire de QjackCtl.

Purr Data (Pd-l2ork v.2) : Patchage, la baie de brassage utilisée avec le Lecteur-Enregistreur de Fichiers MIDI sous GNU/Linux