Se lancer dans la composition algorithmique et l'aide à l'écriture avec Common Music
- 69 réponses
- 6 participants
- 5 351 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?
deb76
Plusieurs choses. Comme l'installation sur mon PC dédié musique et qui tourne sur XP s'est bien déroulée, j'ai copié le dossier sur les trois autres machines, le portable qui est XP, et le PC fixe dédié musique en Vista et le portable aussi sur Vista.
Du coup, le portable sur XP qui me générait des erreurs d'évaluations, tourne bien maintenant.
Le PC fixe sous Vista, qui m'avai refusé lors du téléchargement de fichiers certains d'entre eux, c'est pareil, tout comme le portable sous Vista.
Mais il y a un hic avec Vista pour enregistrer les fichiers midi. Je me suis rendu compte sur les 2 PC sous XP qu'ils font appel au lecteur classique de windows, lecteur qui manifestement n'existe pas sous Vista. Donc là, je coince. J'ai regardé le dossier midishare mais je n'ai rien vu pour modifier l'écriture midi. Dans le dossier src et midishare, j'ai tenté de le faire ouvrir par le lecteur normal de windows mais rien n'y fait.
Le plus étonnant, c'est qu'Open Music enregistre bien les fichiers midi et il utilise aussi midishare... Je pense que je vais envoyer un mail au GRAME pour leur expliquer le problème.
Citation : Et donc pour ton random-12-tone, la seule ligne à changer, c'est :
(define (ran-row end)
pour
(defun ran-row (end)
J'ai fait ce changement mais je me prends un beau message d'erreur que voici
: Error: No dispatch function defined for #t. [file position = 598]
[condition type: READER-ERROR]
(ERROR READER-ERROR STREAM
#<STRING-INPUT-SIMPLE-STREAM "(defun ran-r..." pos 598>
FORMAT-CONTROL ~?~@[ [file position = ~d]~] FORMAT-ARGUMENTS
(No dispatch function defined for ~S. (t) 598))
(READ #<STRING-INPUT-SIMPLE-STREAM "(defun ran-r..." pos 598> NIL
(READ-ERROR))
(READ-FROM-STRING (defun 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) "tons12.mid") NIL (READ-ERROR) START
0)
Citation : 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)
...)
J'avais bien enregistré ces différences. Et c'est bien là le problème. L'exemple du 12 tones est significatif. Mais prenons en exemple un des tous premiers dans Lisp Listener :
Tu me dis :
Citation : En Common Lisp, on écrira :
(setq ma-variable 69)
(defun ma-fonction (param1 param2)
...)
Mais qu'est-ce que je fais ici :
Citation : (define albans-row '(0 3 7 11 2 5 9 1 4 6 8 10))
(define (row->matrix row)
;; this function is discussed in Chapter 8
(loop for i in row
collect
(loop for j in row
collect (mod (+ (- i) j) 12))))
(pprint (row->matrix albans-row))
Outre ce changement de fonction, il faut aussi prendre en compte aussi l'écriture d'une variable avec "setq".
Quand on sait que la moindre erreur génère un refus d'évaluation, ce n'est guère pratique pour quelqu'un qui découvre.
Citation : Tu peux dès lors utiliser n'importe quel exemple tiré du dictionnaire CM ou de NFTML
Pour quelqu'un qui connaît quand même les bases car sinon le tuto NFTML est plein de pièges.
Ainsi, dans le chapitre Musical Math :
(rhythm->seconds 1/4 60) me génère une erreur.
En revanche, (expt 2 2) me donne le bon résultat.
Mais qu'est-ce que je fais avec ça :
(define lowest-freq 8.175)
(define (keynum->hertz knum)
(* lowest-freq (expt 2 (/ knum 12)
De même, sur un exemple encore plus simple :
(keynum->hertz 60) ---> il me le refuse et pour cause, il faut écrire plus simplement :
(hertz 60)
Je m'en suis aperçu en faisant le tutorial sur scales.
En fait, pour quelqu'un qui ne connaît pas la syntaxe de Common Music et Common Lisp, le tuto NFTML ne sert pas à grand chose dans un premier temps, il donnerait plutôt envie de tout envoyer balader. Bien entendu, une fois maîtrisée la syntaxe, il sera utile pour la suite.
Autre exemple tout simple qui ne fonctionne pas, celui des exemples de Chance :
(chance? 0)----> j'ai un nouveau message d'erreur.
D'où cette question, où peut-on trouver un tutorial écrit pour Common Lisp ? Car je suppose que je ne suis pas tout seul à me poser ces questions.
Ou alors, n'est-il pas plus simple d'utiliser Common Music avec Scheme, au moins je pourrais bénéficier d'un tutorial pas à pas.
Désolé pour ce long post mais j'avoue que ça m'intéresse de plus en plus mais je suis désespéré de ne pas pouvoir utiliser NFTML, de me retrouver le plus souvent lors d'essais avec des messages d'erreurs.
amleth
Bon. En effet, beaucoup de choses dans ton message, et je vais m'efforcer te t'apporter la lumière.
SUR LA QUESTION DU PLAYER MIDI
Il existe une variable qui possède le chemin vers le player midi par défaut :
*midi-player*
Tu peux donc changer son contenu, en faisant ça :
(setf *midi-player* "/path/to/my/midiplayer")
Je ne connais pas l'emplacement du player Vista, mais tu pourras sans problème la trouver par toi-même.
Et d'un !
POUR LE GENERATEUR DE SERIES DODECAPHONIQUES ALEATOIRE
J'ai une bonne nouvelle : j'ai copié-collé ton code, et ça plante aussi chez moi. C'est que le macro-caractère '#t' n'existe pas en Common Lisp. Je l'ai simplement remplacé par 't', et miracle, des séries jaillissent de toute part ! Je plaide coupable : j'ignorais tout de ce '#t', mais voilà, tu m'as aidé à trouver une différence en plus.
Et de deux.
DEFINE, DEFUN, SETQ...
Citation :
(define albans-row '(0 3 7 11 2 5 9 1 4 6 8 10))
(define (row->matrix row)
;; this function is discussed in Chapter 8
(loop for i in row
collect
(loop for j in row
collect (mod (+ (- i) j) 12))))
(pprint (row->matrix albans-row))
Et bien tout simplement :
;; Il s'agit d'une variable
(setq albans-row '(0 3 7 11 2 5 9 1 4 6 8 10))
;; Ceci est une fonction
(defun row->matrix (row)
;; this function is discussed in Chapter 8
(loop for i in row
collect
(loop for j in row
collect (mod (+ (- i) j) 12))))
;; L'appel de la fonction ne change pas
(pprint (row->matrix albans-row))
Et de trois ?
MUSICAL MATH...
Si les fonctions "rhythm->seconds" et "keynum->hertz" te posent problème, c'est que tu ne les as pas évaluées correctement. Il te faut faire :
(defun rhythm->seconds (rhy tempo)
(* rhy 4.0 (bpm->seconds tempo)))
et
(setq lowest-freq 8.175)
(defun keynum->hertz (knum)
(* lowest-freq (expt 2 (/ knum 12)
Quant à chance, as-tu, également, évalué la définition de la fonction pour la rendre utilisable ?
(defun chance? (prob)
(< (random 1.0) prob))
SUR LE LISP
Bon, pour moi, avec tout ça, tu as réglé tous tes problèmes. Je sais que c'est peu trivial, mais en continuant nos échanges de la sorte, tu devrais finir par y voir clair. Je puis te proposer un lien vers le site de l'UV que j'enseigne http://www.hds.utc.fr/%7Emhabel/IA01/. Il y a des ressources de formation extérieures, dont un tuto et un manuel plus complet et en français...
J'attends donc une confirmation de ta part me disant, "Youpi, les fonctions fonctionnent", comme ça je pourrai dormir sur mes deux oreilles.
And we're going to have this transitory cow fling thing right here in Cicely?
deb76
Error: attempt to call `EVENTS' which is an undefined function.
[condition type: UNDEFINED-FUNCTION]
Citation : (defun 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) "randomtone.mid"
? "randomtone.mid")
Alors où est-ce que je me plante ? Arghhh, c'est frustrant.
Bon, ça je pense que j'ai assimilé:
Citation : ;; Il s'agit d'une variable
(setq albans-row '(0 3 7 11 2 5 9 1 4 6 8 10))
;; Ceci est une fonction
(defun row->matrix (row)
Citation : Si les fonctions "rhythm->seconds" et "keynum->hertz" te posent problème, c'est que tu ne les as pas évaluées correctement. Il te faut faire :
Bah non, car j'essayais de voir avec les exemples du tutorial. Ceci étant, sur ces fonctions, y compris de celle sur chance,
Citation : (defun rhythm->seconds (rhy tempo)
(* rhy 4.0 (bpm->seconds tempo)))
et
(setq lowest-freq 8.175)
(defun keynum->hertz (knum)
(* lowest-freq (expt 2 (/ knum 12)
(defun chance? (prob)
(< (random 1.0) prob))
j'ai les résultats suivants :
Citation : CG-USER(65):
RHYTHM->SECONDS
CG-USER(66):
8.175
CG-USER(67):
KEYNUM->HERTZ
CG-USER(68):
CHANCE?
Donc pas de messages d'erreur mais pas de résultats de calculs...
Mais à côté de ça, je viens de faire les exercices autour de lambda et defun, sur le lien E-Lisp Tutorial, que tu m'as envoyé et ça fonctionne. J'ai les bons résultats.
Merci pour cette documentation. Peux-tu regarder où j'ai fait l'erreur sur le générateur de séries dodécaphoniques aléatoires ? Et peux-tu m'envoyer ton fichier qui fonctionne, car là j'en meurs d'envie de le découvrir et de générer des séries aléatoires.
Merci d'avance.
amleth
Mon fichier :
http://ingk.free.fr/tt12.lisp
D'abord, j'évalue la première ligne (je te laisse changer l'emplacement)
Puis je tape (in-package :cm) directos dans la boucle CG-USER.
Puis, j'évalue la définition de la fonction...
et en évaluant l'appel avec "events", ça jaillit de partout.
On va faire un test intermédiaire : tente d'appeller la fonction sans events :
(ran-row 30)
et dis-moi ce qu'il se passe...
And we're going to have this transitory cow fling thing right here in Cicely?
deb76
Citation : (events (ran-row 30) "randomtone.mid"
? "randomtone.mid"
Je m'interrogeais sur le "?" et le doublement du nom du fichier, ce qui ne correspondait pas aux exemples que tu m'avais donnés.
Donc là, ça fonctionne....
Merci. Bon, là, il faut que je parte travailler à mon journal.
Hors sujet : Sais-tu qu'au tout début de ton lieu de travail, il y avait un animateur culturel ? Et qu'avec lui j'avais créé le Jazz Pop Action de Compiègne, en relation avec le Rezo Zero et Annecy Jazz Action ? On avait fait venir des groupes comme Magma, Hatfield and the North, X Tet, les percussions de Strabourg...
amleth
Hors sujet : Ouah ! Tu as oeuvré pour le développement culturel de Compiègne, tu as tout mon respect. Je me renseignerai autour de moi pour voir si quelqu'un connait ton travail ici.
Tu traînes parfois dans le coin ?
And we're going to have this transitory cow fling thing right here in Cicely?
deb76
Hors sujet : Citation : Ouah ! Tu as oeuvré pour le développement culturel de Compiègne, tu as tout mon respect. Je me renseignerai autour de moi pour voir si quelqu'un connait ton travail ici.
Tu traînes parfois dans le coin ?
Je doute. C'était entre 1972 et fin 1973. L'animateur culturel était Jean-Pierre Silh. Moi, je venais de faire ma formation d'animateurs culturels du Ministère de la Culture, et je travaillais en tant qu'animateur musical à la Maison de la Culture de Créteil en préfiguration dirigée par Jean Negroni (l'acteur et metteur en scène). C'était toute l'institution et tout son poids pesant, surtout avec Négroni (il était Robespière dans la fameuse série éponyme à l'époque), sympa mais l'homme de théâaaatre très classique. J'avais envie d'autre chose, dans l'esprit d'Annecy Jazz Action, en prise sur la contre culture de l'époque. D'où ma venue à Compiègne. Inutile de te dire que nos projets plaisaient aux jeunes mais étaient moyennement appréciés par la ville. J'avais même fait une occupation de la Mjc pour avoir des locaux... Un de ceux qui pourrait s'en souvenir était Alain Poidevin.
Sinon, j'avais fait ça à la demande de la Ligue des Droits de l'Homme, pour l'exposition 41 artistes disparition Mehdi Ben Barka pour laquelle j'avais fait la musiqe un petit CV.
Ca fait des années que je ne suis pas venu à Compiègne. Faut dire que je vis dans un décor de cartes postales, avec vue sur le port de pêche, de commerce et la mer. Pour un ancien Parisien, c'est inestimable.
Bien à toi.
Didier
amleth
Hors sujet : Citation : mais étaient moyennement appréciés par la ville
Curieusement, je n'ai aucun mal à imaginer...
Quant au port et Paris... raaaa, comme je te comprends. Je suis actuellement parisien, et je me prends à rêver de baie de somme...
Heu, oui, donc, bref, common music...
Hors sujet : J'ai enfin acquis la licence de Bidule hier...Voilà, je le crie sur tous les toits, car il faut faire de la pub pour ce soft !
And we're going to have this transitory cow fling thing right here in Cicely?
deb76
Hors sujet : Citation : J'ai enfin acquis la licence de Bidule hier...Voilà, je le crie sur tous les toits, car il faut faire de la pub pour ce soft !
Elle vaut combien ? Peux-tu m'en dire plus ? Qu'est-ce qu'il permet de faire dans ce qui nous intéresse ?
Sinon, pour revenir à Common Music, j'envisage de faire durant les vacances un petit tutorial en page web (c'est un bien grand mot) retraçant tout ce qui a été indiqué ici par tes soins. En gros, du lieu de téléchargement d'allegro, de common music, les étapes pour l'installation, un zoom sur les deux langages de lisp, et l'utilisation de defun ou lieu de define et de setq, les patchs fonctionnels, etc.
Un petit point aussi sur les conversions fréquences --> note midi, position de la note (keynum), etc. Autant d'outils qui peuvent se révéler fort pratique pour des déclarations de variables.
Puis-je te citer car c'est toi qui est à l'origine de tout ça ?
Et surtout qu'en penses-tu ?
PS : j'ai craqué. Je suis retourné à mes anciens amours, je me suis inscrit au forum Recherche de l'Ircam (je l'ai été de 1993 à 2000 autour de patchwork). J'ai une belle version d'Open Music 5.2 avec toutes les bibliothèques de l'Ircam, dont le fameux patch de Tristan Murail sur "Désintégrations", je le recherchais depuis pas mal de temps.
amleth
Pour parler uniquement "élaboration des structures du discours musical", Bidule (à l'instar de Max... hem) n'est pas trop trop fait pour ça. Je pense qu'on peut comparer Max et Bidule sur bien des aspects... à part sur le prix et la facilité de prise en main En fait, mon cerveau est déjà totalement occupé par CM et la programmation de structures MIDI, il me fallait un outil d'expérimentation audio qui soit surpuissant mais simple.
En gros, CM va générer des fichiers MIDI qu'on va monter dans un séquenceur, Bidule va plutôt permettre de poser des générateurs aléatoires et des filtres qu'on va bricoler entre eux (exactement comme dans Max).
And we're going to have this transitory cow fling thing right here in Cicely?
- < Liste des sujets
- Charte