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

From: eric <[email-masked]>
Date: Mon, 4 Feb 2019 15:15:02 -0700 (MST)

Bonjour, 
Je voudrais faire une macro pour faciliter l'édition d'une partition comme
celle-ci :

<http://lilypond-french-users.1298960.n2.nabble.com/file/t395723/document.jpg> 

je sais faire ceci 

\version "2.18.2"
 \new PianoStaff 
   \new Staff=up
   {\relative c \clef treble
    {s1
    }
   }
   \new Staff=down
   { \clef bass \relative c
    {
      c16 \change Staff=up c' \change Staff=down 
      d, \change Staff=up d' \change Staff=down 
      e, \change Staff=up e'  \change Staff=down
      d, \change Staff=up d'  \change Staff=down
      c, \change Staff=up c' \change Staff=down 
      e, \change Staff=up e' \change Staff=down 
      a, \change Staff=up a'  \change Staff=down
      c,, \change Staff=up c'  \change Staff=down
    }
   }

mais je voudrais écrire une macro pour pouvoir faire cela 

\version "2.18.2"
 \new PianoStaff 
   \new Staff=up
   {\relative c \clef treble
    {s1
    }
   }
   \new Staff=down
   { \clef bass \relative c
    {
      \toto{c16 d e d c e a c,}
    }
   }

Les changements de portée se font facilement, mais je ne sais pas faire les
sauts d'octave. J'ai essayé avec \transpose, mais c'est incompatible avec
\relative.
Je ne sais pas non plus gérer un argument de longueur variable. 
Qui peut m'aider (je suis assez novice ...)

--
Sent from: http://lilypond-french-users.1298960.n2.nabble.com/

---

From: Valentin Villenave <[email-masked]>
Date: Mon, 4 Feb 2019 23:05:18 +0000

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

---

From: Jean-Jacques Gerbaud <[email-masked]>
Date: Tue, 5 Feb 2019 11:29:26 +0100

> accords… mais elle pourrait être adaptée assez facilement.

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

---

From: Olivier Miakinen <[email-masked]>
Date: Tue, 5 Feb 2019 11:35:38 +0100

Le 05/02/2019 11:29, Jean-Jacques Gerbaud à Valentin Villenave :
> [...]

Tout pareil.

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

Je parierais plutôt que ton courrielleur te cache les chevrons fermants
quand il croit que c'est une citation. N'est-ce pas ?

Cordialement,
-- 
Olivier Miakinen

---

From: Jean-Jacques Gerbaud <[email-masked]>
Date: Tue, 5 Feb 2019 12:04:42 +0100

> quand il croit que c'est une citation. N'est-ce pas ?

Ben, non !

Dans le message de Valentin en réponse à Eric, les chevrons fermants n'y 
sont pas ! :-) On ne s'en aperçoit qu'à la compilation !

Donc, c'est pas mon courrielleur. Mais on excuse Valentin car il 
explique qu'il a fait ce "petit bout de scheme" à la "va vite !"

-- 

JJG

---

From: Valentin Villenave <[email-masked]>
Date: Tue, 5 Feb 2019 12:06:38 +0000

On 2/5/19, Jean-Jacques Gerbaud <[email-masked]> wrote:
> sont pas ! :-)

Oui, mais dans le mail traduit en HTML ils ont été remplacés par deux
barres verticales dans la marge à gauche, donc le soupçon d’Olivier
est bien correct finalement :-)

D’ailleurs on les voit bien dans l’archive :
http://lists.gnu.org/archive/html/lilypond-user-fr/2019-02/msg00044.html

Bon à savoir pour de futurs exemples éventuellement moins simples et
qui risqueraient de ne pas compiler à cause de ça…

V.

---

From: Olivier Miakinen <[email-masked]>
Date: Tue, 5 Feb 2019 21:13:46 +0100

>> quand il croit que c'est une citation. N'est-ce pas ?

Ben si !

> sont pas ! :-) On ne s'en aperçoit qu'à la compilation !

Voilà le message de Valentin tel qu'il est réellement :
<https://i.goopics.net/18DGe.png>.

Mon Thunderbird colorie en vert la citation du message d'Éric (avec un
seul chevron à gauche > car c'est une citation de premier niveau) mais
il colorie aussi en vert les deux chevrons >> de Valentin, car il croit
que c'est une citation vide de second niveau.

Pour obtenir ce « vrai » message, et pas l'interprétation qu'en fait
Thunderbird avec des barres verticales à la place des chevrons, il m'a
fallu bidouiller la config, ce que j'ai fait dès que ces horribles
barres sont apparues :
<https://support.mozilla.org/fr/questions/1144690>
ou : <http://kb.mozillazine.org/Quote_bars>.

> explique qu'il a fait ce "petit bout de scheme" à la "va vite !"

C'est donc bien ton courrielleur qui a surinterprété, alors que le
message de Valentin était parfait. J'aimerais d'ailleurs changer
de courrielleur car il est de plus en plus difficile d'empêcher
Thunderbird d'être « trop » intelligent (et du coup trop bête),
mais je ne sais pas comment trouver un logiciel qui tourne aussi
bien sur Linux que sur Windows, et si possible qui gère les news
aussi bien que le courriel.

Cordialement,
-- 
Olivier Miakinen

---

From: Jean-Jacques Gerbaud <[email-masked]>
Date: Tue, 5 Feb 2019 23:53:44 +0100

> Le 05/02/2019 12:04, Jean-Jacques Gerbaud a écrit :
......
> aussi bien que le courriel.

Finalement, la liste Lilypond ne sert pas qu'à la configuration ou 
l'utilisation de Lilypond. Je viens d'apprendre que mon courrielleur, à 
qui je faisais toute confiance, me trahit depuis des années quant à la 
lecture des mails que je reçois.

J'ai vu l'original du message de Valentin et il y a effectivement les 2 
chevrons entrants et sortants. Mais dans le message reçu, le dernier 
sortant n'apparaît pas et, comme tu le dis Olivier, c'est TDB qui 
interprête (mal) ce qu'il reçoit.

Je vais m'occuper très vite des manips à faire pour obtenir les messages 
tels qu'ils ont été rédigés.

Mais nous ne parlons là que des "quote bar" Peut être que Thunderbird 
(ou un autre) nous fait des blagues similaires pour autre chose !

Allez, bonne nuit

-- 

JJG