lilypond-user
[Top][All Lists]
Advanced

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

Re: Question about custom articulation


From: Rip _Mus
Subject: Re: Question about custom articulation
Date: Tue, 10 Jan 2023 16:07:33 +0100

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

Best regards

Il mar 10 gen 2023, 12:28 Jean Abou Samra <jean@abou-samra.fr> 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

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