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: David Nalesnik
Subject: Re: Accessing a grob from within a music function
Date: Thu, 16 Mar 2017 09:50:16 -0500

On Thu, Mar 16, 2017 at 9:29 AM, Urs Liska <address@hidden> wrote:
>
>
> 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.

ly:grob-system returns System grobs after line-breaking has occurred.

Try this:

#(define get-system
   (lambda (grob)
     (cond
      ((not (ly:grob? grob)) '())
      ((grob::has-interface grob 'system-interface) grob)
      (else (get-system (ly:grob-parent grob Y))))))

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

I don't think I understand.

What I see is that X-offset must reach a certain threshold to show a
noticeable result, after which there clearly aren't dual pushes.  (The
last line has accidentals and note column 3 ss to the right of the
second.)
>
> \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).

Wait, you don't want the accidentals to follow the note column?

Sorry for my obtuseness.

-David



reply via email to

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