Je suis tombé par hasard sur le logiciel SAPF (Sound As Pure Form), un système de programmation audio créé par James McCartney, le concepteur de SuperCollider. Il s'agit d'un logiciel qui s'inspire de la programmation fonctionnelle, ainsi que du langage Forth notamment, en utilisant notamment de la notation postfixe et une pile (stack).
(SAPF, version multi-plateforme)
J'ai un peu galéré à le faire fonctionner, car de base c'est un logiciel pour Mac OS, mais il existe une version adaptée pour Linux ainsi que Windows (lien plus haut). Ensuite, cela semble bloquer avec Jack, donc il faut le désactiver s'il est actif. Ensuite, il y a des fichiers et dossiers à prédéfinir pour les fichiers temporaires et autres, donc il vaut mieux les activer comme demandé.
Enfin, il faut démarrer sapf avec un fichier de "prélude", qui va définir un vocabulaire et ainsi des briques de base pour utiliser le langage.
sapf -p sapf-prelude.txt
Cela semble assez puissant et les exemples sont impressionnants, malheureusement il n'est pas aisé de les adapter pour des projets plus simple.
Dans un premier temps je pense donc plutôt me rabattre vers SuperCollider, il existe une base de données d'exemples plus importante :
Ou encore SonicPi, qui repose sur SuperCollider. J'ai testé un peu CSound, qui a l'avantage d'avoir une interface de test en ligne, mais le langage me semble moins parlant et plus compliqué.
https://fr.wikipedia.org/wiki/Sonic_Pi
SonicPi a l'air plus abordable tout en restant puissant.
Il existe aussi un bon tutoriel et des exemples, on peut créer des musiques et mélodies et non pas seulement des sons :
https://sonic-pi.net/tutorial.html
https://gist.github.com/darinwilson/137764d4b06072de626c
Enfin, on peut créer de nouveaux synthés pour SonicPi, mais à partir de SuperCollider :
https://gordonguthrie.github.io/TheManual/
https://github.com/sonic-pi-net/sonic-pi/blob/dev/SYNTH_DESIGN.md
Cela permettrait de créer des sons originaux et des textures pour mes musiques.
Un petit exemple de séquence avec SonicPi :
use_synth :saw in_thread do loop do play_pattern_timed scale(:D4, :minor), 0.50 end end in_thread do loop do play_pattern_timed scale(:F3, :major), 0.25 end end