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: Valentin Villenave
Subject: Re: macro pour un motif musical à répéter
Date: Mon, 4 Feb 2019 23:05:18 +0000

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,
V.



reply via email to

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