Subject: Extension de la command \tag.

From: Gilles THIBAULT <[email-masked]>
Date: Fri, 07 Sep 2007 16:28:45 +0200

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