Hallo Harm,
auch wenn diese Antwort eigentlich einen eingen Thread wert wäre, eine »an der Oberfläche kratzende« Antwort unter diesem Betreff.
So unsicher sieht deine Funktion gar nicht aus, gegen Strukturänderungen ist man nie sicher.
Ich habe leider noch die alte 2.12.3 bei mir installiert, dort gibt's noch keine Funktion ly:grob-array->list,
und das Beispiel von List auf Array umzubauen habe ich auch gelassen.
Ich habe noch »tags« in »tigs« umbenannt, damit auf einen noch unbenutzten Symbolnamen zugegriffen wird:
Es erscheinen die Meldungen:
Warnung: Eigenschafts-Typprüfung für »tigs« (backend-type?) kann nicht gefunden werden. vielleicht ein Tippfehler?
Warnung: Zuweisung wird trotzdem durchgeführt
Zum Test habe ich einen Patch in der Datei »define-grob-properties.scm« ausgeführt, in die Tabelle innerhalb »(define-public all-user-grob-properties« habe ich die Zeile »(tigs ,string? "Tag marker in grob for function center-between")« eingefügt.
Dann entfallen diese Warnungsmeldungen.
Benutzte ich »tags«, dann kam die Fehlermeldung, daß dieses Backend-Property bereits definiert ist.
Ich habe leider keine Funktion, um diese Typ-Prüfungs-Tabellen via »\include "xxx.ly"« zu erweitern, und in der Installation herumzuändern ist auch keine gute Lösung.
Außerdem, da \tag auch eine SCHEME-Music-Function ist (music-functions-init.ly), könnte man sich auch ein eigenes \tig definieren. Man muß wohl ein bischen aufpassen, denn hier kann man nicht davon ausgehen, daß es das Symbol 'tigs in der ly:music?-Struktur bereits gibt, also eventuell erst angelegt werden muß. Und dann müßte man zu jedem Grob seine "Ursache" suchen, um darin den Wert von 'tigs auslesen zu können.
Ich habe bei Tests für eine Griffnotenschrift das Problem gehabt, daß ich die Position des Notenkopfes relativ zum Notenhals nicht Lilypond überlassen darf sondern selbst setzen muß. Zum Überfluß ist der Zahlenwert von X-offset aber davon abhängig, ob der Notenhals nach oben oder nach unten zeigt.
So erzeugte ich eine Funktion, welche zum Notenkopf den Notenhals sucht und dessen Richtung bestimmt, und abhängig von der Richtung den einen oder anderen Wert aus dem Grob des Notenkopfes zurückgibt. Diese Funktion konnte ich mit »\override NoteHead #'X-offset = #get-predefined-x« global setzen.
Beim Tweak dieser Hilfswerte in den Notenkopf-Grob (z. Bsp. » < \tweak #'xposUP #0.0 \tweak #'xposDOWN #1.25 c'>«) kam eine ganz ähnliche Warnungsmeldung:
Warnung: cannot find property type-check for xposUP
Warnung: Zuweisung wird trotzdem durchgeführt
Diese Warnungen konnte ich dann umgehen, indem der Tweak mittels einer Scheme-Prozedur ausgeführt wurde. Damit konnte ich sogar mehrere Werte zusammen übergeben (» < \StX #0.0 #1.25 c'>«), also mehrere Attribute für das Notehead-Grob gemeinsam setzen.
Beispiel:
StX = #(define-music-function (parser location xpos-down xpos-up music) (number? number? ly:music?)
(set! (ly:music-property music 'tweaks)
(acons 'xposDOWN xpos-down
(acons 'xposUP xpos-up
(ly:music-property music 'tweaks))))
music)
Ansonsten:
Nicht jedes Grob ist so einfach und eindeutig mit einem Attribut zu versehen wie der Notenkopf. An die Vorzeichen der Notenköpfe kommt man zum Beispiel nur indirekt - vielleicht am bequemsten mit einer before-line-breaking-Prozedur, welche Attribute vom Notenkopf auf dessen Vorzeichen überträgt.
Und um einen \prall in einen »Prall mit einem Vorzeichen darüber« zu verwandeln, dabei das Vorzeichen aber abhängig vom Pitch des zugehörigen Notenkopfes auszuwählen (damit \transpose möglich wird), hat man bei »\once \override Script #'before-line-breaking« noch das Problemchen, daß man auch andere Artikulationen (z. Bsp \upbow) auf der gleichen Note an die before-line-breaking-Prozedur angetragen bekommt.
Übrigens: vom reference-notehead (Grob) zum Pitch ging's beim \prall via »(ly:event-property (event-cause reference-notehead) 'pitch)«.
Arnold