bookpart als function

Begonnen von Köbi, Mittwoch, 2. August 2017, 00:33

« vorheriges - nächstes »

Köbi

Hallo harm6

Zitat von: harm6 am Freitag, 25. August 2017, 10:58
bin erst seit gestern abend wieder im Lande, ich hoffe Du brauchst es noch:

Unterdessen habe ich wieder Ferien und darum endlich genug Zeit, mich mit deinen Ausführungen zu beschäftigen. Ich brauche es sehr wohl noch!

(1)
Zitat
Wenn ich Deinen Code kompiliere kommt zunächst:
Zitat von: terminalerror: GUILE signaled an error for the expression beginning here
               \on-the-fly #
                                 not-part-first-page \fromproperty #'header:instrumentHeader
Unbound variable: not-part-first-page

`not-part-first-page' stammt aus titling-init.ly und ist nicht public. Um weiter zu kommen mach ich immer quick'n dirty:
\include "titling-init.ly"

Aha. Ich verstehe zwar nicht wirklich, warum das so ist, aber ich versuche mir mal zu merken, dass ich bei komischen Fehlermeldungen mit einem "direkten include" vielleicht eine bessere Fehlermeldung bekomme.

(2)
Zitat
Danach sieht man dann denn error den Du beschreibst (ist allerdings im header nicht im paper.)
Zitat von: köbi2. paper: Das Ding, das ich eingefügt habe, führt zu einem Compile-Error. Warum? Ich ging davon aus, dass ich innerhalb von #{ ... #} normale Lilypond-Syntax verwenden kann.
Zitat von: terminalerror: syntax error, unexpected '?'
           poet = showPoet
                          ?
bookpart-def-03.ly:168:1: error: error in #{ ... #}
Das Problem ist, daß Du versuchst in LilyPond eine scheme-Variable aufzurufen, showPoet?. Es handelt sich also eben nicht um LilyPond-syntax. Insoweit muß ein $- oder #-Zeichen davor (der Unterschied vernachlässige ich hier mal, bis auf: in Funktionen empfiehlt sich meistens das $-Zeichen)

Wunderbar, danke. Da habe ich anscheinend um eine Ecke zu wenig gedacht.

(3)
Zitat
Jetzt läuft es zwar ohne Fehler durch aber nicht mi dem gewünschten Ergebnis.
Erklärung:
Du hast einen toplevel header angegeben:
Zitat
\header {
  poet = \markup \box { \pad-around #1 { \myInstrument } }
  instrumentHeader = \markup { \myInstrument }
}
Dieser ist jetzt der header für alle books des files.
Einzelne Setzungen können durch zusätzliche header im bookpart oder score verändert oder auch hinzugefügt werden.
Und genau das machst Du, indem Du in der Funktion schreibst:
Zitat
         (bkp-header #{ \header {
           poet = $showPoet?
         } #})
showPoet? ist aber immer #t oder #f
Im toplevel-header wird die poet-Setzung also überschrieben durch ein boolean, welches zwar möglich ist, es gibt ja auch weder warning noch error, aber keine Ausgabe erzeugt.

Soweit auch klar. Das war ein Versehen beim Erzeugen des Minimal-Beispiels, sorry.

(4)
Zitat
Lösungsansatz:
Ich würde im toplevel-header wirklich nur die Setzungen reinschreiben die für das ganze Buch gelten sollen.
Setzungen für das Instrument gehören dann nicht dort hinein, da das book ja zahlreich Teile für verschiedene Instrumente beinhalten wird (wenn ich Dich richtig verstanden habe)
Vielmehr sollten die Instrument-Setzungen in den bookpart-header, der in der Funktion angelegt und dort bearbeitet wird.
Du mußt also der Funktion das Instrument übergeben und brauchst deshalb ein weiteres Argument. Dann kannst Du auch eine Abhängigkeit von showPoet? recht einfach etablieren.

Danke, begriffen.

(5)
Zitat
Kritik:
Falls Du weitere Setzungen im den bookpart header vornehmen willst brauchst Du mehr Argumente. Das wird schnell unbequem. Deshalb könnte man überlegen ob man nicht eine alist als Argument übergibt über die man dann module-define! iterieren kann.

Du hast natürlich recht. Ich arbeite deshalb mit Trees (http://lilypondblog.org/2014/07/trees-music-and-lilypond/). Die vielen Parameter habe ich nur für das Minimal-Beispiel gemacht.

(6)
Zitat
Anderer Ansatz (hier nur als Skizze)
Schreib doch alles in einen toplevel-header und wähle innerhalb der Funktion aus was Du haben willst, führt zu:

Ich habe es etwas anders gelöst. Aber in deinem Code-Beispiel sind wieder einige Stellen drin, die mir helfen Scheme etwas besser zu verstehen/anwenden.

Weil ich mit diesen Trees arbeite und es leider nicht geschafft habe, deine Hinweise aus diesem Thread in meinen Code einzubauen, beginne ich mal mit einem neuen Thread mit einem neuen Minimal-Beispiel, das etwas näher an meinem aktuellen Code ist.

Wie immer ganz viielen Dank Harm :-)

Gruss
Köbi