Hallo,
die function "startVolta" habe ich mal in den code auskommentiert reingeschrieben. sie funktioniert natürlich nicht, und Du weißt auch sicher, warum. liegt vielleicht daran, daß der parser den #input in einem string nicht erkennt? aber ich bekomme schon in der ersten zeile eine fehlermeldung...
Es hat eigentlich nichts mit dem parser zu tun, sodern es handelt sich um scheme-Probleme.
Im einzelnen:
Die Fehlermeldung fängt an mit (den springenden Punkt habe ich eingefärbt):
GNU LilyPond 2.16.2
»atest-22.ly« wird verarbeitet
Analysieren...
atest-22.ly:2933:1: Fehler: GUILE signalisierte einen Fehler für den hier beginnenden Ausdruck
#
(define-music-function (parser location input)
atest-22.ly:2944:47: unknown # object
In LilyPond-Syntax kann man "#" benutzen um Variablen in music-functions aufzurufen.
Mit der Zeile
\set Score.repeatCommands = #'((volta #input ))bist Du ab
# aber in scheme.
Dort hat "#" aber besondere Bedeutungen.
1. Empfehlung "#" löschen!
Nächstes Problem:
Du wirst merken, daß das immer noch nicht den gewünschten Erfolg zeitigt.
Wieder ein scheme-Problem:
Das Argument von
\set Score.repeatCommands ist eine Liste.
Diese Liste wird durch das '-Zeichen angezeigt.
Allerdings führt das das dazu das alles
"wörtlich" genommen wird, d.h. der Wert für "volta" ist ein "symbol", vereinfacht gesagt ein Wort mit fünf Buchstaben.
guile> (define input "x")
guile> '((volta input))
((volta input))
guile>
Du willst aber kein Wort haben sondern einen Wert aufrufen.
Dazu muß man
1. der Liste ermöglichen das zu tun und
2. den Wert für
input evaluieren.
Die Kurzschreibweise für 1. ist: ` im Unterschied zu '
In groß:
` im Unterschied zu
'Also `((volta input))
input muß jetzt noch evaluiert werden mit dem ,-Zeichen (auch das ist eine Kurzschreibweise)
D.h.: `((volta ,input)):
guile> (define input "x")
guile> `((volta ,input))
((volta "x"))
guile>
(Eine scheme-sandbox kann man mit
lilypond scheme-sandboxim Terminal aufrufen.
Ob das mit jedem Betriebssystem geht weiß ich allerdings nicht.
Ich selber, auf LINUX, benutze guile direkt und nicht über den Umweg via LilyPond)
Die Funktion arbeitet jetzt wie gewünscht.
Ich habe noch die type-Abfrage für input auf das allgemeinere
markup? geändert. Das hat den Vorteil, daß man
input besser formatieren kann, fallls gewünscht.
Darüberhinaus sind die vielfältigen Möglichkeiten sich Werte und Ausdrücke im Terminal zeigen zu lassen unermeßlich wertvolle Werkzeuge. Einige Beispiel dafür im Code. Nur zu Demonstration, solltest Du wieder löschen.
Anmerkung: \void ... führt dazu, daß kein print-output erzeugt wird, sondern nur eine Terminal-Ausgabe.
\version "2.16.2"
startRepeat = \set Score.repeatCommands = #'(start-repeat)
endVolta = \set Score.repeatCommands = #'((volta #f))
startVolta =
#(define-music-function (parser location input)
(markup?)
;; delete me start
(let ((ls '((volta input))))
(display "\n\t\tls\t\t\t")(display ls)
(display "\n\t\t(cadar ls)\t\t")(display (cadar ls))
(display "\n\t\t(symbol? (cadar ls))\t")(write (symbol? (cadar ls)))
(newline))
;; delete me end
#{
\set Score.repeatCommands = #`((volta ,input))
#})
\void \displayLilyMusic \startVolta "1."
\relative c' {
a1
\startRepeat
b
\startVolta \markup \fontsize #6 "1."
c
\endVolta
d
}Noch eine Sache:
Reihungen wie:
\endVolta
\endRepeat werden nicht funktionieren, da die jeweils spätere die frühere Setzungen überschreibt. Sie addieren sich nicht!
HTH,
Harm