lilypond-user
[Top][All Lists]
Advanced

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

Re: Determining Fingering digit?


From: Neil Puttock
Subject: Re: Determining Fingering digit?
Date: Tue, 15 Jul 2008 23:02:41 +0100

Hi Eric,

2008/7/15 Eric Knapp <address@hidden>:

> In this line:
>
>    (sp (ly:grob-property grob 'staff-position))
>
> The staff position of the note is assigned to the variable sp. How
> could I get the fingering digit of the note? For example:
>
>  c''-3
>
> I want to programmatically get the "3" as a number or text.

You need to find the interface which is associated with fingerings.

Following the paper trail in the docs from NR
(http://kainhofer.com/~lilypond/Documentation/user/lilypond/Fingering-instructions.html#Fingering-instructions)
to IR 
(http://kainhofer.com/~lilypond/Documentation/user/lilypond-internals/Fingering.html#Fingering),
you'll see a list of interfaces at the bottom of the page. The
important one is finger-interface.

The fingerings are stored in the 'text property as a string, so you
can read the string, convert it to a number then use case to
conditionally set arbitrary markup for each fingering.

Here's a quick example which changes the fingerings to roman numerals:

#(define (finger-text grob grob-origin context)
   (let* ((ifs (ly:grob-interfaces grob))
    (text (ly:grob-property grob 'text)))
     (if (memq 'finger-interface ifs)
   (begin
     (ly:grob-set-property! grob 'stencil ly:text-interface::print)
     (ly:grob-set-property! grob 'text
          (make-tiny-markup (make-text-markup
                 (case (string->number text)
                   ((5) "v")
                   ((4) "iv")
                   ((3) "iii")
                   ((2) "ii")
                   (else "i"))))
          )))))

\relative c' {
  \applyOutput #'Voice #finger-text
  <c-1 e-2 g-3 c-5>2
}

In the markup, you'll notice I've used make-text-markup: since the
default font for fingerings only has a few letters, this changes it
back to the normal text style.

> Also, the \applyOutput command only seems to run once.

I think that's a known limitation of \applyOutput.

As an alternative, you could override the default stencil for
fingerings, which will then work whenever a fingering is encountered:

\relative c' {
  \override  Fingering #'stencil = #(lambda (grob)
    (let* ((text (ly:grob-property grob 'text)))

      ly:text-interface::print (grob-interpret-markup grob
        (make-tiny-markup (make-text-markup
          (case (string->number text)
            ((5) "five")
            ((4) "four")
            ((3) "three")
            ((2) "two")
            (else "thumb"))
          )))))

  <c-1 e-2 g-3 c-5>
  <d-4>
}

Regards,
Neil




reply via email to

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