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

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

Re: En rouge et noir


From: Jean Abou Samra
Subject: Re: En rouge et noir
Date: Fri, 29 Apr 2022 20:59:29 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.1

Bonsoir,


Le 27/04/2022 à 04:47, Jacques Menu a écrit :
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.



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.


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




reply via email to

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