Hello Roman,

> Hi folks
> 
> I have a number of lilypond file which each contain several scores, call 
> the scores A, B and C.
> 
> Depending on a variable set when invoking lilypond I need to generate 
> results which don't necessarily  contain the same scores. For instance a 
> singer might only need A and B, But an instrumentalist might need A, B 
> and C.
> 
> Is there any way to write a condition at the top level of a lilypond 
> file (the same level as a header or a score block) to conditionally skip 
> or process an entire score.

Absolutely. Indeed there are multiple ways to achieve this. You could simply 
wrap the scores in a `$(if ... #{ \score { ... } #})`. You can also define a 
nice function like this:

%%%
featureSet = A,B,D

conditionalScore =
#(define-scheme-function (tag score) (symbol? ly:score?)
   (if (member tag featureSet) score))

\conditionalScore A \score {
  c'
}

\conditionalScore B \score {
  d'
}

\conditionalScore C \score {
  e'
}

\conditionalScore D \score {
  f'
}
%%%

This is just one way to do this of course, and there are many more ways to do 
this. You could also e.g. store scores in an alist and have a function that 
prints a selection of these (which would allow you to create multiple sets from 
a single file):

%%%
scores.A = \score {
  c'
}

scores.B = \score {
  d'
}

scores.C = \score {
  e'
}

scores.D = \score {
  f'
}

scoreSet =
#(define-void-function (set) (symbol-list?)
   (for-each
    (lambda (sym)
      (add-score (assoc-get sym scores)))
    set))

\book {
  \scoreSet A,B,C,D
}

\book {
  \scoreSet A,C,D
}
%%%

This is particularly nice if you want to split your scores into multiple files. 
And still there are still many more ways to achieve this goal.

Cheers,
Tina

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to