< Back to IRCAM Forum

Utilisation des boucles pour générer des contraintes

Bonjour,

Je viens de débuter avec OpenMusic et je suis peu habitué à Common Lisp.
Dans le but de créer des contraintes sur une liste de notes, je veux générer la boucle suivante

List [6200,6400,6500,6700,6900,7100,7200]; /Mode dorien à titre d’exemple/
For X in [], nth-random;/* faire usage de l’object nth random afin de générer une liste */

If (Xn - Xn-1 < 700 && != 100 != 600 ) /* les contraintes qui permettent de restreindre l’ambitus des intervalles et d’éviter les secondes mineures et les tritons*/
print Xn
Else
print Xn-1

Merci de vos suggestions,

bonjour,
le spécification n’est pas très claire.
si vous voulez pour commencer générer une liste avec n valeurs prises au hasard dans un mode donné (ou plus simplement une liste de hauteurs),
cela pourrait être fait de la manière suivante :

(loop for note from 1 to n collect (nth-random mode)))

(ou bien dans OM en utilisant “repeat-n”)

Pour la deuxième partie, votre code s’écrirait par exemple

(loop for n from 1 to (1- (length )) do  
  (let ((interval (- (nth n ) (nth (1- n) ))))  
    (if (or (> interval 700) (= interval 100) (= interval 600))  
      (print (nth (1- n) ))  
      (print (nth n ))  
     )  
  ))

Bonjour

Merci pour votre réponse,

Lorsque j’utilise le Lisp editor, j’ai le message d’erreur suivant après avoir évalué;

the variable liste is unbound.

ce qui est parfaitement normal puisqu’elle n’a aucune valeur initiale.

J’en arrive aux constats suivant;

Quelle ouvrage de référence me conseillez-vous afin de maitriser le langage de programmation de OM?

Est-il possible d’appliquer ce code en mode graphique et quel serait l’aspect du patch?

Quelles sont les opérations afin d’utiliser ce code.

Cordialement

Il faut intégrer cela dans une fonction pour pouvoir l’utiliser ensuite , par exemple :

(defun my-fnction (liste)  
(loop for n from 1 to (1- (length liste)) do  
  (let ((interval (- (nth n ) (nth (1- n) liste))))  
    (if (or (> interval 700) (= interval 100) (= interval 600))  
      (print (nth (1- n) liste))  
      (print (nth n liste))  
     )  
  ))  
)

Ici liste est l’argument de la fonction : il suffit de lappeler ensuite en avec la bonne valuer. Par exemple

(my-function '(1000 1200 1300 1400))

Pour l’utiliser dans un patch il sufit de taper

cl-user::my-function comme nom de fonction après double-click

=> http://support.ircam.fr/docs/om/om6-manual/co/AddingBoxes.html
Ici, comme la fonction n’est pas dans un menu, vous devez entere vous même le nom de la fonction (voir en bas de la page)

Vous pouvez aussi utiliser une boite “LISP” dans laquelle vous copiez le corps de la fonction sous forme de “lambda expression” :

(lambda (liste)  
(loop for n from 1 to (1- (length liste)) do  
  (let ((interval (- (nth n ) (nth (1- n) liste))))  
    (if (or (> interval 700) (= interval 100) (= interval 600))  
      (print (nth (1- n) liste))  
      (print (nth n liste))  
     )  
  ))  
)

[ voir http://support.ircam.fr/docs/om/om6-manual/co/LispFunctions.html ]

Si vous n’êtes pas à l’aise avec Lisp, il est aussi possible de faire tout en graphique (mais OMLoop n’est pas le plus facile pour débuter)
=> http://support.ircam.fr/docs/om/om6-manual/co/LoopGeneral.html