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 23:24:46 +0200

2012/9/26 Thomas Morley <address@hidden>:
> 2012/9/26 Thomas Morley <address@hidden>:
>> 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"

% Copy-and-paste-error! Please add:
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
>> }
>>
>> #(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))))
>>

% Another copy/paste-error
% please use:

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)))

%
>>
>> \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



reply via email to

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