On Sun, 13 Oct 2024 10:20:29 +0200 Thomas Morley <thomasmorle...@gmail.com> wrote:
> Am Sa., 12. Okt. 2024 um 20:33 Uhr schrieb Cameron Hall > <camerongh...@cox.net>: > > > > In this example, I have function called "scorePart" that returns a > > staff that I use to make parts in the score, and this works. I have > > another function called "standalonePart" that returns a bookpart, > > which I'd like to use to print individual instrument parts. > > However, when I attempt to use it I get an error complaining about > > bad expression type. What is going on here that it will accept a > > staff but not a bookpart? > > > > Thanks, > > Cameron > > > > %%% > > \version "2.24.4" > > \header { title = "Example" } > > > > flute.name = "Flute" > > flute.key = c' > > flute.music = \fixed c'' { \key c \major c4 d e d c1 } > > > > trumpet.name = "B♭ Trumpet" > > trumpet.key = bes > > trumpet.music = \fixed c' { \key c \major c4 d c b, c1 } > > > > scorePart = > > #(define-scheme-function (instrument) (alist?) > > #{ > > \new Staff > > \with { instrumentName = #(ly:assoc-get 'name instrument) } > > { #(ly:assoc-get 'music instrument) } > > #} > > ) > > > > standalonePart = > > #(define-scheme-function (instrument) (alist?) > > #{ > > \bookpart { > > \header { instrument = #(ly:assoc-get 'name instrument) } > > \score { > > \new Staff > > \transpose #(ly:assoc-get 'key instrument) c' > > #(ly:assoc-get 'music instrument) > > } > > } > > #} > > ) > > > > % Score book > > \book { > > \header { instrument = "Concert Pitch Score" } > > \score { > > << > > \scorePart \flute > > \scorePart \trumpet > > >> > > } > > } > > > > % Book containing all parts > > \book { > > \standalonePart \flute > > \standalonePart \trumpet > > } > > %%% > > > > Hi Cameron, > > iirc, there are some problems with bookpart... > Anyway, you could do: > > %%% > > \version "2.24.4" > \header { title = "Example" } > > flute.name = "Flute" > flute.key = c' > flute.music = \fixed c'' { \key c \major c4 d e d c1 } > > trumpet.name = "B♭ Trumpet" > trumpet.key = bes > trumpet.music = \fixed c' { \key c \major c4 d c b, c1 } > > #(define (add-bookpart book-part) > "Add bookpart @var{book-part} to current-book or toplevel-bookparts" > ;; See also: `collect-bookpart-for-book` in lily-library.scm > (let* ((user-book (ly:parser-lookup '$current-book))) > (if user-book > (ly:book-add-bookpart! user-book book-part) > (ly:parser-define! > 'toplevel-bookparts > (cons book-part (ly:parser-lookup 'toplevel-bookparts)))))) > > scorePart = > #(define-scheme-function (instrument) (alist?) > #{ > \new Staff > \with { instrumentName = #(ly:assoc-get 'name instrument) } > { #(ly:assoc-get 'music instrument) } > #}) > > standalonePart = > #(define-void-function (instrument) (alist?) > (add-bookpart > #{ > \bookpart { > \header { instrument = #(ly:assoc-get 'name instrument) } > \score { > \new Staff > \transpose #(ly:assoc-get 'key instrument) c' > #(ly:assoc-get 'music instrument) > } > } > #})) > > % Score book > \book { > \header { instrument = "Concert Pitch Score" } > \score { > << > \scorePart \flute > \scorePart \trumpet > >> > } > } > > % Book containing all parts > \book { > \standalonePart \flute > \standalonePart \trumpet > } > %%% > > > Cheers, > Harm > Thanks a lot! That does the trick. It seems I can also reduce it down to this, which is shorter. #(define (add-bookpart bp) (if $current-book (ly:book-add-bookpart! $current-book bp) (collect-bookpart-for-book bp)))