Autor Thema: Mehrere bookparts in einer Funktion mit einer Zusatzbedingung  (Gelesen 113 mal)

Manuela

  • Hero Member
  • *****
  • Beiträge: 549
    • Manuelas Lilypond Wiki
Mehrere bookparts in einer Funktion mit einer Zusatzbedingung
« am: Dienstag, 17. März 2020, 19:22 »
Hi,
ich möchte die Funktion aus diesem Thread um eine Variable erweitern, die bestimmte Bookparts wahlweise weglässt.

Dazu habe ich den Code folgendermaßen modifiziert:
\version "2.20.0"
\language "deutsch"

test =
#(define-music-function (p)
   (ly:pitch?)
   #{
     \new Staff \transpose c $p \relative c'' { cis e g }
   #})

xtest =
#(define-scheme-function (p q) (ly:pitch? ly:pitch?)
   (scorify-music (test p)))

#(define (make-book-parts-with-top-markup markup scores)
   (let* ((output-def (ly:make-output-def))
          (raw-paper
           (begin
            (ly:output-def-set-variable! output-def 'is-paper #t)
            output-def))
          (bp  #{ \bookpart { $raw-paper } #}))
     (for-each
      (lambda (score) (ly:book-add-score! bp score))
      (cons (list markup) scores))
     bp))

#(define (fill-book-part-paper! bookpart key-value-alist)
   (for-each
    (lambda (key-value)
      (ly:output-def-set-variable!
       (ly:book-paper bookpart) (car key-value) (cdr key-value)))
    key-value-alist))

#(define-markup-command (my-header layout props p text1 text2)
   (ly:pitch? string? string?)
   (interpret-markup layout props
     #{
       \markup
       \fill-line
       {
         \null
         \rounded-box \concat { $text1 $text2 }
         \null
       }
     #}))

#(define (add-bookparts-to-toplevel-bookparts pitch mitvier)
   (let* ((bk (ly:make-book $defaultpaper $defaultheader '()))
          (my-titel
           #{ \markup \my-header ##{ $pitch #} "Kadenzen " "-Dur" #})
          (paper-kadenzen #{ \paper { line-width = 120 ragged-right = ##f } #})
          (paper-dreiklang #{ \paper { top-markup-spacing.padding = 40 } #})
          (paper-vierklang #{ \paper { top-markup-spacing.padding = 20 } #})
          (bk-parts
           (list
            (make-book-parts-with-top-markup
             my-titel
             (list (xtest pitch pitch)))
            (make-book-parts-with-top-markup
             my-titel
             (list (xtest pitch pitch) (xtest #{ d #} pitch)))
            (if mitvier
                (make-book-parts-with-top-markup
                 my-titel
                 (list (xtest pitch pitch) (xtest #{ d #} pitch)))
                '())
            )))
     (for-each
      (lambda (book-part key-values)
        (fill-book-part-paper! book-part key-values))
      bk-parts
      (map
       (lambda (paper)
         (ly:module->alist (ly:output-def-scope paper)))
       (list paper-kadenzen)))
     (for-each
      (lambda (book-part)
        (ly:parser-define! 'toplevel-bookparts
          (cons book-part (ly:parser-lookup 'toplevel-bookparts))))
      bk-parts)))

myBookparts =
#(define-void-function (mus mit) (ly:music? boolean?)
   (let ((pitches (music-pitches mus)))
     (for-each
      (lambda (pitch) (add-bookparts-to-toplevel-bookparts pitch mit))
      pitches)))

Das folgende funktioniert mit diesem Code:
\myBookparts < des as > ##t
Sobald ich den Parameter auf ##f setze, stürzt Lilypond ab

\myBookparts < des as > ##f

Parsing...
Wurde mit dem Return-Code -1073741819 beendet.

Wenn ich den else-Zweig mit einer Leerseite auffülle, funktioniert es. Wie muss der Code beschaffen sein, damit er auch ohne zusätzliche Leerseite funktioniert?
« Letzte Änderung: Mittwoch, 18. März 2020, 10:13 von Manuela »
Danke für eure Hilfe
viele Grüße
-- Manuela