Hi Graham,

On Wed, Jan 7, 2015 at 7:54 PM, Graham King <[email protected]> wrote:

>  Many thanks David,
> almost there...
>
> On Wed, 2015-01-07 at 18:09 -0600, David Nalesnik wrote:
>
> Hi Graham,
>
>
>  On Wed, Jan 7, 2015 at 4:39 PM, Graham King <[email protected]>
> wrote:
>
>  I'm trying to replace a note with one of two special glyphs, depending
> on the note's position on the stave:  if on the third line or above, stem
> down, otherwise stem up.  Is it possible to extend the following code to
> detect automatically (and independently of clef or transposition) which
> glyph should be chosen?
>
>
>
>  Sure--try this:
>
>
> Merged into my original example, to illustrate a problem:
>
> \version "2.19.5"
>
> #(define ((note-head-musicglyph name) grob)
> (grob-interpret-markup grob (make-musicglyph-markup name)))
>
> \score {
>     \shiftDurations #-1 #0 {
>         \relative c' {
>             \time 4/2
>             c c c c
>             \once \override NoteHead #'stencil =
>                 #(lambda (grob)
>                    (let ((pos (ly:grob-property grob 'staff-position)))
>                      (if (>= pos 0)
>                          (note-head-musicglyph "noteheads.dM2mensural")
>                          (note-head-musicglyph "noteheads.uM2mensural"))))
>             c1 }}}
>
> This works beautifully, except when the note is on a ledger line above or
> below the stave, in which case the ledger line is lost and horizontal
> spacing goes haywire.
>

Sure does!  The problem is how the note-head-musicglyph function is called
within the stencil override, and I should have caught that.  You need to
pass the grob in the function call.

Retaining your definition as it is:


 #(define ((note-head-musicglyph name) grob)
   (grob-interpret-markup grob (make-musicglyph-markup name)))

\score {
  \shiftDurations #-1 #0 {
    \relative c' {
      \time 4/2
      c c c c
      \once \override NoteHead #'stencil =
      #(lambda (grob)
         (let ((pos (ly:grob-property grob 'staff-position)))
           (if (>= pos 0)
               ((note-head-musicglyph "noteheads.dM2mensural") grob)
               ((note-head-musicglyph "noteheads.uM2mensural") grob))))
      c1 c' c'' }}}

%%%

You can simplify your definition of note-head-musicglyph:


#(define (note-head-musicglyph name grob)
   (grob-interpret-markup grob (make-musicglyph-markup name)))

\score {
  \shiftDurations #-1 #0 {
    \relative c' {
      \time 4/2
      c c c c
      \once \override NoteHead #'stencil =
      #(lambda (grob)
         (let ((pos (ly:grob-property grob 'staff-position)))
           (if (>= pos 0)
               (note-head-musicglyph "noteheads.dM2mensural" grob)
               (note-head-musicglyph "noteheads.uM2mensural" grob))))
      c1 c' c'' }}}


Best,
David
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to