lilypond-user
[Top][All Lists]
Advanced

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

Re: Put the property of a grob in the output-attributes list


From: Paolo Prete
Subject: Re: Put the property of a grob in the output-attributes list
Date: Sun, 22 Dec 2019 18:04:02 +0100

Thank you again Stefano. This helps again and you will see how good it will fit in the library I'm coding.
However, I can't make it work for a TextScript (either before the notevent or before the markup token). I tried also map-some-music(), but it doesn't fix it.

\version "2.19.83"

token = #(let* ((ctr 0)
                (ctr! (lambda ()
                        (set! ctr (1+ ctr))
                        ctr)))
   (define-music-function (mus) (ly:music?)
     (let* ((id (format #f "foobar_~a" (ctr!)))
            (type (ly:music-property mus 'name))
            (mexp (case type
                    ((BeamEvent NoteEvent TextScriptEvent )
                      #{ \tweak TextScript.after-line-breaking #(lambda (grob)
                           (let* ((outprop (ly:grob-property grob 'direction))
                                  (prop (ly:grob-property grob 'direction))
                                  (outprop (append outprop `((beam-thickness . ,prop)))))
                             (display (format #f "\n****\n~a\n****\n" prop))
                             (ly:grob-set-property! grob 'output-attributes outprop)))
                         \tweak TextScript.output-attributes.id #id #mus #} )
                    (else #{ \tweak output-attributes.id #id #mus #} ))))
       mexp)))

\relative {  c'4 d8-\token [ e ] \token f^\markup {'iii'} g c,4  }

On Sun, Dec 22, 2019 at 4:21 PM Stefano Troncaro <address@hidden> wrote:
Hi Paolo,

The main problem here is that \tweak can only modify the object that is next to it, so you can tweak a NoteHead to modify an automatic beam, but to modify a beam that is created manually because of a [ in the input you need to place the tweak before the [. See:

%%%%%%%%%%%%%%%%%
\version "2.19.83"

\relative {
  c'8[ \tweak Beam.color #red d]   %doesn't work
  \tweak Beam.color #red e f       %works
  \tweak Beam.color #red g[ a]     %doesn't work
  b -\tweak Beam.color #red [ c ]  %works
}

%%%%%%%%%%%%%%%%%

That said, I modified the function you sent so that it also considerds NoteEvents and modifies the automatically created beams with the desired properties:

%%%%%%%%%%%%%%%%%
\version "2.19.83"

token = #(let* ((ctr 0)
                (ctr! (lambda ()
                        (set! ctr (1+ ctr))
                        ctr)))
   (define-music-function (mus) (ly:music?)
     (let* ((id (format #f "foobar_~a" (ctr!)))
            (type (ly:music-property mus 'name))
            (mexp (case type
                    ((BeamEvent NoteEvent)
                      #{ \tweak Beam.after-line-breaking #(lambda (grob)
                           (let* ((outprop (ly:grob-property grob 'output-attributes))
                                  (beam-thickness (ly:grob-property grob 'beam-thickness))
                                  (outprop (append outprop `((beam-thickness . ,beam-thickness)))))
                             ;(display (format #f "\n****\n~a\n****\n" beam-thickness))
                             (ly:grob-set-property! grob 'output-attributes outprop)))
                         \tweak Beam.output-attributes.id #id #mus #} )
                    (else #{ \tweak output-attributes.id #id #mus #} ))))
       mexp)))

\relative { c'4 d8-\token [ e ] \token f g c,4 }

%%%%%%%%%%%%%%%%%

The code could be cleaner I think, I'll try to improve it if I get some free time. Meanwhile I hope this helps

El dom., 22 dic. 2019 a las 7:58, Paolo Prete (<address@hidden>) escribió:
Hello all.

the following function (thanks to Stefano!) inserts the beam-thickness property of a Beam in the list of output-attributes of the corresponding SVG item. It does its job if I place the function soon before a beam symbol "[".  But it doesn't work (no errors, but the output-attributes property is not set) if  place it before a notename. How can I fix that? Should I map-some-music() and iterate until I find the BeamEvent? I tried that too, but without success.
Thanks.

token = #(let* ((ctr 0)
                (ctr! (lambda ()
                        (set! ctr (1+ ctr))
                        ctr)))
   (define-music-function (mus) (ly:music?)
     (let* ((id (format #f "foobar_~a" (ctr!)))
            (mexp #{ \tweak output-attributes.id #id #mus #} )
            (type (ly:music-property mus 'name))
            (mexp (case type
                    ('BeamEvent
                      #{ \tweak Beam.after-line-breaking #(lambda (grob)
                           (let* ((outprop (ly:grob-property grob 'output-attributes))
                                  (beam-thickness (ly:grob-property grob 'beam-thickness))
                                  (outprop (append outprop `((beam-thickness . ,beam-thickness)))))
                             (begin
                                  (ly:grob-set-property! grob 'output-attributes outprop)
                                  (display "\n****\n")
                                  (display beam-thickness)
                                  (display "\n****\n"))))
                      #mexp #} )
                    (else mexp))))
       mexp)))

\relative { c'4 d8-\token [ e ] \token f[ g ] c,4 }

reply via email to

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