[ << General input and output ] | [Top][Contents][Index][ ? ] | [ Spacing issues >> ] | ||
[ < Including LilyPond files ] | [ Up : Working with input files ] | [ Using variables > ] |
3.3.2 Different editions from one source
Several methods can be used to generate different versions of a score from the same music source. Variables are perhaps the most useful for combining lengthy sections of music and/or annotation. Tags are more useful for selecting one section from several alternative shorter sections of music, and can also be used for splicing pieces of music together at different points.
Whichever method is used, separating the notation from the structure of the score will make it easier to change the structure while leaving the notation untouched.
Using variables | ||
Using tags | ||
Using global settings |
[ << General input and output ] | [Top][Contents][Index][ ? ] | [ Spacing issues >> ] | ||
[ < Different editions from one source ] | [ Up : Different editions from one source ] | [ Using tags > ] |
Using variables
If sections of the music are defined in variables they can be reused in different parts of the score, see pieces with variables Organizing pieces with variables. For example, an a cappella vocal score frequently includes a piano reduction of the parts for rehearsal purposes which is identical to the vocal music, so the music need be entered only once. Music from two variables may be combined on one staff, see Automatic part combining. Here is an example:
sopranoMusic = \relative c'' { a4 b c b8( a) } altoMusic = \relative g' { e4 e e f } tenorMusic = \relative c' { c4 b e d8( c) } bassMusic = \relative c' { a4 gis a d, } allLyrics = \lyricmode {King of glo -- ry } << \new Staff = "Soprano" \sopranoMusic \new Lyrics \allLyrics \new Staff = "Alto" \altoMusic \new Lyrics \allLyrics \new Staff = "Tenor" { \clef "treble_8" \tenorMusic } \new Lyrics \allLyrics \new Staff = "Bass" { \clef "bass" \bassMusic } \new Lyrics \allLyrics \new PianoStaff << \new Staff = "RH" { \set Staff.printPartCombineTexts = ##f \partcombine \sopranoMusic \altoMusic } \new Staff = "LH" { \set Staff.printPartCombineTexts = ##f \clef "bass" \partcombine \tenorMusic \bassMusic } >> >>
Separate scores showing just the vocal parts or just the piano part can be produced by changing just the structural statements, leaving the musical notation unchanged.
For lengthy scores, the variable definitions may be placed in separate files which are then included, see Including LilyPond files.
[ << General input and output ] | [Top][Contents][Index][ ? ] | [ Spacing issues >> ] | ||
[ < Using variables ] | [ Up : Different editions from one source ] | [ Using global settings > ] |
Using tags
The \tag #'partA
command marks a music expression
with the name partA.
Expressions tagged in this way can be selected or filtered out by
name later, using either \keepWithTag #'name
or
\removeWithTag #'name
. The result of applying these filters
to tagged music is as follows:
Filter | Result |
---|---|
Tagged music preceded by \keepWithTag #'name or
\keepWithTag #'(name1 name2…) | Untagged music and music tagged with any of the given tag names is included; music tagged with any other tag name is excluded. |
Tagged music preceded by \removeWithTag #'name or
\removeWithTag #'(name1 name2…) | Untagged music and music not tagged with any of the given tag names is included; music tagged with any of the given tag names is excluded. |
Tagged music not preceded by either \keepWithTag or
\removeWithTag | All tagged and untagged music is included. |
The arguments of the \tag
, \keepWithTag
and
\removeWithTag
commands should be a symbol
(such as #'score
or #'part
), followed
by a music expression.
In the following example, we see two versions of a piece of music, one showing trills with the usual notation, and one with trills explicitly expanded:
music = \relative g' { g8. c32 d \tag #'trills { d8.\trill } \tag #'expand { \repeat unfold 3 { e32 d } } c32 d } \score { \keepWithTag #'trills \music } \score { \keepWithTag #'expand \music }
Alternatively, it is sometimes easier to exclude sections of music:
music = \relative g' { g8. c32 d \tag #'trills { d8.\trill } \tag #'expand {\repeat unfold 3 { e32 d } } c32 d } \score { \removeWithTag #'expand \music } \score { \removeWithTag #'trills \music }
Tagged filtering can be applied to articulations, texts, etc. by prepending
-\tag #'your-tag
to an articulation. For example, this would define a note with a conditional fingering indication and a note with a conditional annotation:
c1-\tag #'finger ^4 c1-\tag #'warn ^"Watch!"
Multiple tags may be placed on expressions with multiple
\tag
entries, or by combining multiple tags into one symbol
list:
music = \relative c'' { \tag #'a \tag #'both { a4 a a a } \tag #'(b both) { b4 b b b } } << \keepWithTag #'a \music \keepWithTag #'b \music \keepWithTag #'both \music >>
Multiple \removeWithTag
filters may be applied to a single
music expression to remove several differently named tagged
sections. Alternatively, you can use a single
\removeWithTag
with a list of tags.
music = \relative c'' { \tag #'A { a4 a a a } \tag #'B { b4 b b b } \tag #'C { c4 c c c } \tag #'D { d4 d d d } } \new Voice { \removeWithTag #'B \removeWithTag #'C \music \removeWithTag #'(B C) \music }
Two or more \keepWithTag
filters applied to a single music
expression will cause all tagged sections to be removed, as
the first filter will remove all tagged sections except the one
named, and the second filter will remove even that tagged section.
Usually you would rather want to use a single \keepWithTag
command with a list of multiple tags: this will only remove tagged
sections not given in any of the tags.
Sometimes you want to splice some music at a particular place in an
existing music expression. You can use \pushToTag
and
\appendToTag
for adding material at the front or end of the
elements
of an existing music construct. Not every music
construct has elements
, but sequential and simultaneous music are
safe bets:
test = { \tag #'here { \tag #'here <<c''>> } } { \pushToTag #'here c' \pushToTag #'here e' \pushToTag #'here g' \test \appendToTag #'here c' \appendToTag #'here e' \appendToTag #'here g' \test }
Both commands get a tag, the material to splice in at every occurence of
the tag, and the tagged expression. The commands make sure to
copy everything that they change so that the original \test
retains its meaning.
See also
Learning Manual: Organizing pieces with variables.
Notation Reference: Automatic part combining, Including LilyPond files.
Known issues and warnings
Calling \relative
on a music expression obtained by filtering
music through \keepWithTag
or \removeWithTag
might cause
the octave relations to change, as only the pitches actually
remaining in the filtered expression will be considered. Applying
\relative
first, before \keepWithTag
or
\removeWithTag
, avoids this danger as \relative
then
acts on all the pitches as-input.
[ << General input and output ] | [Top][Contents][Index][ ? ] | [ Spacing issues >> ] | ||
[ < Using tags ] | [ Up : Different editions from one source ] | [ Special characters > ] |
Using global settings
Global settings can be included from a separate file:
lilypond -dinclude-settings=MY_SETTINGS.ly MY_SCORE.ly
Groups of settings such as page size, font or type face can be stored in separate files. This allows different editions from the same score as well as standard settings to be applied to many scores, simply by specifying the proper settings file.
This technique also works well with the use of style sheets, as discussed in Style sheets.
See also
Learning Manual: Organizing pieces with variables, Style sheets.
Notation Reference: Including LilyPond files.
[ << General input and output ] | [Top][Contents][Index][ ? ] | [ Spacing issues >> ] | ||
[ < Using tags ] | [ Up : Different editions from one source ] | [ Special characters > ] |
Other languages: deutsch, español, français, italiano, 日本語.
About automatic language selection.