Hi Stefano,

your suggestion produces the script for every page, but it requires to
manually add a property in the \paper scope. Instead, I would like to
automatically set this property, and leave the user to set all the score
properties (including the paper's one) without messing up the code adding
pieces of the template of the script. So to obtain something like (which is
much cleaner):

\include "JSSVGSlurTuner.ly"

{

     \addJSSVGSlurTuner

     ..... my score .....

}

Thanks for your help
P


On Sat, Dec 14, 2019 at 11:13 PM Stefano Troncaro <stefanotronc...@gmail.com>
wrote:

> Hi Paolo,
>
> Since Aaron's svg-script function creates an empty \markup, you can use
> the properties oddFooterMarkup and evenFooterMarkup of the \paper block to
> have your script embedded at the end of every page. Look:
>
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> \version "2.19.83"
>
> svg-script = #(define-scheme-function (body) (string?)
>    (markup #:stencil (ly:make-stencil (list 'embedded-svg
>      (string-join (list "<script type=\"text/javascript\"><![CDATA["
>        body "]]></script>") "\n")) '(0 . 0) '(0 . 0))))
>
> script-for-every-page = \svg-script
> #"var flat = document.getElementById('flat');
>    flat.style.color = 'red';
>    function spin(what, amount) {
>      let angle = 0.0;
>      return function () {
>        const bbox = what.getBBox();
>        const xform = ['rotate(',
>          (angle = (angle + amount) % 360.0),
>          bbox.x + 0.5 * bbox.width,
>          bbox.y + 0.75 * bbox.height, ')'];
>        what.setAttribute('transform', xform.join(' '));
>      }
>    }
>    setInterval(spin(flat, 5), 100);"
>
> \paper {
>   oddFooterMarkup = \script-for-every-page
>   evenFooterMarkup = \script-for-every-page
> }
>
> { g'4 a' \tweak Accidental.output-attributes #'((id . "flat")) bes'2
> \pageBreak
>   g'4 a' \tweak Accidental.output-attributes #'((id . "flat")) bes'2 }
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>
> Love what your script is doing so far!
>
> Hope that helps,
> Stefano
>
> El sáb., 14 dic. 2019 a las 18:39, Paolo Prete (<paolopr...@gmail.com>)
> escribió:
>
>> Thanks Aaron, it did the trick.
>>
>> However, how can I make it work for multiple pages output?
>>
>> On Sat, Dec 14, 2019 at 4:26 AM Aaron Hill <lilyp...@hillvisions.com>
>> wrote:
>>
>>> On 2019-12-13 5:59 pm, Paolo Pr wrote:
>>> > First of all, I need to add with Lilypond a <script>  tag to the svg
>>> > file
>>> > just before the ending </svg> tag  in the following way:
>>> >
>>> > 1)
>>> > ....
>>> >  <script xlink:href="lilyEasySlurs.js"></script>
>>> > </svg>
>>> >
>>> > OR in the following way:
>>> >
>>> > 2)
>>> > ....
>>> > <script>
>>> > <![CDATA[
>>> >     ...javascript code...
>>> > ]]>
>>> > </script>
>>> > </svg>
>>>
>>> Well, one could use (abuse?) the embedded-svg stencil command:
>>>
>>> %%%%
>>> \version "2.19.83"
>>>
>>> svg-script = #(define-scheme-function (body) (string?)
>>>    (markup #:stencil (ly:make-stencil (list 'embedded-svg
>>>      (string-join (list "<script type=\"text/javascript\"><![CDATA["
>>>        body "]]></script>") "\n")) '(0 . 0) '(0 . 0))))
>>>
>>> { g'4 a' \tweak Accidental.output-attributes #'((id . "flat")) bes'2 }
>>>
>>> \svg-script
>>> #"var flat = document.getElementById('flat');
>>>    flat.style.color = 'red';
>>>    function spin(what, amount) {
>>>      let angle = 0.0;
>>>      return function () {
>>>        const bbox = what.getBBox();
>>>        const xform = ['rotate(',
>>>          (angle = (angle + amount) % 360.0),
>>>          bbox.x + 0.5 * bbox.width,
>>>          bbox.y + 0.75 * bbox.height, ')'];
>>>        what.setAttribute('transform', xform.join(' '));
>>>      }
>>>    }
>>>    setInterval(spin(flat, 5), 100);"
>>> %%%%
>>>
>>> This adds a top-level \markup that contains a stencil to instruct
>>> output-svg.scm to write the specified string to the output.
>>>
>>>
>>> -- Aaron Hill
>>>
>>>

Reply via email to