Subject: Ledgerline color

From: dmlmg20110107 <[email-masked]>
Date: Fri, 11 Jun 2021 23:43:28 -0700 (MST)

Bonjour à tous, 

J'espère que ce sujet n'a pas déjà été traité sur la liste, car je n'en ai
pas trouvé d'équivalent.

Quelqu'un sait-il comment se comporte la fonction \override
Staff.LedgerLineSpanner.color ?

La situation : devant des manuscrits altérés, certains éditeurs sont
contraints de reconstituer des notes disparues ou inconnues. Pour ce faire,
il est d'usage de leur attribuer dans la gravure une autre couleur, que ce
soit la tête, la queue, les points, les altérations, les silences, les
ornements, et bien sûr les petites lignes de portée supplémentaires (qui se
nomment "Ledger Lines" si j'ai bien compris nos collègues anglosaxons).

Exemple : 

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

Mon problème avec Lilypond, comme vous le constatez ci-dessus, c'est que
toutes les caractéristiques des notes peuvent être parfaitement maîtrisées
avec les commandes suivantes :

\override Stem.color = #(rgb-color x y z)
\override NoteHead.color = #(rgb-color x y z)
\override Beam.color = #(rgb-color x y z)
\override Rest.color = #(rgb-color x y z)
\override Dots.color = #(rgb-color x y z)
\override Accidental.color = #(rgb-color x y z) etc. etc. etc.

Sauf :

\override Staff.LedgerLineSpanner.color = #(rgb-color x y z)

Soit je place cette commande en début de partition, et toutes mes petites
lignes de portées supplémentaires sont colorées, soit je place la commande
devant la note à colorer, avec ou sans \once, et cela n'a aucun effet sur la
gravure.

Je ne maîtrise pas suffisamment les rouages internes de Lilypond pour
improviser quelque chose d'autre...donc quelqu'un de plus performant
aurait-il une idée ?

Vous allez me répondre qu'il s'agit là de couper un cheveu en 5, certes,
mais étant donné la puissance de Lilypond (sans exagérer) je me dis qu'il
s'agit plus d'un défi. Qu'en dites-vous ?

Avec tous mes remerciements, 
Mathieu.

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

---

From: Jacques Menu <[email-masked]>
Date: Sat, 12 Jun 2021 08:45:29 +0200

Bonjour Mathieu,

Watt aboutte:

\version "2.19.25"

\layout {
  ragged-right = ##t
}

% there is ony one ledger line spanner/grob/stencil
% produced for each musical system on the page (!)
% see: ledger-line-spanner.cc for c++ code for ly:ledger-line-spanner::print

#(define (MyLedgerLineSpannerPrint grob)
   (let*
    ((stil (ly:ledger-line-spanner::print grob))
     ;; (ifaces (ly:grob-interfaces grob))

     (noteheads (ly:grob-object grob 'note-heads))
     (new-stil (box-stencil (stencil-with-color stil (rgb-color 1.0 0.0 0.0)) 0.1 1))
     )

    (display "noteheads: ")(display noteheads)(newline)(newline)
    ;; (display (ly:grob-properties grob))(newline)(newline)
    ;; (display ifaces)(newline)(newline)

    new-stil))

\new Staff \with {
  \override LedgerLineSpanner.stencil = #MyLedgerLineSpannerPrint
  \override LedgerLineSpanner.after-line-breaking = #grob::display-objects
}
{
  c <d e> f''' g'''
  \break
  c2 e
}

> Le 12 juin 2021 à 08:43, dmlmg20110107 <[email-masked]> a écrit :
> 
> Bonjour à tous, 
>

---

From: Jean Abou Samra <[email-masked]>
Date: Sat, 12 Jun 2021 11:22:48 +0200

> Avec tous mes remerciements,

Bonjour,

Comme l'indique le code posté par Jacques, il n'y a qu'un seul
objet LedgerLineSpanner, qui s'étend sur toute la partition,
brisé en autant de morceaux que de systèmes. D'ailleurs, je ne
comprends pas la raison de ce choix.

Une solution consiste à commencer un nouveau symbole de portée,
ce qui force à démarrer un nouveau LedgerLineSpanner. Vous
trouverez un exemple ici :

https://lists.gnu.org/archive/html/lilypond-user/2015-03/msg00249.html

Une autre, qui vous épargnera les \stopStaff \startStaff, est
de redéfinir le graveur qui crée les lignes supplémentaires
pour qu'il produise un nouvel objet LedgerLineSpanner à chaque
étape temporelle où se trouvent des notes.

\version "2.22.1"

#(define (My_ledger_line_engraver context)
    (let ((ledgered-grobs '())
          (ledger-spanner #f))
      (make-engraver
        (acknowledgers
          ((ledgered-interface engraver grob source-engraver)
             (set! ledgered-grobs (cons grob ledgered-grobs))))
        ((process-acknowledged engraver)
           (for-each
             (lambda (grob)
               (if (not (ly:grob-property grob 'no-ledgers #f))
                   (begin
                     (if (not ledger-spanner)
                         (let ((column
                                 (ly:context-property context 
'currentMusicalColumn)))
                           (set! ledger-spanner
                                 (ly:engraver-make-grob engraver 
'LedgerLineSpanner grob))
                           (ly:spanner-set-bound! ledger-spanner LEFT 
column)
                           (ly:spanner-set-bound! ledger-spanner RIGHT 
column)))
                     (ly:pointer-group-interface::add-grob
                       ledger-spanner
                       'note-heads
                       grob))))
             ledgered-grobs)
           (set! ledgered-grobs '()))
        ((stop-translation-timestep engraver)
           (set! ledger-spanner #f)))))

\layout {
   \context {
     \Staff
     \remove "Ledger_line_engraver"
     \consists #My_ledger_line_engraver
   }
}

<<
   {
     c
     \once \override Staff.LedgerLineSpanner.color = "red"
     c
   }
   \\
   { a, <a, b,> }

Bien cordialement,
Jean

---

From: dmlmg20110107 <[email-masked]>
Date: Sat, 12 Jun 2021 13:51:10 -0700 (MST)

Bonsoir, 

Je vous remercie tous deux pour votre dévouement et vos explications.

Chapeau bas, car voilà une maîtrise du logiciel que je n'ai pas, faute de
temps et de persévérance.

Je vais donc m'atteler à la tâche et tenter de m'approprier ces codes.

Encore merci.

Bien cordialement, 
Mathieu.

---

From: dmlmg20110107 <[email-masked]>
Date: Sat, 12 Jun 2021 23:54:56 -0700 (MST)

Tout cela fonctionne parfaitement, la couleur de chaque petit trait de portée
supplémentaire peut être contrôlée à la note près.

Je reste toutefois surpris par la technicité nécessaire à déployer pour un
tel détail. Mais bon il y a forcément une raison pour qu'une telle commande
n'ait pu exister de base.

Encore une fois mille merci !

Mathieu.

---

From: Jacques Menu <[email-masked]>
Date: Sun, 13 Jun 2021 09:04:45 +0200

Bonjour Mathieu,

> Le 13 juin 2021 à 08:54, dmlmg20110107 <[email-masked]> a écrit :
> 

J’avais mis cet exemple de côté sans y mentionner l’auteur, dommage, je le fais systématiquement maintenant.

C’est une très grande force de Lily : il ne peut pas proposer toutes les fonctionalités particulières dont on peu rêver, mais on peut obtenir des résultats extraordinaires que les développeurs des applications graphiques mettraient un temps fou à mettre à disposition s’ils voulaient le faire.

C’est le côté magique de la programmation… mais il faut mettre les mains peu ou prou dans le cambouis, et surtout disposer d’experts prêts à aider, ce qui est une autre très grande force de Lily!

JM

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 13 Jun 2021 16:01:57 +0200

Bonjour,

Après un petit tour dans le code, je comprends mieux la raison :
certaines collisions entre les lignes supplémentaires de notes
adjacentes sont évitées par cet objet qui les a toutes sous
la main et peut donc les ajuster à volonté.

Je ne vous cache pas être insatisfait de l'état des choses. On
devrait pouvoir s'arranger pour que le LedgerLineSpanner ne soit
qu'un conteneur pour des objets LedgerLines, qui soient ponctuels
(Item) et non étendus (Spanner), un peu comme AccidentalPlacement
avec Accidental. J'irai à l'occasion me promener dans 
ledger-line-spanner.cc,
voir si cela est faisable. Cependant, je peux absolument rien promettre
au vu des atroces complications qui sont apparues lorsque j'ai essayé
une technique similaire sur les noms d'instruments et accolades de
début de système.

Bien cordialement,
Jean