Scheme fonction avec itération

Bonjour à tous !

Je voudrais demander de l'aide pour écrire une fonction qui résolve la tâche suivante : étant donné une entrée de type ly:music, elle devrait renvoyer n copies de ly:musicavec un numéro de séquence ajouté au-dessus.

Par exemple : \foo n <c e>8 devrait renvoyer <c e>8^“1” <c e>8^“2” <c e>8^“3” ... <c e>8^“n”.

Je sais que je peux résoudre le problème de la répétition en utilisant \repeat, donc je pourrais écrire \repeat unfold n <c e>8. Il reste le problème de l'ajout automatique d'un numéro progressif au-dessus de l'accord.

Je pensais définir une fonction en Scheme avec une boucle map, mais je suis encore un peu confus par la programmation en Scheme.

Merci d'avance pour toute aide (et pardonnez mon français) !

Claudio

Bonjour,

Quelque chose comme ceci devrait le faire :

\version "2.24.3"

foo =
#(define-music-function (n m) (integer? ly:music?)
   (make-sequential-music
    (map (lambda (i)
           #{ $m ^#(number->string i) #})
         (iota n))))

{ \foo 8 <c' e'>8 }

Cordialement,
Jean

1 « J'aime »

Bonjour Jean,
merci beaucoup pour votre réponse, le code fait exactement ce que je voulais !

J'ai juste remarqué que si je donne un accord comme <c' e'>, chaque itération monte d'une octave (<c e'> par contre fonctionne très bien).
Y a-t-il un moyen de résoudre ce problème ?
Je l'ai résolu momentanément en ajoutant \fixed c' dans la fonction (j'ai également corrigé la numérotation pour qu'elle s'imprime à partir de 1):

foo =
#(define-music-function (n m) (integer? ly:music?)
   (make-sequential-music
    (map (lambda (i)
           #{\fixed c' $m ^#(number->string (+ 1 i)) #})
         (iota n))))

Cordialement,
Claudio

Zut, j'avais complètement oublié ça. La bonne solution, c'est :

\version "2.24.4"

foo =
#(define-music-function (n m) (integer? ly:music?)
   (make-relative (m) m
    (make-sequential-music
     (map (lambda (i)
            #{ $m ^#(number->string i) #})
          (iota n 1)))))

\relative {
  \foo 8 <c'' e>
}
1 « J'aime »

Merci beaucoup pour votre aide, Jean, la fonction fonctionne parfaitement !