Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: harm6 am Sonntag, 17. März 2013, 16:30
-
Hallo zusammen,
Problem:
Ich würde gerne eine Klammer und eine Linie als markup so darstellen, daß beide dieselbe Länge haben und den selben Eingabewert für die Bestimmung der Länge benutzen. Das Ganze soll auch mit unterschiedlichen staff-sizes bzw global-staff-sizes funktionieren.
Die Klammer ist als \markup \left-brace #... erhältlich.
Die Linie natürlich als \markup \draw-line #...
Allerdings benutzt \left-brace pt als Einheit und gibt somit eine absolute Größe zurück, während \draw-line staff-spaces als Einheit benutzt und also relative ist.
Ich muß also einige Berechnungen durchführen damit das klappt. Dazu brauche ich die Einheiten pt und staff-height.
Diese scheinen jedoch nur in \paper erhältlich zu sein.
Folgender Code funktioniert auch
\paper {
#(display "\n\t\tpt\t\t ")
#(write pt)
#(display "\n\t\tstaff-height\t ")
#(write staff-height)
}allerdings nur, solange man sich innerhalb von \paper bewegt.
Sobald man außerhalb von \paper auf top-level #(write pt) versucht gibts einen error wegen "Unbound variable: pt"
Ich habe auch versucht aus einem markup-command heraus mittels einer rekursiven Prozedur diese Werte aus dem absoluten top-level-layout auszulesen, bekam aber nur die relativen, d.h. schon skalierten Werte (siehe das dummy-markup-command unten).
Mein derzeitiger workaround:
Ich definiere my-pt, my-staff-height und my-line-thickness als leere Listen und redefiniere diese aus \paper heraus.
Das markup-command `dummy" macht zwei Dinge (oder eben nicht)
a) Es sollte pt, staff-height etc auslesen. Funktioniert aber nicht wie erwartet. s.o.
b) Es benutzt my-pt, my-staff-height und my-line-thickness um eine Klammer und eine Linie auszugeben.
(Da die Klammern nicht in jeder Größe erhältlich sind, gibt es manchmal kleinere, im Moment akzeptable Unterschiede.
\version "2.16.2"
% Must be before \paper !!
#(set-global-staff-size 20)
#(define my-pt '())
#(define my-staff-height '())
#(define my-line-thickness '())
\paper {
#(display "\n\t\tpt\t\t ")
#(write pt)
#(display "\n\t\tstaff-height\t ")
#(write staff-height)
#(display "\n\n\t\ttest:")
#(display "\n\t\t(* pt 20)\t ")
#(write (* pt 20))
#(display "\n\t\tline-thickness\t ")
#(write line-thickness)
#(set! my-pt pt)
#(set! my-staff-height staff-height)
#(set! my-line-thickness line-thickness)
}
#(define (looking-up layout props symbol)
(define (ancestor layout)
"Return the topmost layout ancestor"
(let ((parent (ly:output-def-parent layout)))
(if (not (ly:output-def? parent))
layout
(ancestor parent))))
(ly:output-def-lookup (ancestor layout) symbol))
#(define-markup-command (dummy layout props size)
(number?)
"
A dummy.
Returns nearly equal sized brace and line.
(Sometimes the brace is a little taller. That's ok.)
Should display pt, staff-height, blot-diameter and line-thickness
from paper.
Though, it returns already scaled values.
"
(let* ((paper-pt (looking-up layout props 'pt))
(paper-staff-height (looking-up layout props 'staff-height))
(blot-diameter (looking-up layout props 'blot-diameter))
(line-thickness (looking-up layout props 'line-thickness))
(first-page-number (looking-up layout props 'first-page-number))
(factor (* 2 my-pt my-staff-height))
(mrkp (markup
;#:box
#:left-brace (* (+ (* my-line-thickness 2) size) factor)
#:vcenter
;#:box
#:draw-line `(0 . ,size)))
)
(display "\n\n\t======================================================\n")
(display "\n\t\tpaper-pt\t\t ")(write paper-pt)
(display "\n\t\tpaper-staff-height\t ")(write paper-staff-height)
(display "\n\t\t(* paper-pt 20)\t\t ")(write (* paper-pt 20))
(display "\n\t\tblot-diameter\t\t ")(write blot-diameter)
(display "\n\t\tline-thickness\t\t ")(write line-thickness)
(display "\n\t\tfirst-page-number\t ")(write first-page-number)
(interpret-markup layout props mrkp)))
\markup {
\dummy #5
bla bla bla
}
Das beste was man sagen kann: Es funktioniert.
Ich nenn sowas allerdings Fischertechnik.
Hat jemand eine Idee, wie man das besser hinbekommt?
Gruß,
Harm
-
Hallo Harm,
nur ein paar Gedanken vorab, bevor ich herumprobiere:
- wenn #(ly:pt num) und Konsorten nicht funktioniert
- z. Bsp. mit \abs-fontsize versuchen
- ein markup-Kommando schreiben, welches die Ausdehnung eines stencil (des »brace«) abfragt, und dann (isotrop oder anisotrop) auf eine gewünschte Größe skaliert.
- und danach suche ich mir weitere Anregungen in define-markup-commands.scm ...
Arnold
-
Hallo Arnold,
erstmal vielen Dank für Deine Anregungen.
Nachdem ich meinen post nochmal las, kam mir der Gedanke, daß er mißverständlich sein könnte.
Zur Klarstellung:
1. Es soll eine Methode gefunden werden eine Klammer + Linie mit demselben Eingabewert zur Größenbestimmung auszugeben, sodaß beide gleich hoch sind.
2. Dieses Ergebnis soll dann jedoch durch global-staff-size und/oder custom-staff-sizes skalierbar sein.
Ein Beispiel aus dem bestehenden Code wäre das SystemStartBrace - SystemStartBar - Paar.
#(ly:pt num)
Hatte ich nicht auf dem Schirm. Im Moment weiß ich noch nicht ob und wie mir das helfen könnte. Damit muß ich mich erstmal näher befassen.
\abs-fontsize
Da hatte ich dran gedacht, habe jedoch keine sinnvolle Methode gefunden es zu ganz oder in Teilen zu nutzen.
ein markup-Kommando schreiben, welches die Ausdehnung eines stencil (des »brace«) abfragt, und dann (isotrop oder anisotrop) auf eine gewünschte Größe skaliert.
Das geht. Mir persönlich geht das aber wieder zu sehr in Richtung Fischertechnik. ;)
Ein anderer Gedanke kam mir zwischenzeitlich noch:
Statt \left-brace kann man ja auch
\override #'(font-encoding . fetaBraces) \lookup #"brace130"
benutzen.
Diese Methode hat den Vorteil, daß sie skalierbar ist.
Vergleiche:
\version "2.16.2"
br¹ =
\markup \left-brace #40
\markup \box {
\fontsize #1 \br¹
\fontsize #2 \br¹
\fontsize #3 \br¹
\fontsize #4 \br¹
\fontsize #5 \br¹
\fontsize #6 \br¹
\fontsize #7 \br¹
}
mit
\version "2.16.2"
br² =
\markup {
\override #'(font-encoding . fetaBraces)
\lookup #"brace130"
}
\markup \box {
\fontsize #1 \br²
\fontsize #2 \br²
\fontsize #3 \br²
\fontsize #4 \br²
\fontsize #5 \br²
\fontsize #6 \br²
\fontsize #7 \br²
}
\lookup zu benutzen ist mir allerdings recht frisch eingefallen, da muß ich die Möglichkeiten noch ausloten.
Vielen Dank schonmal,
Harm
-
Hallo Harm,
vielleicht hilft Dir ja ganz einfach der Faktor output-scale, der im Markup über ly:output-def-lookup layout 'output-scale zur Verfügung steht.
Mit meinem kleine Testbeispiel kann man jedenfalls die global-staff-size beliebig verändern und sowohl Klammer als auch Strich bleiben immer gleich groß.
\version "2.16.2"
#(set-global-staff-size 30) % mit diesem Wert spielen
#(define-markup-command (harm-test layout props size) (number?)
(let ((osc (ly:output-def-lookup layout 'output-scale)))
(interpret-markup layout props
(markup #:concat (#:left-brace (* 2.9 osc size) #:lower (/ size 2) #:draw-line (cons 0 size))))))
\markup {
\harm-test #3
\harm-test #5
\harm-test #7
\harm-test #10
}
Die Klammergröße ist dann der Wert in Staff-Spaces, multipliziert mit dem ("experimentell" bestimmten ;)) Ausgleichsfaktor 2.9 und dem erwähnten Skalierungsfaktor.
Viele Grüße
Torsten
EDIT:
Gerade ausprobiert - man kann auch direkt den Umrechnungsfaktor eines Punktes (pt) in staff-spaces lesen, dann ist (ohne experimentellen Ausgleichsfaktor), dann muß man die staff-spaces einfach nur durch pt teilen und hat die entsprechenden Punkt-Werte. :)
Das obige Beispiel sähe dann so aus:
\version "2.16.2"
#(set-global-staff-size 30) % mit diesem Wert spielen
#(define-markup-command (harm-test layout props size) (number?)
(let ((pt (ly:output-def-lookup layout 'pt)))
(interpret-markup layout props
(markup #:concat (#:left-brace (/ size pt) #:lower (/ size 2) #:draw-line (cons 0 size))))))
\markup {
\harm-test #3
\harm-test #5
\harm-test #7
\harm-test #10
}
-
Hallo Torsten,
tausend Dank!!
Gerade ausprobiert - man kann auch direkt den Umrechnungsfaktor eines Punktes (pt) in staff-spaces lesen, dann ist (ohne experimentellen Ausgleichsfaktor), dann muß man die staff-spaces einfach nur durch pt teilen und hat die entsprechenden Punkt-Werte.
Da hätte ich auch selbst drauf kommen können.
Tatsächlich hatte ich "den Umrechnungsfaktor eines Punktes (pt) in staff-spaces" schon ausgelesen aber nicht erkannt, daß es genau das ist was ich brauche. ???
Kurzer Ausblick:
Ich beschäftige mich im Moment damit ein markup-command zu schreiben welches BarLines ausgeben soll.
-> Anhang 1
Eine mögliche Anwendung kann man in ->Anhang 2 sehen (mit doppelt gemoppelter BarLine ;D )
Den Code habe ich noch nicht gepostet. Er ist noch nicht so richtig ausgereift.
Viele Grüße,
Harm
-
Da hätte ich auch selbst drauf kommen können.
Tatsächlich hatte ich "den Umrechnungsfaktor eines Punktes (pt) in staff-spaces" schon ausgelesen aber nicht erkannt, daß es genau das ist was ich brauche. ???
Hallo Harm,
da bin ich aber froh... :)
Ich hatte befürchtet, Dich völlig mißverstanden zu haben, denn Du hast ja erstens zweifellos das nötige Hintergrundwissen und Handwerkszeug und zweitens schon mit 'pt hantiert, aber manchmal sieht man eben den Wald vor lauter Bäumen nicht.
Kurzer Ausblick: [...]
Das sieht doch schon sehr gut aus! Wiederholungsklammern "mit Ohren" sind ja auch genau das, was man im Jazz gerne hat und ich habe beobachet, daß auch bei klassischen Orchesterstimmen manche Musiker zuerst mal einen Stift in die Hand nehmen und Wiederholungsklammern deutlich kennzeichnen.
Zu Deinem Beispiel B im zweiten Anhang: schön, was man alles hindrehen kann, obwohl nach Elaines Meinung geschweifte Klammern immer nur außen stehen dürfen. ;)
Viele Grüße
Torsten
-
Hallo Torsten,
aber manchmal sieht man eben den Wald vor lauter Bäumen nicht.
Genau, oder man verrennt sich in eine Richtung, obwohl das Ziel direkt vor Augen läge, wenn man sich nur mal umdrehte. :)
Das sieht doch schon sehr gut aus! Wiederholungsklammern "mit Ohren" sind ja auch genau das, was man im Jazz gerne hat ...
Jep, mit den neueren devel-Versionen sind sie ja auch schon als echte BarLine erhältlich. Mir kommt es jetzt frauf an, sie auch in einem Text darstellbar zu machen.
schön, was man alles hindrehen kann, obwohl nach Elaines Meinung geschweifte Klammern immer nur außen stehen dürfen
Das feature in einer Zeile nach einer Unterbrechung eine kurze Coda schreiben zu können wird öfter mal nachgefragt. Ich versuche einen Code zu basteln mit dem das weitgehend automatisiert gemacht werden kann.
Neben verschiedenen Kleinigkeiten gibt es noch das große Problem wie lang ein zusätzlicher Taktstrich (mit oder ohne brace/bracket) denn sein soll. Dazu müßte man herausfinden wie die aktuelle Höhe des Sytems gerade ist.
Da habe ich jedoch noch keine richtige Ahnung wie ich das angehen könnte.
Meine frühere Frage harrt immer noch einer abschließenden Antwort.
https://liarchiv.joonet.de/index.php?topic=958.0
Elaine Gould muß ich mir wirklich mal zulegen.
Gruß,
Harm