Category Archives: Génération procédurale

Utiliser VMPK et Cardinal avec PIpeWire, Jack et les baies de brassage Helvum et Qpwgraph

Sommaire
VMPK, clavier de piano MIDI virtuel
Cardinal, fork de VCV Rack, synthétiseur modulaire Eurorack
PipeWire et les baies de brassage
Petit ensemble simple sous Cardinal

Arch Linux, ainsi que de nombreuses autres distributions Linux, ont définitivement basculé la pile audio sous PipeWire. Celui-ci à l’avantage de centraliser de façon simple Jack (temps réel pour l’audio de qualité studio, nécessite des réglages en fonction des besoins) et PulseAudio (plus simple, pour l’utilisation en informatique de bureau ou de jeu). PipeWire, permet aussi de synchroniser plusieurs sources et destinations video de différentes tailles et format, en même temps que le son. Les baies de brassage Helvum et Qpwgraph permettent d’établir simplement à la souris les connexions. QJackCtl ne semble plus fonctionner pour cette tâche.

VMPK, clavier de piano MIDI virtuel

VMPK (Virtual MIDI Piano Keyboard, signifiant clavier de piano MIDI virtuel) est un contrôleur MIDI logiciel, permettant d’utiliser le clavier de l’ordinateur, la souris ou autre dispositif de pointage (tablette, écran tactile) sur un clavier de piano logiciel, et d’envoyer des signals MIDI soit via l’interface MIDI du système, soit aux synthétiseurs logiciels General MIDI FluidSynth (paquet fluidsynth) ou SoniVoxEAS. Les distributions Linux contiennent des fontes sonores libres compatibles General MIDI, (sous Arch, paquet soundfont-fluid, complet, mais de qualité moyenne et freepats-general-midi, moins étendue en nombre d’instruments, mais de bien meilleure qualité). Si vous avez besoin de sélectionner leur emplacement, ces fontes sont placées dans le dossier /usr/share/soundfonts/ après installation. Le site de Freepats regroupe également des fontes spécialisées par instruments d’encore meilleures qualité, mais dont le poids des fichiers sont beaucoup plus grands.

réglage de la fonte midi ou de la sortie MIDI

Pour choisir le mode synthétiseur logiciel ou MIDI system, en suivant l’image ci-dessus :
* 1. Menu Éditer -> Paramètres MIDI
* 2. choisir dans le champs Pilote MIDI OUT, choisir soit Alsa pour le signal MIDI système, soit FluidSynth pour le synthétiseur MIDI logiciel permettant de produire directement les sons.
* 3. Dans le cas de FluidSynth, si c’est votre premier réglage, il faut cliquer sur le bouton [...]; à droite du bouton-menu ou vous avez sélectionné FluidSynth dans le champs Paramètres MIDI OUT.
La fenêtre Paramètres du pilote FluidSynth s’ouvre alors, il est possible dans le champs Pilote Audio de choisir Alsa, Jack, PulseAudio, SDL et d’autres.
# Dans le champs Soundfont, vous pouvez choisir la fonte sonore en ouvrant un sélecteur de fichier avec [...] ou de taper le chemin directement. Comme dis précédemment, les fontes sont placées par défaut dans le dossier /usr/share/soundfonts/.

Cardinal, fork de VCV Rack, synthétiseur modulaire Eurorack

Voici un aperçu des nombres plugins du synthétiseur modulaire Cardinal, il s’agit d’un fork, par le projet DISTRHO (dont le but est de regrouper les systèmes de plugins audio) de VCV Rack, intégrant de base tous les modules sous license libre en un seul paquet, et comme vous pouvez voir sur cette vidéo de la version d’avril 2022, ils sont nombreux :

VCV Rack est une version logicielle de synthétiseur modulaire au format standardisé ouvert de modules de synthétiseurs analogiques, Eurorack créé par l’allemand Dieter Döpfer1. Il est d’ailleurs possible d’interfacer, notamment via MIDI, des modules matériel de ce format. Les échanges s’y font principalement par un signal électrique analogique en utilisant des câbles avec connecteurs jack, mais les modules peuvent faire des traitements numériques ou utiliser des connexions numériques de type MIDI ou différents formats audio comme la connexion optique S/PDIF. Certains modules logiciels de VCV Rack sont d’ailleurs fait par des créateurs de modules matériels, à l’image des auteurs des excellents modules Mutable Instruments qui en ont porté certains sous le nom de Audible Instruments ou encore de Befaco. Ceux-ci comportement notamment de la synthèse granulaire et de la simulation numérique de sons. La version Cardinal supporte également différents formats de plugins audio LV2, VST, etc..

Je maintien les paquets Arch AUR de VCVRack-git en version 1.x qui ont l’avantage de pouvoir être utilisé avec ALSA directement (plus simple que Jack) et de comporter directement un module de saisie au clavier. Ce que ne propose pas encore Cardinal, mais cela devrait arriver ce mois-ci avec l’ajout des modules Fundamentals.

À ce propos, David Louapre, l’auteur de la chaîne Youtube de vulgarisation scientifique « Science étonnante » à fait une vidéo explicative des principes des synthétiseurs analogiques et modulaires intitulée « La Science des synthétiseurs ».

PipeWire et les baies de brassage

La baie de brassage Helvum permet de gérer de façon graphique et interactive, les connexions des différents éléments audio ou vidéo au sein de PipeWire, il est bien évidement également possible de les gérer par des programmes ou scripts directement dans PipeWire.

Helvum affiche les différents éléments sous forme de boîte et les liaisons via des courbes ou fils. D’après ce que j’en ai compris, les courbes en pointillées montrent les connexions automatiques de la partie PulseAudio, et les courbes pleine, montrent les connexions manuelles pour Jack.

Pour ajouter une connexion, il suffit de cliquer sur une boîte, puis de déplacer le petit icône de fichier affiché vers l’autre point de liaison. Voici comment faire dans le cas de VMPK avec Cardinal et de Cardinal avec la sortie audio :

Qpwgraph, à l’avantage de détecter d’avantages de choses. Il a notamment détecté VokoscreenNG que j’ai utilisé ici pour la capture vidéo du bureau. Mais ça n’est pas un problème, celui-ci ayant permis de sélectionner l’entrée audio sans doute via pulseaudio à utiliser. Il comporte également des annuler/refaire, et l’ouverture et sauvegarde de la configuration en fichier, ce qui peut rapidement devenir indispensable.

Voici donc les manipulations équivalentes sous Qpwgraph :

À noter que dans cet vidéo j’avai une sortie MIDI de VMPK, mais dans un autre cas, comme sur cette capture d’écran, je ne l’avais pas. VMPK étant connecté au bridge (passerelle) MIDI du port 0, il suffit alors de connecter la sortie de la passerelle MIDI du port 0 pour avoir le même résultat.

Utilisation du bridge MIDI du port 0 pour récupérer la sortie de VMPK

Petit ensemble simple sous Cardinal

Voici un exemple simple d’ensemble fonctionnant avec VMPK et cette configuration. Cela permet de comprendre le fonctionnement de base de Cardinal/VCV Rack.

Les sorties de contrôle MIDI sont récupérées vers les entrées de contrôle du rack « Modal Synthesizer » d’Audible Instrument dont j’aime bien la sonorité, proche de carillons :
* La sortie V/Oct (volt/octave) vers l’entrée V/Oct. Elle donne la hauteur de la note en fonction de la tension électrique (ici virtuelle).
* La sortie Gate (porte) vers l’entrée Gate. Elle transmet le moment où une touche est pressée (signal 0 relâchée ou 1 pressée). Il est intéressant de noter dans ce montage que lorsque la touche suivante est pressée avant que la touche précédente ne soit relâché on a un glissendo, plutôt qu’une nouvelle percussion de la note avec attaque initiale.
* La sortie velocity (vélocité) permet de donner de l’expression au son en variant l’attaque, sur un clavier texte AZERTY d’ordinateur, il n’y a pas ce genre de paramètres, mais il est possible de le lier à l’entrée strength (force), du module, et de lui transmettre ainsi l’expression du touché.

Pour la sortie du module d’Audible Instrument, c’est simple, la sortie gauche (L comme left) vers le port de sortie audio 1 et la sortie droite (R comme right) sur le port audio 2, comme nous avions définit dans la baie de brassage. Il ne reste plus qu’à presser les touches du clavier virtuel pour entendre les notes et tourner les molettes pour modifier les effets.

Comme on peut le voir sur cette vidéo, la saisie directe du clavier comme le permettent les modules Fundamentals ou un veritable instrument midi sont tout de même plus pratique pour ne pas avoir à passer sans arrêt de l’un à l’autre. Mais cela permet déjà de faire des enregistrement ou contrôle simple. Différents outil comme Qjackctl permettent d’enregistrer une séquence MIDI puis de la retransmettre. Il est aussi possible de passer un morceau midi en fichier .MID dans la passerelle MIDI et de lui ajouter des effets avec Cardinal et/ou des nombreux modules au format LV2 ou VST.

Principe de synthétiseur analogique modulaire

Les synthétiseurs analogiques modulaires suivent le principe similaire à UNIX, du KISS (keep It Simple and Stupid), garder les choses simples et stupides. Les modules sont très simples, et la force du système réside dans la possibilité d’échanger entre ces différents éléments. Les échanges se font principalement via des câbles électrique via un courant qui peut varier en tension (en Volt) de façon analogique (continue), plutôt que numérique (discrète). Il est tout de même possible de transmettre un signal numérique (1 ou 0) et c’est ce que fait la fonction gate (porte).

Les différents modules de base sont généralement (je donne les termes anglais et leurs abréviations utilisée, ainsi que la traduction du terme en français entre parenthèses :
* VCO Voltage Controled Oscillator (oscillateur commandé en tension), Il s’agit d’un générateur de signal, généralement sinusoïdal, comme le faisait le premier synthétiseur, le Thérémine, du nom de son inventeur, le Russe Lev Sergueïevitch Termen. Certains plus avancés permettent de fournir des singaux carrés, en dent de scie, différentes couleurs de bruits (blanc, rose, etc).
* VCF Voltage Controled Filter (filtre contrôlé en tension), permet de filtrer l’entrée en fonction de fréquences définies.
* VCA Voltage Controled Amplifier (Amplificateur commandé en tension). Permet d’amplifier le signal.
* ADSR Attack, Delay, Sustain, Release (généralement traduit par : Attaque, chute, entretien, extinction. Il s’agit des paramètres standard d’enveloppe sonore, dont les principes ont été crées par Vladimir Ussachevsky. Pour faire une analogie avec les instruments acoustiques, L’attaque (attack) correspond à la montée au moment où l’on actionne le sonophore de l’instrument. La corde frappée d’un piano ou pincée d’une guitare ou d’un clavecin. L’archet qui commence à frotter la corde, La percussion sur la peau d’un tambour, la première impulsion de la vibration des lèvres d’un trompettiste. La chute (delay) est la durée de l’attaque, c’est à dire le délai de l’attaque initiale. l’entretien (sustain) est la hauteur du palier de la vibration produisant le son continu. Enfin l’extinction (release) est la phase d’arrêt du son.
* LFO Low Frequency Oscillator (Oscillateur basse fréquence), il est utilisé principalement pour les modulation de l’instrument, comme un trémolo ou une trille par exemple.
* Arpeggiator (arpégiateur). Il est destiné à produire une succession de note. Un accord correspond à plusieurs notes produites simultanément, et un arpège est son équivalent avec cet ensemble de notes décalées dans le temps. Par exemple les notes do mi sol do jouées successivement correspondant à un accord de do majeur. Cela permet de produire simplement des éléments de base de mélodies.

Pour aller plus loin

La page PipeWire du wiki d’Arch.

Quelques essais avec le moteur de jeu LÖVE en Lua

* This post is also available in English.

Dessiné avec Pencil2D et MyPaint, animé en utilisant un maillage dans le moteur de jeu LÖVE (enlangage Lua), J’ai également fait quelques essais en C avec libSDL, mais cela ma paraît plus rapide de prototyper en Lua avec LÖVE, quitte à ajouter des bibliothèques en FFI pour les parties ayant besoin de beaucoup de calcul (dans cet exemple, les calculs sont légers et GL est utilisé pour le rendu), ou de le porter en C/SDL dans un second temps. Tous ces logiciels sont des logiciels libres, utilisés sur un système GNU/Linux.

Ce premier exemple utilise un simple maillage sur une image, et la déforme en utilisant des mouvement circulaires, comme je l’avais fait sur TIC-80 en juillet 2021.

Voici l’image utilisée comme texture du maillage, réalisé avec la branche MyPaint de Pencil2D et affiné avec MyPaint lui même :

Voici une version modifiée avec un crâne rigide, comme il est anthropomorphe. Je garde les 2 versions de l’algorithme le premier restant intéressant pour représenter de façon plus réaliste des invertébrés.

Cet autre test agglomère différentes tests d’ombrage (shaders). J’applique un seuil sur certains, au dessus de ce seuil une couleur apparaît et en dessous une autre couleur, sans ce seuil il y aurait des dégradés. Cela permet d’avoir des effets 2 couleur dans un style très épurés. J’ai mis le code source de ces ombrages pour LÖVE à disposition sur Framagit (Fichier demo01.love depuis ce site).
.

Cet autre test utilise un maillage sur une image en 2 étapes pour la texture. Ces images sont interchangées permettant l’animation de la bouche. Contrairement à la première animation, il ne s’agit pas d’une déformation utilisant des fonctions sin() de façon relativement homogène et indépendante sur la courbe. Le maillage est courbé en incrémentant l’angle à chaque étape de sa construction. Une petite onde sinusoïdale est ajoutée pour simulé un déglutition au travers du corps, à la façon de serpents qui avalent une grosse proie.

Le liquide que le monstre rejette est une autre texture. Celle ci est copiée sur un Canvas (toile) intermédiaire, afin de permettre une rotation cyclique le long de la texture (comme un scrolling sur un ruban), Cette partie ma été inspiré par les boss de fin de niveau du jeu « Conan Chop Chop ». Mais j’ai amélioré un peu le principe : Un Ombrage est alors ajouté sur le canvas au moment dfe l’afficher à l’écran, il zoom le jet sur sa longueur et ajoute un légère onde sinusoïdale. L’éclaboussure à la fin est la superposition de plusieurs fois la même animation en 3 étapes faite sous Pencil2D.

Voici le monstre dessiné rapidement avec seulement 2 étapes, pour la mise à l’épreuve du concept. Cela pourrait être optimisé sur disque en n’ayant que les 2 têtes dans le fichier et en les dupliquant dans la texture au chargement de l’image, LÖVE ne me semble pas aussi pratique que libSDL pour les maillages texturés :
bidule spritesheet

L’image utilisée comme texture pour la partie sur laquelle est appliquée l’ombrage :
flux de vomit intense

L’éclaboussure au bout du jet, chaque partie est affiché séquentiellement en boucle, et a été animé à l’aide de Pencil2D (branche MyPaint):
Éclaboussure de vomit

L’animation est d’abord réalisée avec Pencil2D, puis sauvegarde avec une image (PNG avec transparence) par image temporelle, puis à l’aide de la commande « montage » du paquet ImageMagick assemblé dans une feuille de sprite de la façon suivante:

montage sprite0001.png sprite0006.png sprite0010.png -tile 3x1 -geometry 64x128 spritesheet.png

Mise à jour du 19 mars :

En se basant sur les mêmes méthodes, j’ai amélioré le code pour gérer des animations dessinées à main levée, de manière un peu plus générique, comme texture d’un maillage. J’ai donc fait un croquis animé de l’ouverture d’une fleur pour tester ce principe.

Fleur qui s'ouvre

Elle comporte 8 images distinctes, l’ordonnancement des images, dont le temps d’apparition peut varier pour la dynmique est gérée via une table comportant le nombre d’image temporelle par image :

table = {1,1,2,2,2,3,3,4,4,4,5,5,6,6,7,8,8,8,8,8}

Je peux cycler facilement dans la table en utilisant une fonction du type math.floor( (time()*fps) % #table) ou juste lire la table pour une animation unique, pulmonique a une fleur qu’il s’ouvre ici.

Je l’ai donc utilisé comme élément décoratif. Maintenant que je vois que cela fonctionne, l’animation peut être affinée, et le code également pour être encore plus générique et avoir le besoin d’ajouter de moins en moins d’information pour ajouter rapidement de nouvelles animations.

Après être satisfait du premier jet de l’animation au sein du programme, j’ai un peu plus nettoyé, amélioré les couleurs, et me suis aperçu qu’il manquait une frame dans mon animation, la dernière était dupliquée de l’avant dernière. Dans tous les cas, il faut que je supprime l’espace inutile et que je sépare la queue de la fleur, la feuille de sprite en png fait 180~200 Ko (150 Ko recompressée avec zopflipng), c’est trop gros, multiplié par le nombre d’image et d’objets on peut rapidement se retrouver avec des dizaines de Mo de PNG sur disque et encore pire en RAM, de quoi exploser tous les caches. Je pense donc que je vais séparer la fleur de sa tige, et essayer de la cadrer plus précisément, un 64×64 devrait faire l’affaire.

Fleur qui s'ouvre améliorée

 »’Mise à jour mai 2022  »’
* Vous pouvez tester la dernière version et voir les sources à l’adresse https://framagit.org/popolon/reforest
* Les fichiers LÖVE de la dernières version, prêts à l’emploi, sont disponibles à l’adresse https://framagit.org/popolon/reforest/-/releases (Version 0.2 depuis ce site).

capture d'écran de Reforest 0.2