Jump to content

Generating scores within a function

From LilyPond wiki

A music-function uses variables at the point where it's invoked; as a result, if variables are then redefined, the same function will then use the same variables with their new value.
This makes it possible to generate scores in a semi-automated way, as demonstrated here.

\version "2.24.0"

%% LSR originally contributed by Gilles Thibault:
%% https://lists.gnu.org/archive/html/lilypond-user-fr/2011-11/msg00141.html
%% See also http://lsr.di.unimi.it/LSR/Item?id=630
%% and https://lists.gnu.org/archive/html/lilypond-user/2015-04/msg00311.html

\paper { tagline = ##f }

duo =
#(define-music-function (nr) (number?)
   (let* ((s (number->string nr))
          (h (make-module))
          (m (ly:make-score
              #{<<
                \new Staff { \global \clarI }
                \new Staff { \global \clarII }
                >>
              #})))
     (module-define! h 'piece (markup #:concat ("Duo n." s)))
     (ly:score-set-header! m h)
     (collect-scores-for-book m)
     (make-music 'Music 'void #t)))

%%%%%%%%%% Duo 1
global = { \key c \major \time 4/4 }
clarI = { e'1}
clarII = { c'1}
\duo #1

%%%%%%%%%% Duo 2
global = { \key d \minor \time 3/4 }
clarI = { f'2.}
clarII = { d'2.}
\duo #2

%%%%%%%%%% Duo 3
global = { \key e \minor \time 2/4 }
clarI = { g'2}
clarII = { e'2}
\duo #3