lilypond-user
[Top][All Lists]
Advanced

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

Re: Color tweaks (edition engraver)


From: David Nalesnik
Subject: Re: Color tweaks (edition engraver)
Date: Mon, 27 Apr 2015 16:14:22 -0500



On Mon, Apr 27, 2015 at 12:16 PM, David Nalesnik <address@hidden> wrote:


On Mon, Apr 27, 2015 at 12:12 PM, David Nalesnik <address@hidden> wrote:

Here's a code snippet to show that it is possible to tell if a grob has been altered.  Right now you have to add the procedure for each grob you want to examine.



The following covers all changed grobs.  Thanks, Urs, for your posting at http://lilypondblog.org/2014/04/music-functions-4-recursion/ -- I adapted one of your functions there to apply the override to all objects with a stencil property.  (Rather than using a long string of laboriously typed overrides.)

--DN

%%%%%%%%%%%%


\version "2.19.17"

#(define (grobs-with-stencils)
   (let loop ((all all-grob-descriptions) (result '()))
     (if (null? all)
         result
         (if (assoc-get 'stencil (cdar all))
             (loop (cdr all) (cons (caar all) result))
             (loop (cdr all) result)))))

#(define (mark-tweak grob)
   (let* ((default (assoc-get (grob::name grob) all-grob-descriptions))
          (default-after-line (assoc-get 'after-line-breaking default))
          (props (ly:grob-basic-properties grob))
          ;; Our procedure has been added to the head of grob's basic
          ;; properties.  Let's not count it as a tweak!
          (props
           (remove
            (lambda (p)
              (and (procedure? (cdr p))
                   (eq? (procedure-name (cdr p)) 'mark-tweak)))
            props))
          (diff (lset-difference eq? props default)))
     ;; Tweaks will not appear in the "basic properties" alist of our grob, but
     ;; we can find them through the music event which led to the grob.  This
     ;; is available through the stream-event which caused our grob.
     (if (null? diff)
         (let* ((cause (event-cause grob))
                (tweaks (and cause
                             (ly:music-property
                              (ly:event-property cause 'music-cause)
                              'tweaks))))
           (if (pair? tweaks)
               (set! (ly:grob-property grob 'color) red)))
         (set! (ly:grob-property grob 'color) green))
     
     ;; Return any default setting of after-line-breaking.
     (or default-after-line '())))


markAllAlteredGrobs =
#(define-music-function (parser location) ()
   (let loop ((grobs (grobs-with-stencils)))
     (if (null? grobs)
         #{ #}
         #{
           \override #(list 'Score (car grobs) 'after-line-breaking) = #mark-tweak
           #(loop (cdr grobs))
         #})))

{
  \markAllAlteredGrobs
  c'
  \once \override NoteHead.font-size = 3
  c'
  c'
  \tweak font-size 3 c'
  c'
  %\override Slur.after-line-breaking = #mark-tweak
  c'( e')
  \shape #'((0 . 0) (0 . -0.5) (0 . -0.5) (0 . 0)) Slur
  c'( e')
  c'( e')
  c'-\tweak Slur.positions #'(-5 . -5) ( e')
  \override Hairpin.color = #blue
  c'\< e'\!
  <c' e'>\arpeggio
  \once \override Staff.Arpeggio.positions = #'(-6 . 6)
  <c' e'>\arpeggio
  
}
 

reply via email to

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