lilypond-user
[Top][All Lists]
Advanced

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

Re: \tag en cascade


From: Gilles THIBAULT
Subject: Re: \tag en cascade
Date: Mon, 30 Aug 2010 01:37:28 +0200


LilyPond n'accepte pas les \tag à l'intérieur d'autres \tag.

Du genre :

\tag #'partScore {
   \tag #'flute {
      ...
   }
   \tag #'hautbois {
      ...
   }
}
...


J'ai essayé de faire une version étendue de \keepWithTag
qui rend possible ce genre de construction.
La nouvelle fonction s'appelle \keepWithTags (noter le s à la fin du nom) et
prend en argument une liste de tag à la place d'un seul tag.
Par exemple  : \keepWithTags #(list 'partScore 'flute) \music prend dans
\music la musique de \tag 'flute mais seulement celle se trouvant dans la
structure de \tag 'partScore.
[ \keepWithTags est compatible avec la fonction \elseTag du snippet
http://lsr.dsi.unimi.it/LSR/Item?id=381 ]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
elseTagName = #(gensym)

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

keepWithTags =
#(define-music-function (parser location tagList music) (list? ly:music?)
  (music-filter
   (lambda (m)
     (let* ((tags (ly:music-property m 'tags))
            (resA (pair? (filter (lambda (tag)(memq tag tags))
                                 tagList)))
            (resB (memq elseTagName tags)))
       (or (eq? tags '())
           (and resA (not resB))
           (and resB (not resA)))))
   music))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paper{
 print-all-headers = ##t
}

music = \relative {
     \tag #'easyClef {
         \tag #'basson \clef bass
         \tag #'alto \clef treble
     }
     \tag #'experienced {
         \tag #'basson \clef tenor
         \tag #'alto \clef alto
     }
     d4 c b a g fis e fis g1
}

%%%
\score {
 \keepWithTags #(list 'easyClef 'basson) \music
 %\keepWithTag #'easyClef \keepWithTag #'basson \music % => treble clef !
  \header { instrument = "basson version \"easyClef\""}
}
%%%
\score { \keepWithTags #(list 'easyClef 'alto) \music
  \header { instrument = "alto version \"easyClef\""}
}
%%%
\score { \keepWithTags #(list 'experienced 'basson) \music
  \header { instrument = "basson version \"experienced\"" }
}
%%%
\score { \keepWithTags #(list 'experienced 'alto) \music
  \header { instrument = "alto version \"experienced\""}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Attachment: CascadeTag.png
Description: PNG image


reply via email to

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