Having articulated the question, I figured out that apparently one can't
return a \bookpart from a Scheme function, but it's ok to return a \score,
so I am restructuring my code.

On Sun, Oct 18, 2020 at 10:28 AM Dave Seidel <[email protected]> wrote:

> Hi,
>
> I have a multi-section piece, with a master .ly file that uses \include
> for each of the sections of the piece. Each included file more or less
> follows the pattern of the string quartet template that ships with
> Lilypond: a series of macros, one per voice, followed by a \bookpart
> section that builds a StaffGroup, with one Staff per voice. This bookpart
> block is nearly identical in all the included files, with the exception of
> a title string used for "piece" property in in a \header section and also
> also as a \tocItem.
>
> This all works quite well, and I have a nice score with everything. Now
> I'd like to be able to produce parts, and my thought is that rather than
> have a literal bookpart block in each file, I should be able to convert the
> block into a function that takes the title string parameter. If I can get
> this to work, then hopefully I can make the function smart enough to either
> render all voices (for the full score) or just a single voice (for parts).
>
> My problem is that I have defined the function, but I can't invoke it.
> Here's the function:
>
> scoreSection =
> #(define-scheme-function
>     (parser location title)
>     (string?)
>   #{
>     \bookpart {
>         \header {
>           piece = #title
>         }
>         \tocItem \markup #title
>         \markup {
>           \italic "Notes other than C have different pitches than notated,
> as indicated by a number"
>         }
>         \markup {
>           \italic "in parentheses giving an offset in cents relative to
> the notated pitch, shown at"
>         }
>         \markup {
>           \italic "the first appearance of each note that requires
> alteration."
>         }
>         \score {
>             \new StaffGroup \with { midiInstrument = "cello" } <<
>                 \new Staff \with { instrumentName = "String 1" }
>                 << \global \stringOne >>
>                 \new Staff \with { instrumentName = "String 2" }
>                 << \global \stringTwo >>
>                 \new Staff \with { instrumentName = "String 3" }
>                 << \global \stringThree >>
>                 \new Staff \with { instrumentName = "String 4" }
>                 << \global \stringFour >>
>                 \new Staff \with { instrumentName = "String 5" }
>                 << \global \stringFive >>
>                 \new Staff \with { instrumentName = "String 6" }
>                 << \global \stringSix >>
>                 \new Staff \with { instrumentName = "String 7" }
>                 << \global \stringSeven >>
>             >>
>         \layout { }
>         \midi { }
>         }
>     }
>   #})
>
> And I am trying to invoke it using
>
> \scoreSection #"Part 1"
>
>
> but I keep getting the error messages like this:
>
> Parsing...
> hexany_permutations.ly:127:1: error: bad expression type
>
> \scoreSection #"Part 1"
>
>
> What am I doing wrong? I'm a Lilypond and Scheme newbie (but a programmer
> by trade).
>
> - Dave
>

Reply via email to