Subject: En rouge et noir

From: Jean-Marc Legrand - Éditions IN NOMINE<[email-masked]>
Date: Sun, 24 Apr 2022 19:07:58 +0200

Salutations à toute la troupe, de la part d'un lointain revenant !

Un petit souci que je ne parviens pas à résoudre.

Voici un exemple de code, avec 2 voix sur une même portée, de 2 couleurs 
différentes. Vous le verrez de suite, mon souci est que, si les 
ledgerlines sont bien rouges sur la voix 1 seule, dès que la voix 2 
arrive, elles redeviennent noires. LedgerLineSpanner.color est une 
propriété de Staff, ce qui explique cela... Auriez-vous une idée de 
sioux pour contourner ceci ?

PS : j'ai écumé les listes, et il y a des réponses approchantes, mais 
pas situation identiques (mise en parallèle de 2 voix sur une même 
Staff)... L'idée serait peut-être de dire, via une fonction Scheme : si 
ce sont des ledger lines supérieures, en rouge, sinon, en noir. Chapeau 
bas à la personne qui saurait me faire une petite fonction comme celle-ci !

Merci d'avance !

JMarc, toujours éditeur, mais surtout libraire désormais... et breton, 
qui plus est !

\version "2.22.1"

rouge = {
   \override NoteHead.color = #red
   \override Stem.color = #red
   \override TextScript.color = #red
   \override Script.color = #red
   \override Accidental.color = #red
   \override Slur.color = #red
   \override LedgerLineSpanner.color = #red
}

Arouge = \relative c'{\clef bass
   \voiceOne c4 (cis) cis (d) d (ees) ees (e) e1\fermata
}

Anoir = \relative c,{\clef bass
   \voiceTwo f4 (e) e (ees) ees (d) d (des) des1\fermata
}

\score {
   \new Staff <<
     \new Voice {\rouge \Arouge}
     \new Voice {\Anoir}
   >>
   \layout{}
   }

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 24 Apr 2022 19:39:28 +0200

Bonjour,

> Salutations à toute la troupe, de la part d'un lointain revenant !

Sur cette liste, personne n'a peur des revenants :-)

> Voici un exemple de code, avec 2 voix sur une même portée, de 2 
> couleurs différentes. Vous le verrez de suite, mon souci est que, si 
> les ledgerlines sont bien rouges sur la voix 1 seule, dès que la voix 
> 2 arrive, elles redeviennent noires. LedgerLineSpanner.color est une 
> Staff)... L'idée serait peut-être de dire, via une fonction Scheme : 
> si ce sont des ledger lines supérieures, en rouge, sinon, en noir. 
> Chapeau bas à la personne qui saurait me faire une petite fonction 
> comme celle-ci !
>
>
> Merci d'avance !
>

Bon, je propose ma solution :

\version "2.22.2"

\layout {
   #(use-modules (ice-9 match))
   \context {
     \Staff
     \override LedgerLineSpanner.stencil =
       #(grob-transformer 'stencil
         (lambda (grob original)
           (match-let*
               ((expr (ly:stencil-expr original))
                (X-ext (ly:stencil-extent original X))
                (Y-ext (ly:stencil-extent original Y))
                (('translate-stencil global-off ('combine-stencil . 
ledgers)) expr)
                (new-ledgers
                 (map
                  (lambda (ledger)
                    (match-let
                        ((('translate-stencil (0.0 . ledger-Y-off) 
ledger-expr) ledger))
                      (if (positive? ledger-Y-off)
                          `(color ,(css-color "red")
                                  ,ledger)
                          ledger)))
                  ledgers))
                (new-expr
                 `(translate-stencil ,global-off (combine-stencil . 
,new-ledgers))))
             (ly:make-stencil new-expr X-ext Y-ext))))

   }
}

\relative \new Staff << { e''8 g c e g e c g e } \\ { b,8 a g f g a b c 
d  } >>

Je tiens tout de même à insister sur deux points :

1. Ne dites à personne que je vous ai montré ce genre de truc.
Si Jean Abou Samra apprenait que je poste des hacks pareils,
il m'en voudrait.

2. Veuillez garder en tête que ce code est fortement dépendant
de détails internes, et qu'à ce titre il est possible qu'il
ne fonctionne plus dans une version ultérieure (même si, a
priori, il ne devrait pas être trop difficile de l'adapter).

Cordialement,
Jean

---

From: Jacques Menu <[email-masked]>
Date: Sun, 24 Apr 2022 20:58:56 +0200

Bras eo Jean, comme on dit en Bretagne!

JM

> Le 24 avr. 2022 à 19:39, Jean Abou Samra <[email-masked]> a écrit :
> 
> Bonjour,
> 
> 
>> Voici un exemple de code, avec 2 voix sur une même portée, de 2 couleurs différentes. Vous le verrez de suite, mon souci est que, si les ledgerlines sont bien rouges sur la voix 1 seule, dès que la voix 2 arrive, elles redeviennent noires. LedgerLineSpanner.color est une propriété de Staff, ce qui explique cela... Auriez-vous une idée de sioux pour contourner ceci ?
>> 
>> PS : j'ai écumé les listes, et il y a des réponses approchantes, mais pas situation identiques (mise en parallèle de 2 voix sur une même Staff)... L'idée serait peut-être de dire, via une fonction Scheme : si ce sont des ledger lines supérieures, en rouge, sinon, en noir. Chapeau bas à la personne qui saurait me faire une petite fonction comme celle-ci !
>> 
>> 
>> Merci d'avance !
>> 
>> JMarc, toujours éditeur, mais surtout libraire désormais... et breton, qui plus est !
> 
> 
> 
>                (('translate-stencil global-off ('combine-stencil . ledgers)) expr)
>                (new-ledgers
>                 (map
>                  (lambda (ledger)
>                    (match-let
>                        ((('translate-stencil (0.0 . ledger-Y-off) ledger-expr) ledger))
>                 `(translate-stencil ,global-off (combine-stencil . ,new-ledgers))))
> \relative \new Staff << { e''8 g c e g e c g e } \\ { b,8 a g f g a b c d  } >>
> 
>