On Thu, 2009-07-16 at 23:06 -0700, Mark Polesky wrote: > Joe Neeman wrote: > > > Is there a way to change the clef from within a grob callback? > > > > Not really. You can change the clef's glyph, but you can't really change > > the clef's influence on the following notes. > > I presume you mean I can change the clef stencil, or do you mean that > it's possible to change the clefGlyph context property? If that were > the case, then couldn't I change clefPosition and middleCPosition and > do it that way?
I mean that you can change the clef stencil. Context properties are used when creating grobs, but they disappear before any grob callback is likely to be called. > > > ...Reason being, the NoteHead > > grobs are created around the same time as the Clef grob and their > > positions are fixed at that time, so unless you want to somehow iterate > > over and modify all the NoteHeads, it isn't really going to work. > > > > I'd suggest a music function rather than a grob override. > > How? I was using a music function before, but I couldn't find a way to > get NoteHead staff-positions without a callback. And I get stuck with a > music-function because I don't know how to test if I'm in a \relative > block or not. > > I guess the algorithmic idea would be: > > *Before* staff-positions are concretely determined... > 1. what would the staff-positions be if we stayed in this clef? > 2. if they're within this clef's "staff-range", do nothing. > 3. if another clef is better (according to user), change the clef. > 4. determine actual staff-positions with the updated clef info. > > I just don't know how to catch the process before the staff-positions > are determined, if all I have is a context and a EventChord. I thought > that if I could at least know whether I'm in a \relative block, I could > then look at the current clef, and figure it out the long way (not that > I'd want to). But I imagine there must be an easier way in. And I can't > test for \relative-ness as far as I can tell anyway. > > Do you have any other (slightly more specific) suggestions? (: I don't know how to deal with \relative, but it's easy to calculate the staff-position of an absolute note in a music function: (+ (ly:pitch-steps pitch-of-the-note) middle-C-position) If you look at note-heads-engraver.cc, you'll see that the "staff-position" property is set there using the pitch of the NoteEvent and the middleCPosition property. So you step 4 of your algorithm above will be handled by note-heads-engraver, but only if you can figure out the new clef using only the context and the EventChord. Perhaps a music function guru can help out with the relative problem? Joe _______________________________________________ lilypond-devel mailing list lilypond-devel@gnu.org http://lists.gnu.org/mailman/listinfo/lilypond-devel