lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: newbie: help with Scheme functions


From: Dave Seidel
Subject: Re: newbie: help with Scheme functions
Date: Sun, 18 Oct 2020 10:52:17 -0400

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 <dave.seidel@gmail.com> 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

[Prev in Thread] Current Thread [Next in Thread]