lilypond-user
[Top][All Lists]
Advanced

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

Re: Accessing a grob from within a music function


From: Urs Liska
Subject: Re: Accessing a grob from within a music function
Date: Thu, 16 Mar 2017 15:29:43 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.6.0


Am 16.03.2017 um 14:55 schrieb David Nalesnik:
> Urs,
>
> On Thu, Mar 16, 2017 at 8:47 AM, Urs Liska <address@hidden> wrote:
>> Hi David,
>>
>>
>> Am 16.03.2017 um 14:40 schrieb David Nalesnik:
>>> Hi Urs,
>>>
>>> On Thu, Mar 16, 2017 at 8:23 AM, Urs Liska <address@hidden> wrote:
>>>> Hi,
>>>>
>>>> I'm trying to write a function to push a note column like this:
>>>>
>>>> pushLeftBroken =
>>>> #(define-music-function ()()
>>>>    #{
>>>>      \once \override NoteColumn.X-offset = 3
>>>>    #})
>>>>
>>>> But I need to make that "3" depend on some characteristics of the actual
>>>> note column. Basically I need the width of the note column, including
>>>> attached accidentals.
>>>>
>>>> I know how to get to the accidental(s) within a note column, but if I'm
>>>> not mistaken there's no actual grob inside that.
>>>>
>>>> Probably music-function isn't the right approach?
>>>>
>>>> What I need is a way to say something like
>>>>
>>>> \once \override NoteColumn.X-offset = #(+ 3
>>>> extent-of-all-accidentals-in-the-note-column)
>>>>
>>> In the majority of cases you can follow a trail of pointers.  From the
>>> NoteColumn, you can get noteheads or AccidentalPlacement, from
>>> noteheads you can get to accidentals.
>>> \version "2.19.56"
>>>
>>> {
>>>   \override NoteColumn.X-offset =
>>>   #(lambda (nc)
>>>      (let ((notes (ly:grob-array->list (ly:grob-object nc 'note-heads))))
>>>        (pretty-print (grob::all-objects nc))
>>>        (pretty-print (grob::all-objects (car notes)))))
>>>   <cis'' dis'' fis'' gis''>1
>>> }
>>>
>>> I presume that travelling up the chain of parentage -- to a
>>> PaperColumn -- would get you more grobs ('elements object property).
>>>
>>> -David
>> Thank you, this will give me all I need.

Unfortunately I have to take that back.
Usually (when writing the stencil callback) I can access the horizontal
position of elements (to determine their distances) with
ly:grob-relative-coordinate and ly:grob-system.
But in this function (ly:grob-system nc) returns an empty list, which
probably means that I'm too early to access that property yet.

What I need is a way to push the notecolumn to the right by a fixed
amount *plus* the horizontal extent of the accidentals. The problem is
that if I simply push by the fixed amount it seems not to actually use
that. Obviously first the override pushes and then the accidentals
themselves push even further (see attachment):

\version "2.19.54"

{
  <cis'' dis'' eis'' fis''>
}
{
  \once \override NoteColumn.X-offset = 7
  <cis'' dis'' eis'' fis''>
}
{
  \once \override NoteColumn.X-offset = 10
  <cis'' dis'' eis'' fis''>
}

But as you can see in the image I need the empty space to have a fixed
amount, and so I'd need to figure out the value (+ fixed-amount
accidentals-width).

>> But could you please clarify (in more general terms):
>>
>> Usually (as in my example) I'd override X-offset with a literal number.
>> You override it with a function.
>> Does that mean that whenever I override a property of a grob with a
>> callback function it will be the grob that is passed to that function?
> Yes, exactly.
>
>> Well, now that I think of it this is what I'm doing with the stencil
>> override all along. Where can I read more about this?
>>
> There isn't much.  This is all I can think of:
>
> http://lilypond.org/doc/v2.19/Documentation/extending/callback-functions

OK, I admit this says exactly what is needed ...

Urs

>
> -David

-- 
address@hidden
https://openlilylib.org
http://lilypondblog.org

Attachment: document.png
Description: PNG image


reply via email to

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