lilypond-user
[Top][All Lists]
Advanced

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

Re: Replacing the r1 glyph


From: Thomas Morley
Subject: Re: Replacing the r1 glyph
Date: Wed, 26 Sep 2012 22:53:04 +0200

2012/9/26 Oscar Dub <address@hidden>
>
> Thanks to both!
>
> Janek, your information about accessing the internals of Feta and LilyPond
> is very useful. As there's no way to add .mf syntax to a LilyPond file (as
> far as I know), I'm going to try to follow along Marc's lines. It would be
> great to solve the problem without hacking LilyPond's source, but it's good
> to know nonetheless.
>
> On 26 Sep 2012, at 09:44, Marc Hohl <address@hidden> wrote:
>
> […] create a markup that looks like the shape.
>
> Once you managed this, you can write a callback for Rest #'stencil that
> checks for the duration
> of the rest, applies your markup if it is 1 and calls ly:rest::print
> otherwise.
>
>
> I've managed to implement both separate parts.
>
> My markup looks like this:
> \markup
> {
>   \combine
>   \musicglyph #"scripts.ufermata"
>   \translate #'(-0.01 . 0.19)
>   \with-color #(x11-color 'white)
>   \draw-circle #0.28 #0 ##t
> }
>
> The output is attached.
> For the scheme function to place in the override, I have cannibalised this
> snippet (http://lsr.dsi.unimi.it/LSR/Item?id=548) to make a basic outline:
>
> #(define (ly:rest-interface::kurtag-rests grob)
>   (let ((duration (ly:grob-property grob 'duration-log))))
>   (if (= duration 0)
>    ( %{ markup function goes HERE %} )
>    (ly:rest::print grob) % else print normal grob
>  ))
>
> With the plan being to call this code in via:
> \override Rest #'stencil = #ly:rest-interface::kurtag-rests
>
> My problem now is combining the two stages. I'm not sure how to render the
> markup in scheme at the position shown in the code.
>
> Thanks again,
>
> Oscar
>
> _______________________________________________
> lilypond-user mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/lilypond-user
>

Hi Oscar,

you're very close.

Step by step:

1.------------------------------------------

Your definition is wrong with some brackets:

#(define (ly:rest-interface::kurtag-rests grob)
  (let ((duration (ly:grob-property grob 'duration-log))))  ;one
closing-bracket too much
  (if (= duration 0)
   ( %{ markup function goes HERE %} )
   (ly:rest::print grob) % else print normal grob
 )) %the closing-bracket should go here

Please note that scheme is be commented by using the ;-sign

2.------------------------------------------
a)
You want to define a new stencil using a _markup_. So you have to
convert the markup into a stencil via
(grob-interpret-markup grob <what-ever-markup>)
Btw, I would store the markup in a variable.
b)
You want to _use_ this stencil. So you have to set the 'stencil-property via:
(ly:grob-set-property! grob 'stencil (grob-interpret-markup grob
<what-ever-markup>))

3.------------------------------------------
All together:

\version "2.16.0"

mrkp =
\markup
{
  \combine
  \musicglyph #"scripts.ufermata"
  \translate #'(-0.01 . 0.19)
  \with-color #(x11-color 'white)
  \draw-circle #0.28 #0 ##t
}

#(define (ly:rest-interface::kurtag-rests grob)
  (let ((duration (ly:grob-property grob 'duration-log)))
  (if (= duration 0)
    (ly:grob-set-property! grob 'stencil (grob-interpret-markup grob mrkp))
    ; else print normal grob
    (ly:rest::print grob))))

%--- test

\relative c' {
        c1 r r r
        d4 r4 r8 r r16 r8.
}
\layout {
        \context {
                \Voice
                \override Rest #'stencil = #ly:rest-interface::kurtag-rests
        }
}

4. ------------------------------------------

Regarding the result: not so nice as expected, because of the
white-out on staff-lines.

This problems could be fixed. But instead of fixing a problem that has
its origin in your initial markup-design.
Let's try another markup-construct.

5. ------------------------------------------

I used a markup defined via \path
(you may want change/improve it, I'm not very familiar with postscript commands)
and scaled it a bit.

myPath = #'((curveto  0 0 0.8 0.8 1.6 0))

mrkp =
\markup {
        \scale #'(0.9 . 2.2)
        \override #'(line-cap-style . round)
        \path #0.1 #myPath
}

Also I added a definition to correct/adjust the staff-position:

correctStaffPosition =
\override Rest #'after-line-breaking =
  #(lambda (grob)
    (let ((staff-pos (ly:grob-property grob 'staff-position 0))
          (duration (ly:grob-property grob 'duration-log)))
    (if (= duration 0)
      (ly:grob-set-property! grob 'staff-position (- staff-pos 2.2 ))
      staff-pos)))

6. ------------------------------------------

All together (png attached)

\version "2.16.0"

mrkp =
\markup {
        \scale #'(0.9 . 2.2)
        \override #'(line-cap-style . round)
        \path #0.1 #myPath
}

#(define (ly:rest-interface::kurtag-rests grob)
  (let ((duration (ly:grob-property grob 'duration-log)))
  (if (= duration 0)
    (ly:grob-set-property! grob 'stencil (grob-interpret-markup grob mrkp))
    ; else print normal grob
    (ly:rest::print grob))))

correctStaffPosition =
\override Rest #'after-line-breaking =
  #(lambda (grob)
    (let ((staff-pos (ly:grob-property grob 'staff-position 0)))
    (ly:grob-set-property! grob 'staff-position (- staff-pos 2.2 ))))

\score {
  \new Staff
  \relative c' {
          c1 r r r
          d4 r4 r8 r r16 r8.
  }
  \layout {
          \context {
                  \Voice
                  \override Rest #'stencil = #ly:rest-interface::kurtag-rests
                  \correctStaffPosition
          }
  }
}

7. ------------------------------------------

Limitation:

All above will work for whole rests, but not for a MultiMeasureRest.
MultiMeasureRests are spanner, a stencil-override would be more complex.


HTH,
  Harm

Attachment: atest-15.png
Description: PNG image


reply via email to

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