Subject: Re: En rouge et noir

From: Librairie Les hirondelles <[email-masked]>
Date: Tue, 26 Apr 2022 18:27:08 +0200

Gloire à Jean, on peut le dire !

Mille merci pour ce condenser de trucs que j'ai bien du mal à comprendre.

En guise de remerciements, je vais m'attacher à comprendre tout cela.

Encore merci !

JMarc

---

From: Jacques Menu <[email-masked]>
Date: Wed, 27 Apr 2022 04:47:36 +0200

Pour les non-initiés : le gag, c’est que ‘le grand’ se dit ‘Ar Bras’ en breton (comme le chanteur connu Dan Ar Bras), cf le nom de l’auteur du message qui a initié cette discussion.

Bonne journée!

JM

> Le 26 avr. 2022 à 18:27, Librairie Les hirondelles <[email-masked]> a écrit :
>

---

From: Jean Abou Samra <[email-masked]>
Date: Fri, 29 Apr 2022 20:59:29 +0200

Bonsoir,

> Pour les non-initiés : le gag, c’est que ‘le grand’ se dit ‘Ar Bras’ en breton (comme le chanteur connu Dan Ar Bras), cf le nom de l’auteur du message qui a initié cette discussion.

Merci pour l'explication, je serais complètement passé à côté !

> Gloire à Jean, on peut le dire !

Pour l'anecdote, je suis tombé une fois (par hasard) sur un livre intitulé
« À moi la gloire ». Ce titre piquant ma curiosité, je lis l'introduction.
Il s'avère que l'auteur, un théologien catholique, avait donné une 
conférence
intitulée « À Toi la gloire », et que l'affiche de cette conférence était
faite d'une manière qui juxtaposait le titre et le nom du conférencier 
en gros,
si bien qu'on avait l'impression que la gloire allait au conférencier…

Plus sérieusement, je tiens à préciser que j'ai personnellement appris à
programmer LilyPond en lisant les snippets postés sur les listes, et que
si vous le faites trop, il risque de vous arriver la même chose. D'ailleurs,
c'est encore plus facile avec un tutoriel, par exemple, à tout hasard,

https://tutoriel-scheme.readthedocs.io

(que j'ai écrit précisément pour qu'il soit plus facile de se lancer pour
les utilisateurs francophones).

Bref, si vous ne vous voyez pas du tout écrire du code Scheme, sachez
que c'était mon cas à moi aussi il y a quelques années.

> En guise de remerciements, je vais m'attacher à comprendre tout cela.

Très bonne idée. Pour vous donner un coup de pouce, une explication
rapide de chaque étape :

>
> \version "2.22.2"
>
> \layout {
>   #(use-modules (ice-9 match))

Le module (ice-9 match) fournit match-let*, qui est utilisé plus bas.

>   \context {
>     \Staff
>     \override LedgerLineSpanner.stencil =

Je change le stencil du LedgerLineSpanner, c'est à dire la manière
dont il s'affiche, son dessin.

>       #(grob-transformer 'stencil
>         (lambda (grob original)

Le grob-transformer me permet d'obtenir la valeur qui aurait été
calculée par défaut, et de calculer une nouvelle valeur à partir
de l'ancienne.

>           (match-let*

Définition de variables locales, comme avec let* sauf que match-let*
a des pouvoirs magiques en plus (voir plus bas).

>               ((expr (ly:stencil-expr original))

Dans un stencil (« dessin »), il y a trois composantes :

- Une expression qui explique comment exécuter le dessin,
- Une étendue horizontale,
- Une étendue verticale.

Cette ligne et les deux suivantes mettent ces trois composantes
dans des variables.

>                (X-ext (ly:stencil-extent original X))
>                (Y-ext (ly:stencil-extent original Y))
>                (('translate-stencil global-off ('combine-stencil . 
> ledgers)) expr)

Le programme de dessin du stencil ressemble à

(translate-stencil <un déplacement (càd paire (x . y))> (combine-stencil 
<ligne 1> <ligne 2> ...))

match-let* permet de « déstructurer » cette expression de manière
visuelle (le pattern matching est un peu déconcertant au début,
mais rudement pratique).

>                (new-ledgers
>                 (map
>                  (lambda (ledger)

Maintenant, je construis une nouvelle liste de lignes à partir de 
l'ancienne.

>                    (match-let
>                        ((('translate-stencil (0.0 . ledger-Y-off) 
> ledger-expr) ledger))

Nouveau pattern matching pour accéder à l'expression qui dessine la ligne
(ledger-expr) et à son décalage vertical (ledger-Y-off).

>                      (if (positive? ledger-Y-off)
>                          `(color ,(css-color "red")
>                                  ,ledger)

La partie centrale : si ledger-Y-off est positif, c'est à dire que
j'ai affaire à une ligne supplémentaire sur le haut de la portée,
je la mets dans une expression (color ...) pour la colorier.
Sinon, je la laisse telle quelle.

>                          ledger)))
>                  ledgers))
>                (new-expr
>                 `(translate-stencil ,global-off (combine-stencil . 
> ,new-ledgers))))
>             (ly:make-stencil new-expr X-ext Y-ext))))

Et il n'y a plus qu'à tout reconstruire dans l'autre sens avec la
nouvelle liste de lignes.

Voilà, j'espère que cela ne vous effraie pas (trop). En tous cas,
je vous assure qu'il n'y a rien de sorcier là-dedans.

Cordialement,
Jean

---

From: Jean-Jacques Gerbaud <[email-masked]>
Date: Sat, 30 Apr 2022 10:05:04 +0200

> nouvelle liste de lignes.
ya plus qu'à... !
> je vous assure qu'il n'y a rien de sorcier là-dedans.
Non, Jean, pardon, il n'y a rien de sorcier pour celui qui sait, qui
connaît les termes, les expressions, le vocabulaire mais pour nous...

Pour écrire ce que tu viens d'écrire, il me faut la journée et encore,
je ne suis pas sûr d'y arriver !
> Cordialement,

Merci quand même de ce début de tutoriel.

-- 
JJG
Drôme provençale