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: Fri, 1 May 2015 19:56:09 -0500

Hi Jim,

On Mon, Apr 27, 2015 at 3:55 PM, Jim Long <address@hidden> wrote:
On Mon, Apr 27, 2015 at 04:44:52PM +0200, Urs Liska wrote:
>
> What we have in Frescobaldi depends on what we can "catch" by either
> listening through engravers or by redefining command. So far I haven't
> found a notion of a grob knowing if it has been tweaked or not.

As a Scheme/Lilypond novice sitting on the sidelines, I have a
difficult time judging whether my comments are obvious, stupid,
trival, useless, impractical, or some exquisite combination of all
five, but ....  (oh, and there's "poorly thought-out")

Not at all !
 

If the grob doesn't know whether it's been tweaked, then perhaps
\tweak could do it? 

Of course, if a grob could know that it's been tweaked--info stored in a new property 'tweaked--then it would be a simple matter harvesting them.
 
Or, perhaps one could create a wrapper directive
\ctweak which invokes \tweak to perform the specific tweak that was
requested, and then \ctweak could also color the grob that got
tweaked?  Having to change one's code from tweak to ctweak and back
may be less than ideal.  Perhaps a global variable (ugh) could be
used by \ctweak, defaulting to black, so that by default \tweak
and \ctweak are equivalent, except that a user of \ctweak could
alter the global color variable to something other than black,
resulting in all the \ctweaks appearing in that color.

Sure you could do something like this sketch which handles [\once] \override and \revert:
:
\version "2.19"

override-color = #red

show-colors = ##t

coverride =
#(define-music-function (parser location arg value)
   (symbol-list-or-symbol? scheme?)
   (if show-colors
       (let* ((path-len (length arg))
              (context (if (= path-len 3) (car arg) '()))
              (grob (if (null? context) (car arg) (cadr arg)))
              (color-path (if (null? context)
                              (list grob 'color)
                              (list context grob 'color))))
         #{
           \override #color-path = #override-color
           \override #arg = #value
         #})
       #{ #}))

crevert =
#(define-music-function (parser location arg)
   (symbol-list-or-symbol?)
   (if show-colors
       (let* ((path-len (length arg))
              (context (if (= path-len 3) (car arg) '()))
              (grob (if (null? context) (car arg) (cadr arg)))
              (color-path (if (null? context)
                              (list grob 'color)
                              (list context grob 'color))))
         #{
           \revert #color-path
           \revert #arg
         #})
       #{ #}))

{
  \coverride Stem.thickness 3
  c''
  \crevert Stem.thickness
  c''
  \once \coverride Stem.thickness 5
  c'
  c'
}

(
There's a more sophisticated way to go about getting a grob's "property path" and checking its validity.)

I can't think offhand how to extend this to support users who use
a color other than black as the base color for engraved grobs, or
for how to show tweaked grobs which already use \ctweak's global
tweak color.  But if \tweak is defined in terms of Scheme/Guile
code (I'm ignorant on that point), perhaps a Scheme guru can
write a first-order approximation of \ctweak that could be
included in any project's source code where it is desired.

A deeper change might be to add a property to all grobs that
contains a tweak-count, initialized to 0.  \tweak would increment
the count of each grob it touches, and then the grobs would know
whether they've been tweaked or not.  Pretty sure this is the
"obvious" option in paragraph 1.

Sure, or store the property path of the tweak instead of a simple count.

David


reply via email to

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