Se lancer dans la composition algorithmique et l'aide à l'écriture avec Common Music
- 69 réponses
- 6 participants
- 5 319 vues
- 8 followers
amleth
En suite à ce thread : /environnement-de-developpement-audio/cycling-74/Max-MSP/forums/t.198444,travail-midi.html
Prérequis :
Common Music n'est rien de plus qu'une librairie de fonctions écrites en LISP. Ce n'est donc ni un logiciel, ni un plug-in. Pour se servir de ces fonctions, il faut s'y connaître un minimum en LISP. Mais il se trouve que ce langage de programmation, qui a désormais 50 ans, est très abstrait, très haut niveau, et enquiquine jamais ses utilisateurs avec des considérations informatiques ésotériques (comme la gestion de la mémoire...). C'est à mon sens un des langages les plus simples à maîtriser.
Pourquoi utiliser un langage de programmation et pas un outil graphique ?
Parce qu'ainsi, on bénéficie de toute la flexibilité de l'écriture pour définir, manipuler et modifier des structures musicales. Common Music permet donc de formaliser des idées musicales, de les développer, de les réutiliser d'un morceau à l'autre. C'est une sorte de "partition potentielle", pour reprendre un terme cher aux développeurs d'OpenMusic à l'IRCAM. Common Music, c'est la dimension abstraite de la musique : les structures, la notation, les algorithmiques, les "idées". Concrètement, ça génère des fichiers MIDI, qu'il faut ensuite exploiter dans un séquenceur avec des VSTi. Common Music ne produit donc que des notes, et pas des sons, d'où son rapprochement avec la notion de partition.
Comment commencer ?
La transcription hypertexte du livre de Taube est disponible ici : https://www.music.mcgill.ca/%7Eferguson/Notes%20from%20the%20Metalevel/nm/index.html.
Mais il faut également avoir un environnement LISP qui tourne. LISP est un très vieux langage qui possède une histoire très fournie. Plusieurs versions (on dit : "implémentations") de LISP on vu le jour en 50 ans. Aujourd'hui, je vous propose d'utiliser la version Allegro Common Lisp, de Franz Lisp.
Première chose : télécharger un environnement LISP. Je vous laisse aller là :
http://www.franz.com/downloads/allegrodownload.lhtml
Une fois installé, vous avez un environnement pour faire du LISP. Chouette. Mais comment ? LISP est avant tout un langage interprété : vous allez écrire des expressions dans la fenêtre de droite (dans des fichiers texte), puis les évaluer (grâce à Ctrl+E), et voir le résultat dans la fenêtre de gauche, dite fenêtre de debug.
Je ne vais pas faire ici un tuto pour le LISP, car Notes From The Metalevel propose d'apprendre le LISP en visant directement un usage compositionnel.
Seconde chose : il vous faut Common Music.
Alors... rendez-vous ici : http://commonmusic.sourceforge.net/doc/cm.html, téléchargez l'archive, et décompressez là qqpart. Vous avec un dossier "cm", qui contient le code source des fonctions.
Comment l'utiliser dans Allegro Express ? Fastoche ! Créez un nouveau fichier texte dans l'éditeur, et écrivez ces deux premières lignes :
(load "<chemin du dossier cm>/src/cm.lisp")
(in-package :cm)
Faites Ctrl+E sur chacune, et voilà que l'environnement se met à charger les fonctions...
And we're going to have this transitory cow fling thing right here in Cicely?
amleth
Chez moi, elle indique l'emplacement de Windows Media Player.
And we're going to have this transitory cow fling thing right here in Cicely?
deb76
Mais bon, ça fonctionne sur l'autre et c'est l'essentiel.
En même temps, j'ai résolu mon problème d'écriture des séquences générées par Open Music en midi. C'est tout bête en fait.
L'écriture des séquences se fait avec en .midi et non pas en .mid. Du coup, mce format n'était pas lu.
En plus, même en effectuant une sauvegarde en .mid directement à partir de la séquence comme c'est possible, le fichier n'était pas bon. J'ai donc mis en sortie de la séquence un module midifile et un second midi out en final. Et là, ô bohneur, je peux enregistrer mes séquences.
arkanovoid
amleth
Les options de sécurité windows sont assez aisées à intégralement désactiver...
Alors, maintenant, as-tu une idée sur ce que tu désires faire avec CM ? Nous allons pouvoir parler de choses plus fondamentales !
And we're going to have this transitory cow fling thing right here in Cicely?
deb76
désolé mais j'ai travaillé toute la journée au journal et je suis rentré tard. Déjà, sans que cela soit une prise de tête, j'aimerais bien générer des clouds, des évènements stochastiques, je pense notamment aux random walk, générer un accord avec des rangs différents d'harmoniques (avec des sauts, pas forcément régulier) et pouvoir décliner le contenu de l'accord généré en une lecture linéaire et non pas verticale.
Les multiplications d'accords me plaisent bien aussi, et puis bêtement générer un nombre X de notes de façon aléatoire tant au niveau de la hauteur, de la durée et du positionnement.
Ah, aussi jouer sur l'offset, contracter ou effectuer un processus d'expansion d'une série d'accords ou de notes. Je faisais ça avec Patchwork et cela donnait des résultats très intéressants.
Et puis, bien entendu, générer une série dodécaphonique, et appliquer toutes les mutations possibles. Est-il possible de faire une transcription du tableau de Boulez ?
De même sur une série, est-il possible de la gérer dans une optique sérielle pure et dure, appliquer à tous les paramètres (la hauteur bien entendu, mais aussi la durée, intensité, etc.) la méthode sérielle ?
Merci en tout cas pour ton écoute.
amleth
Je rentre d'un séminaire qui a duré toute la semaine. Je me repose un peu, et je me penche précisément sur ton mail.
Bien à toi,
Th.
And we're going to have this transitory cow fling thing right here in Cicely?
deb76
Citation : Je rentre d'un séminaire qui a duré toute la semaine. Je me repose un peu, et je me penche précisément sur ton mail.
Salut amleth,
Merci. Ca fait du bien de souffler un peu. Prends ton temps. A bientôt.
Bien à toi.
D.D.
amleth
J'ai juste fait un petit algo qui permet d'afficher le tableau de Boulez à partir de n'importe quelle série.
Pour tes autres questions, tout est possible, facilement même, on y reviendra...
(load "/home/amleth/Desktop/Moi/Composition/CM/src/cm.lisp")
(in-package :cm)
;; Boulez's row !
(setq br '(63 62 57 56 55 54 52 61 60 58 53 59))
;; Fonction auxiliaire de transposition d'une série selon un intervalle
(defun transpose-row (reihe intervall)
(loop for pc in reihe collect (mod (+ pc intervall) 12)))
;; Renvoie la série des indexes de chacune des composantes de "reihe" au sein de "grundgestalt"
(defun indexes-in-gg (grundgestalt reihe)
(let ((gg (rowmod12 grundgestalt))
(rr (rowmod12 reihe)))
(loop for x from 0 to (- (length grundgestalt) 1)
collect (position (list-ref rr x) gg))))
;; Renvoie une série "aplatie" entre 0 et 11
(defun rowmod12 (reihe)
(loop for x from 0 to (- (length reihe) 1)
collect (mod (list-ref reihe x) 12)))
;; Fonction principale
(defun make-boulez-chart (reihe)
(loop for r from 0 to (- (length reihe) 1)
collect (indexes-in-gg reihe (transpose-row reihe (- (first reihe) (list-ref reihe r))))))
;; Pour afficher le beau tableau...
(loop for x in (sort (make-boulez-chart br) #'< :key #'first)
do (print x))
Ah oui, et sinon, pour le générateur purement aléatoire, tu peux t'inspirer de ça, que je t'avais déjà donné :
(defun full-random (len)
(process for i below len
for dur = (ran :from 0.01 :below 0.1)
output
(new midi
:time (now)
:keynum (ran :from 0 :below 127)
:amplitude (ran :from 0.2 :below 1)
:duration dur)
wait dur))
(events (full-random 48) "thomas.mid" :versioning false :play true)
And we're going to have this transitory cow fling thing right here in Cicely?
deb76
J'ai essayé et c'est fascinant de découvrir le tableau. J'ai testé avec une autre série, avec des intervals différents et ça fonctionne.
Sinon, où puis-je trouver un manuel qui puisse m'expliquer pas à pas ce que tu me fais découvrir. J'ai regardé le dictionnaire de Common Music mais le nom des fonctions est différent (define au lieu de defun; différence aussi pour lancer une séquence. Donc, je ne peux pas m'y référer même si cela me permet de voir les possibilités offertes.
Donc où puis-je trouver les explications concernant ce que tu appelles la fonction auxiliaire de transposition d'une série selon un interval : (defun transpose-row (reihe intervall) - ce qui je suppose est l'interval de série ? Si j'ai bien compris, dans cette fonction, la série est transposée 12 fois avec une boucle (loop) ?
Bredf, j'ai un peu du mal avec la syntaxe, je n'arrive pas encore à faire la différence entre le commentaire et la fonction réelle. Surtout dans le cas du tableu de Boulez.
A ce sujet, le tableau donne la série transposée mais est-il possible avec CM de pouvoir à partir de la série de base, des transformations, traduire le résultat du tableau en notes midi ?
Sinon, pour le petit pattern pour obtenir des notes aléatoires, je me suis amusé à changer les valeurs des durées, de très courtes à très longues, ainsi que la hauteur des notes, dans un registre de 36 à 90 ainsi qu'une légère modification de l'amplitude, 0.4 au lieu de 0.2.
Celui-là, j'en maîtrise au moins le principe.
Dans le dictionnaire de CM j'ai trouvé ce pattern pour
un Random 12-tone generator:
(define (ran-row end)
(let ((rows (new transposer
:of (new cycle :of '(0 1 6 -5 10 11 5 16 15 21 26 20))
:on (new weighting :keynums '(c4 cs3 b3 fs4 fs3))))
(rhys (new weighting
:of `((t :min 4) (s :min 2)
(q :weight 3)
(te :min 3) (tq :min 3)
,(new cycle :of '(e. s))
(e :weight 2))))
(amps (new weighting :of '((mf :weight 7)
(mp :weight 3)
p))))
(process while (< (now #t) end)
for k = (next rows)
for r = (rhythm (next rhys) 70)
for a = (amplitude (next amps))
output (new midi :time (now)
:keynum k :amplitude a
:duration r)
wait r )))
(events (ran-row 30) "test.mid")
⇒ "test.mid"
Pourrais-tu me guider pas à pas pour l'adapter ?
En tout cas, merci encore pour cette découverte de CM.
amleth
Le problème quand on découvre le LISP, c'est en effet la syntaxe. Là encore je recommande chaudement la lecture des premiers chapitres de NFTML.https://www.music.mcgill.ca/%7Eferguson/Notes%20from%20the%20Metalevel/nm/00/contents.html
Je pense que le tuto accéléré que H. Taube y fait reste le meilleur moyen de s'y mettre _sérieusement_.
Juste un détail, que je croyais avoir déjà expliqué : LISP connaît plusieurs "dialectes". Common Lisp est celui que tu utilises au sein d'Allegro. Taube, quant-à-lui, utilise "Scheme". La principale différence réside dans l'emploi du mot-clef permettant de définir une fonction ou une variable. En scheme, "define" est employé dans les deux cas :
(define ma-variable 69)
(define (ma-fonction param1 param2)
...)
En Common Lisp, on écrira :
(setq ma-variable 69)
(defun ma-fonction (param1 param2)
...)
Tu noteras que la syntaxe change pour la définition d'une fonction. Pour une simple variable, dans un long post, j'avais expliqué le rôle de "setq", je t'y réfère donc.
Tu peux dès lors utiliser n'importe quel exemple tiré du dictionnaire CM ou de NFTML
L'avantage avec l'apprentissage de Common Lisp, c'est que c'est le langage dans lequel est codé OpenMusic. Tu pourras donc créer tes propres fonctions sur les deux systèmes... tu ne perds pas ton temps
Concernant mon code "Boulez-chart" : il est illisible et pas trop commenté... je voulais simplement faire ça comme "exercice personnel", mais d'un point de vue disdactique, pour toi, c'est pas génial.
Enfin, ma fonction transpose-row est tirée de NFTML. Lis bien le chapitre sur les boucles et leur usage en contexte sériel (7 et 8), c'est HYPER IMPORTANT. Voilà, je sais que c'est une lecture peu sexy, mais grâce à ce formidable ouvrage, concis et clair, tu pourras faire ce que tu veux.
Citation : A ce sujet, le tableau donne la série transposée mais est-il possible avec CM de pouvoir à partir de la série de base, des transformations, traduire le résultat du tableau en notes midi ?
Oui, c'est d'ailleurs bien plus simple à générer en fait. Je tâcherai de te retrouver le code que j'avais initialement fait.
Et le petit alog de génération aléatoire que j'ai écrit à un mérite : il te fera découvrir la syntaxe de la fonction "process", qui permet d'écrire une séquence temporelle d'événements... "process", c'est comme "loop", mais temporel. C'est la fonction de séquençage.
Et donc pour ton random-12-tone, la seule ligne à changer, c'est :
(define (ran-row end)
pour
(defun ran-row (end)
Bien à toi,
Th.
And we're going to have this transitory cow fling thing right here in Cicely?
- < Liste des sujets
- Charte