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)))

Reply via email to