-#(defmacro satb-defaulting (name . default)
- (if (defined? name) name (if (pair? default) (car default) *unspecified*)))
-
-#(define (satb-sym . strings) (string->symbol (apply string-append strings)))
-
-#(defmacro satb-short-name (part)
- "Use PartShortInstrumentName, or the first letter of
-PartInstrumentName or its default."
- (if (defined? (satb-sym part "Music"))
- (let ((sname (satb-sym part "ShortInstrumentName")))
- (if (defined? sname)
- sname
- `(substring (satb-defaulting ,(satb-sym part "InstrumentName") ,part)
- 0 1)))
- ""))
-
-#(defmacro satb-lyrics-if-defined (name voice . optionals)
- (let ((above (and (pair? optionals) (car optionals))))
- (if (defined? name)
- `(make-music 'ContextSpeccedMusic
- 'create-new #t
- 'context-type 'Lyrics
- 'property-operations ',(if above `((assign alignAboveContext ,above)) '())
- 'element (make-music 'LyricCombineMusic
- 'associated-context ,voice
- 'element ,name))
- *unspecified*)))
-
-#(defmacro satb-one-voice-staff (name clef)
- `#{ <<
- \new Staff = #,name \with {
- instrumentName = \markup \smallCaps
- #(satb-defaulting ,(satb-sym name "InstrumentName") ,name)
- shortInstrumentName = \markup \smallCaps #(satb-short-name ,name)
- midiInstrument = "clarinet"
- } {
- #(satb-defaulting Key)
- \clef #,clef
- \new Voice = #,name <<
- \satb-spacers
- #(satb-defaulting Time)
- \dynamicUp
- #(satb-defaulting ,(satb-sym name "Music"))
- >>
- }
- #(satb-lyrics-if-defined ,(satb-sym name "Lyrics") ,name)
- #(satb-lyrics-if-defined ,(satb-sym name "LyricsOne") ,name)
- #(satb-lyrics-if-defined ,(satb-sym name "LyricsTwo") ,name)
- #(satb-lyrics-if-defined ,(satb-sym name "LyricsThree") ,name)
- >> #})
-
-#(defmacro satb-two-voice-staff (name clef v1name v2name)
- `#{ <<
- \new Staff = #,name \with {
- instrumentName = \markup \right-column \smallCaps {
- #(satb-defaulting ,(satb-sym v1name "InstrumentName") ,v1name)
- #(satb-defaulting ,(satb-sym v2name "InstrumentName") ,v2name)
- }
- shortInstrumentName = \markup \right-column \smallCaps {
- #(satb-short-name ,v1name)
- #(satb-short-name ,v2name)
- }
- midiInstrument = "clarinet"
- } <<
- #(satb-defaulting Key)
- \clef #,clef
- \new Voice = #,v1name <<
- \satb-spacers
- #(satb-defaulting Time)
- \voiceOne
- \dynamicUp
- #(satb-defaulting ,(satb-sym v1name "Music"))
- >>
- \new Voice = #,v2name <<
- \satb-spacers
- #(satb-defaulting Time)
- \voiceTwo
- #(satb-defaulting ,(satb-sym v2name "Music"))
- >>
- >>
- #(satb-lyrics-if-defined ,(satb-sym v1name "Lyrics") ,v1name ,name)
- #(satb-lyrics-if-defined ,(satb-sym v1name "LyricsOne") ,v1name ,name)
- #(satb-lyrics-if-defined ,(satb-sym v1name "LyricsTwo") ,v1name ,name)
- #(satb-lyrics-if-defined ,(satb-sym v1name "LyricsThree") ,v1name ,name)
- #(satb-lyrics-if-defined ,(satb-sym v2name "Lyrics") ,v2name)
- #(satb-lyrics-if-defined ,(satb-sym v2name "LyricsOne") ,v2name)
- #(satb-lyrics-if-defined ,(satb-sym v2name "LyricsTwo") ,v2name)
- #(satb-lyrics-if-defined ,(satb-sym v2name "LyricsThree") ,v2name)
- >> #})
-
-satb-define-if-unused =
-#(define-void-function (parser location syms) (symbol-list?)
- (for-each
- (lambda (sym)
- (if (null? (ly:parser-lookup parser sym))
- (ly:parser-define! parser sym *unspecified*)))
- syms))
-
-\satb-define-if-unused
- #'(
- DescantMusic
- SopranoMusic
- AltoMusic
- TenorMusic
- BassMusic
- )
-
-satb-AllChoirMusic = <<
- \DescantMusic
- \SopranoMusic
- \AltoMusic
- \TenorMusic
- \BassMusic
->>
-
-#(define satb-spacers (skip-of-length satb-AllChoirMusic))
-
-SATB = <<
+\include "vocal-tkit.ly"
+\include "piano-tkit.ly"
+
+#(define satb-voice-prefixes
+ ;; These define the permitted prefixes to various names.
+ ;; They are combined with a fixed set of postfixes to form
+ ;; names such as AltoMusic, BassInstrumentName, etc.
+ ;; These names may be redefined.
+ '("Alto"
+ "Bass"
+ "Descant"
+ "Men"
+ "MenDivided"
+ "Piano"
+ "PianoLH"
+ "PianoRH"
+ "Soprano"
+ "Tenor"
+ "Women"
+ "WomenDivided"))
+
+#(define satb-lyrics-postfixes
+ ;; These define the permitted postfixes to the names of lyrics.
+ ;; They are combined with the prefixes to form names like
+ ;; AltoLyrics, etc.
+ ;; These names may be redefined or extended.
+ '("Lyrics"
+ "LyricsOne"
+ "LyricsTwo"
+ "LyricsThree"
+ "LyricsFour"))
+
+#(define satb-lyrics-variable-names
+ ;; These define the names which may be used to specify stanzas
+ ;; which go between the two two-voice staves when TwoVoicesPerStaff
+ ;; is set to #t. They may be redefined or extended.
+ '("VerseOne"
+ "VerseTwo"
+ "VerseThree"
+ "VerseFour"
+ "VerseFive"
+ "VerseSix"
+ "VerseSeven"
+ "VerseEight"
+ "VerseNine"))
+
+%% make the above definitions available
+#(set-music-definitions!
+ satb-voice-prefixes
+ satb-lyrics-postfixes
+ satb-lyrics-variable-names)
+
+
+SATB =
+{