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: Stefano Troncaro
Subject: Re: Put the property of a grob in the output-attributes list
Date: Mon, 23 Dec 2019 04:37:53 -0300

Hi Paolo, I'm glad you found it useful! Could you give me an example of what you want to do with TextScripts? Besides giving them an id, what properties do you need stored in the svg output attributes?

El dom., 22 dic. 2019 a las 14:04, Paolo Prete (<address@hidden>) escribió:
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]