Hi,
thank you for all the comments, I'll make these corrections!

Best regards

Il mar 10 gen 2023, 12:28 Jean Abou Samra <[email protected]> ha scritto:

> Le 10/01/2023 à 08:12, Rip _Mus a écrit :
> > Hello,
> > I'm trying to define a new articulation, based on two stencils (above
> > and below the staff), that I wrote.
> > I succeeded in making two distinct articulations. However, the attempt
> > to create a single articulation, which chooses the stencil based on
> > the direction specified in the post-event, failed.
> > Does anyone have any advice for me?
>
>
>
> In the script definition, you put
>
>             (stencil . (lAccUpStencil . lAccDownStencil))
>
> which is ignored because a pair is not a valid stencil value.
> (Also, you forgot unquotes, so it's a pair of symbols, not
> a pair of stencils.)
>
> Instead, try using a callback:
>
>             (stencil . ,lAccStencil)
>
> after having defined
>
> #(define (lAccStencil grob)
>     (if (eqv? UP (ly:grob-property grob 'direction))
>         lAccUpStencil
>         lAccDownStencil))
>
>
> Another comment: do not do this
>
> #(append! default-script-alist (list ...))
>
> because
>
> - it mutates the built-in default, so even if you put the scriptDefinitions
>    change in a \layout local to a \score, it will affect all scores.
>
> - whether append! actually modifies the original list is not specified.
>    Example:
>
>
> $ ~/lilies/2.24.0/bin/lilypond scheme-sandbox
> GNU LilyPond 2.24.0 (running Guile 2.2)
> Traitement de
> « /home/jean/lilies/2.24.0/share/lilypond/2.24.0/ly/scheme-sandbox.ly »
> Analyse...
> GNU Guile 2.2.7
> Copyright (C) 1995-2019 Free Software Foundation, Inc.
>
> Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
> This program is free software, and you are welcome to redistribute it
> under certain conditions; type `,show c' for details.
>
> Enter `,help' for help.
> scheme@(#{ g100}#)> (define lst (list 'a 'b 'c))
> scheme@(#{ g100}#)> (append! lst '(d e f))
> $1 = (a b c d e f)
> scheme@(#{ g100}#)> lst
> $2 = (a b c d e f)
> scheme@(#{ g100}#)> (define lst2 (list))
> scheme@(#{ g100}#)> (append! lst2 '(d e f))
> $3 = (d e f)
> scheme@(#{ g100}#)> lst2 ;; still empty
> $4 = ()
>
>
> Instead, you should save the result in a variable. Also, do not
> use the mutating append! but the non-mutating append. Even better,
> it's more efficient in Scheme to add things at the beginning
> of a list rather than at the end [1], so make that
>
> #(define my-script-alist
>     (cons*
>      `(little-accent-up
>         . (
>             (stencil . ,lAccUpStencil)
>             (toward-stem-shift-in-column . 0.0)
>             (padding . 0.20)
>             (avoid-slur . around)
>             (direction . ,UP)))
>      `(little-accent-down
>         . (
>             (stencil . ,lAccDownStencil)
>             (toward-stem-shift-in-column . 0.0)
>             (padding . 0.20)
>             (avoid-slur . around)
>             (direction . ,DOWN)))
>      `(little-accent
>         . (
>             (stencil . ,lAccStencil)
>             (toward-stem-shift-in-column . 0.0)
>             (padding . 0.20)
>             (avoid-slur . around)
>             (direction . ,UP)))
>      default-script-alist))
>
> \layout {
>    \context {
>      \Score
>      scriptDefinitions = #my-script-alist
>    }
> }
>
>
> [1]
>
> https://tutoriel-scheme.readthedocs.io/en/latest/listes.html#operations-de-base
> and
>
> https://tutoriel-scheme.readthedocs.io/en/latest/recursivite.html#retour-sur-les-listes
> might help you understand why.
>
> Best,
> Jean
>
>

Reply via email to