Deutschsprachiges LilyPond Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: ingmar am Dienstag, 5. Mai 2026, 19:47

Titel: LilyPond-Book per Funktion erzeugen?
Beitrag von: ingmar am Dienstag, 5. Mai 2026, 19:47
Ich versuche, eine scheme-Funktion dazu zu bewegen, ein LilyPond-Book auszugeben.

Verwende ich define-scheme-function, erhalte ich die Fehlermeldung "Falsche Ausdrucksart". Versucbe ichs mit define-music-function, erfahre ich schon mehr: "music-Funktion kann nicht ##<Book> ausgeben".

Tja! Aber warum nicht? Was kann ich da machen?

Hintergrund ist, dass ich mehrere PDF-Files in einer einzigen Lilypond-Datei ausgeben möchte (soweit kein Problem), die sich nur durch ein Detail unterscheiden, das ich gerne per Argument übergeben möchte.


Danke für eure Hilfe! : - )

mymusic = { c4 d e f g2 g2 a4 a a a g1 }

mybook = #(define-scheme-function (mymusic) (ly:music?) #{
\book { \bookpart { \score { \new Staff { \clef bass \mymusic }}} }
 #})

\mybook \mymusic
Titel: Antw:LilyPond-Book per Funktion erzeugen?
Beitrag von: harm6 am Dienstag, 5. Mai 2026, 21:44
Hallo ingmar :)

wir sind hier in einem Bereich, in dem ich mich nicht so gut auskenne. Aber ich schreibe mal was ich zu wissen glaube...

Ein \book ist ein bestimmtes Format. Es kann music enthalten, ist aber selber keine Musik. Insoweit kann eine music-function auch kein \book ausgeben.

Um das \book auch zu drucken muss es prozessiert werden. Für toplevel-books gibts dafür den toplevel-book-handler, per default ist das print-book-with-defaults (siehe declarations-init.ly). Wenn eine scheme-function jetzt ein \book versucht auszugeben so ist es ja kein toplevel-book, sondern innerhalb der function gemacht. Deshalb funktioniert auch das nicht.

Um weiter zu kommen muss man das \book innerhalb der function prozessieren. Dafür kann man dann wiederum print-book-with-defaults verwenden. Allerdings ist eine scheme-function hier ebenfalls unnütz, denn man will die tatsächliche Rückgabe ja gar nicht, sondern nur die Ausführung des Druck-Befehls.
Deshalb void-function. Führt zu:

mymusicI = { c4 d e f g2 g2 a4 a a a g1 fis }
mymusicII = { c4 d e f g2 g2 a4 a a a g1 aes }

mybook = #(define-void-function (mus) (ly:music?)
  (print-book-with-defaults
    #{ \book { \bookpart { \score { \new Staff { \clef bass $mus } } } } #}))

\mybook \mymusicI
\mybook \mymusicII

HTH,
  Harm
Titel: re: LilyPond-Book per Funktion erzeugen?
Beitrag von: ingmar am Sonntag, 10. Mai 2026, 11:32
Hallo harm,


danke für deine Unterstützung.

Was du schreibst, ist nachvollziehbar, und dein Beispiel funktioniert gut.

Allerdings erhalte ich beim echten Einsatz folgende Fehlermeldung: definition in expression context, where definitions are not allowed.

Ich gehe davon aus, dass das damit zusammenhängt, dass meine Variablen mit der Musik selbst auch immer wieder scheme-Aufrufe enthalten. Beim üblichen Zusammenbauen meines Books ist das kein Problem, hier aber eben doch.

Ich werd mal versuchen, ein Minimalbeispiel zu konstruieren. Dazu muss ich mir allerdings ein bisschen Zeit lassen..


Gruß, und nochmal danke, : - )
--ingmar