[Top][All Lists]
[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\""}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CascadeTag.png
Description: PNG image