Extension de la command \tag.

Un jour où je faisais un arrangement avec beaucoup d'instruments, j'avais
demandé ici même s' il y avait un moyen de dire à lilypond quelque chose du
genre :
\tag #'One \musicA ...et pour tous les autres tags \musicB.

En essayant de comprendre les commandes \tag et \keepWithTag dans le fichier
"music-functions-init.ly" (dans "\LilyPond\usr\share\lilypond\current\ly"),
je suis finalement arrivé à créer une commande ("\elseTag") qui faisait ce que je recherchais
La syntaxe en est la suivante :
\tag #'One \musicA
\elseTag #'One \musicB
La commande \keepWithTag s'utilise toujours de la même manière, mais a été légèrement modifié en interne.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%

elseTagName = #'hjklm % nom de Tag improbable ...

keepWithTag = #(define-music-function (parser location tag music) (symbol? ly:music?)
(music-filter
(lambda (m)
(let* ((tags (ly:music-property m 'tags))
(resA (memq tag tags))
(resB (memq elseTagName tags))
)
(or
(eq? tags '())
(and (not (equal? resA #f))
(equal? resB #f)
)
(and (not (equal? resB #f))
(equal? resA #f)
)
)
))
music))

elseTag = #(define-music-function (parser location tag arg)(symbol? ly:music?)
(set!
(ly:music-property arg 'tags)
(cons tag
(cons elseTagName (ly:music-property arg 'tags))
)
)
arg)

%%%%%%%%%% exemple %%%%%%%%%%%%%%%%

\version "2.10.0"

music = \relative c'
{
c4 d e f
\tag #'One { g4 a b2 c1}
\elseTag #'One { g4 fis f2 e1}
}

\score {
<<
\new Staff { \keepWithTag #'One \music}
\new Staff { \keepWithTag #'Two \music}
\new Staff { \keepWithTag #'Three \music}
\new Staff { \keepWithTag #'Four \music}

}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Gilles