Hi Tina

Many thanks for these examples. They were exactly what I was looking for. (I'd tried something similar but got hung up over passing an entire score to a scheme function -- together with some inept coding errors on my part).

Keep up the good work !

Best regards

Roman

Message: 1
Date: Sat, 15 Aug 2026 20:56:32 +0200
From: Tina Petzel <[email protected]>
To: [email protected]
Subject: Re: Conditionally skip an entire
Message-ID: <[email protected]>
Content-Type: text/plain; charset="utf-8"

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

Reply via email to