[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
Re: Accessing a grob from within a music function, Thomas Morley, 2017/03/16