lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: macro pour un motif musical à répéter


From: Jean-Jacques Gerbaud
Subject: Re: macro pour un motif musical à répéter
Date: Tue, 5 Feb 2019 11:29:26 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.0

Le 05/02/2019 à 00:05, Valentin Villenave a écrit :
On 2/4/19, eric <address@hidden> wrote:
Je ne sais pas non plus gérer un argument de longueur variable.
Qui peut m'aider (je suis assez novice ...)

De nos jours, c’est assez facile :

%%%%

toto =
#(define-music-function (parser location music) (ly:music?)
    (music-map
     (lambda (m)
       (let ((p (ly:music-property m 'pitch))
             (n (ly:music-deep-copy m)))
         (if (not (null? p))
             (begin
              (ly:music-set-property! n 'pitch
                (ly:pitch-transpose p (ly:make-pitch 1 0 0)))
             #{
               #m \change Staff = "up"
               #n \change Staff = "down"
             #})
             m)))
     music))

<<
   \new Staff = "up" { s1*2 }
   \new Staff = "down" \toto {b4 b b b}


%%%%

Quelques mots d’explication :
- le principe de music-map, c’est d’appliquer la même fonction à tous
les éléments successifs d’une liste (ce que vous entendez par
"argument de longueur variable", si je comprends bien). Il prend deux
arguments : d’abord la fonction, puis la liste (en l’occurrence, la
liste s’appelle "music", à la toute fin… mais on pourrait l’appeler
comme on veut).
- ladite fonction (ou procédure doit s’appliquer à n’importe quel
objet, appelons cet objet "m" (c’est à cela que sert lambda : il
introduit une variable qui servira d’argument à toutes les opérations
qui viennent ensuite).
- cependant il peut y avoir n’importe quoi dans cette succession
d’éléments "m" (par exemple une commande \bar, \clef, \time, \breathe,
que sais-je). On ne veut toucher que à ceux qui ont une propriété
'pitch (ceux qui n’en ont pas vont renvoyer une valeur nulle).
- J’extrais donc la valeur de cette propriété dans une variable "p",
que je teste ensuite. Si elle n’est pas nulle, je vais la transposer
d’une octave (le premier des trois arguments de ly:make-pitch :
octave, note, altération) et l’attribuer à une nouvelle note "n",
copiée depuis "m".
- Si p est nulle toutefois, je vais simplement remettre "m" sans y toucher.

En bonus : cette fonction écrite à la va-vite ne marche pas avec les
accords… mais elle pourrait être adaptée assez facilement.

Cordialement,

Bravo Valentin ! Non seulement ça marche mais en plus tu nous donnes les explications qui nous permettent de comprendre ce que tu écris ! Du coup, je me suis copié et collé ce petit texte dans mon "introduction à Scheme". Je m'en servirai plus tard.

Je profite de signaler en passant qu'il manque les >> fermants à la toute fin.

Mais c'est pas grave, on a trouvé quand même !

Cordialement.

--

JJG




reply via email to

[Prev in Thread] Current Thread [Next in Thread]