Le 18/05/2021 à 16:38, Lukas-Fabian Moser a écrit :

Seeing the discussion on coloured lyrics, colour this and that, I realized that for some parts I do change the Background Colour of the clefs maually (using a standard ofice yellow marking (grease) pencil each time after an update print. The purpose is to have a fast recognition point for the eyes to jump to the next line and/or page.

How about:

Improved version that only tweaks the stencil after-line-breaking:

\version "2.19"

#(define (positive-number? x) (and (number? x) (positive? x)))

markerPen =
#(define-music-function
  (X-padding Y-padding grob-path)
  ((positive-number? 0.5) (positive-number? 0) key-list?)
  #{
    \override #grob-path .layer = -1
    \override #grob-path .after-line-breaking =
    #(lambda (grob)
       (let*
        ((original (ly:grob-property grob 'stencil))
         (X-ext (ly:stencil-extent original X))
         (Y-ext (ly:stencil-extent original Y)))
        (ly:grob-set-property!
         grob 'stencil
         (ly:stencil-add
          (ly:make-stencil
           (ly:stencil-expr (stencil-with-color
                             (ly:round-filled-box
                              (interval-widen X-ext X-padding)
                              (interval-widen Y-ext Y-padding)
                              1)
                             yellow))
           empty-interval empty-interval)
          original))))
  #})

\new Staff \with {
  \markerPen Clef
}
\relative {
  c'4 d \once\markerPen 0.5 0.5 Accidental es fis
  \once \markerPen Staff.BarLine
  g \markerPen 0.5 0.5 NoteHead g a
}

While this does not solve the problem of the marking affecting inter-system spacing, at least it now works fine for accidentals.


How about a separate grob with engraver? Try the attached.

Is there also a possibility to automatically colour the background in Lilypond, or is there a feature wishlist to which I could add this

You could add it at https://gitlab.com/lilypond/lilypond/-/issues

A variant marking a complete voice in another background colour or only the clef(s) would probably also do.

I have been working on something pretty much like that lately.

Is there a way to make a color glow from an image? I actually need something of that sort for the colored notes.

With the attached code,

\override TheGrob.highlight-me = ##t

\override TheGrob.highlight-details.stencil = #ly:text-interface::print

\override TheGrob.highlight-details.text = \markup \epsfile #X #2.0 "path/to/an/EPS/image.eps"

(Adjust the 2.0 to the desired width.)

Best,
Jean

\version "2.23.3"

#(define (define-grob! grob-name grob-entry)
   (let* ((meta-entry   (assoc-get 'meta grob-entry))
          (class        (assoc-get 'class meta-entry))
          (ifaces-entry (assoc-get 'interfaces meta-entry)))
     (set-object-property! grob-name 'translation-type? ly:grob-properties?)
     (set-object-property! grob-name 'is-grob? #t)
     (set! ifaces-entry (append (case class
                                  ((Item) '(item-interface))
                                  ((Spanner) '(spanner-interface))
                                  ((Paper_column) '((item-interface
                                                     paper-column-interface)))
                                  ((System) '((system-interface
                                               spanner-interface)))
                                  (else '(unknown-interface)))
                                ifaces-entry))
     (set! ifaces-entry (uniq-list (sort ifaces-entry symbol<?)))
     (set! ifaces-entry (cons 'grob-interface ifaces-entry))
     (set! meta-entry (assoc-set! meta-entry 'name grob-name))
     (set! meta-entry (assoc-set! meta-entry 'interfaces
                                  ifaces-entry))
     (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
     (set! all-grob-descriptions
           (cons (cons grob-name grob-entry)
                 all-grob-descriptions))))

#(set-object-property! 'X-padding 'backend-type? number?)
#(set-object-property! 'Y-padding 'backend-type? number?)
#(set-object-property! 'highlight-me 'backend-type? boolean?)
#(set-object-property! 'highlight-details 'backend-type? list?)
#(set-object-property! 'blot 'backend-type? number?)


#(define (grob-highlight::print grob)
   (let ((parent (ly:grob-parent grob X)))
     (if (grob::is-live? parent)
         (let* ((X-extent (ly:grob-extent parent parent X))
                (Y-extent (ly:grob-extent parent parent Y))
                (X-padding (ly:grob-property grob 'X-padding 0))
                (Y-padding (ly:grob-property grob 'Y-padding 0))
                (blot (ly:grob-property grob 'blot 0)))
           (ly:round-filled-box
             (interval-widen X-extent X-padding)
             (interval-widen Y-extent Y-padding)
             blot)))))

#(define-grob!
  'GrobHighlight
  `((layer . -10)
    (stencil . ,grob-highlight::print)
    (X-extent . #f)
    (Y-extent . #f)
    (meta . ((class . Item)
             (interfaces . ())))))

#(define (Grob_highlight_engraver context)
   (let ((grobs '()))
     (make-engraver
       (acknowledgers
         ((grob-interface engraver grob source-engraver)
            (if (eq? #t (ly:grob-property grob 'highlight-me))
                (set! grobs (cons grob grobs)))))
       ((process-acknowledged engraver)
          (for-each
            (lambda (grob)
              (let ((highlight (ly:engraver-make-grob engraver 'GrobHighlight grob)))
                (ly:grob-set-parent! highlight X grob)
                (ly:grob-set-parent! highlight Y grob)
                (for-each
                  (lambda (entry)
                    (ly:grob-set-property! highlight
                                           (car entry)
                                           (cdr entry)))
                  (ly:grob-property grob 'highlight-details))))
            grobs)
          (set! grobs '())))))

\layout {
  \context {
    \Global
    \grobdescriptions #all-grob-descriptions
  }
  \context {
    \Score
    \consists #Grob_highlight_engraver
  }
}

\new Staff \with {
  \override Clef.highlight-me = ##t
  \override Clef.highlight-details.blot = 1
  \override Clef.highlight-details.color = "lightblue"
  \override Clef.highlight-details.X-padding = 0.2
  \override Clef.highlight-details.Y-padding = 1
}
\relative {
  c'4 d
  \tweak Accidental.highlight-me ##t \tweak Accidental.highlight-details.color "red"
  es fis
  \break
  g a
} 

Attachment: marker.pdf
Description: Adobe PDF document

Reply via email to