Hi Stefano, 1) I need to store in the output-attributes the "direction" of the TextScript (it says if the object is above or below the staff) I can obtain this info with map-some-music() [ by looking at (ly:music-property evt 'direction) ]. But in this way I need to set the direction in the music expression.
\token f^\markup {'foobar'} Instead, I want to obtain this info also when it's not set by the me in the music expression, and it's calculated by Lilypond: \token f\markup {'foobar'} 2) I need to obtain the absolute and relative coordinates calculated by Lilypond for the same TextScript. Point 1) is very important, because I don't have this info in the svg output. About the coordinates: I can calculate them by parsing the svg file, as I did for beams and slurs. But it would be better if I obtain them automatically by Lilypond and pass them to the SVG Javascript script. Thanks again! Best P On Mon, Dec 23, 2019 at 8:38 AM Stefano Troncaro <stefanotronc...@gmail.com> wrote: > 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 (<paolopr...@gmail.com>) > 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 < >> stefanotronc...@gmail.com> 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 (<paolopr...@gmail.com>) >>> 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 } >>>> >>>