Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: kilgore am Donnerstag, 19. Mai 2011, 13:04
-
Liebe Lilys,
Es geht um custom dynamik. Ich habe enige, die etwas lang sind (zB p, leggiero e dolce ). Die werden automatisch unter der Note zentriert. Ich kann mit einem override das verbessern, aber da es nur um manche, nicht alle, dynamik geht, würde ich das einfach gern in dem betroffenen custom dynamik eingeben. #:left-align bringt kine Fehlermeldung, tut aber auch nichts! Kennt jemand den richtigen Befehl dafür in Scheme?
besten Dank!
Kil
\version "2.12.3"
pptop = #(make-dynamic-script
(markup #:left-align
#:dynamic "pp"
#:normal-text #:italic "<"
#:dynamic "p"
#:normal-text #:italic ">"
#:dynamic "pp"
#:normal-text #:italic "etc. . ."
))
\relative c' {
%\override DynamicText #'self-alignment-X = #LEFT
c1 c1\pptop c1
}
-
Hallo kil,
der Befehl #:left-align ist völlig in Ordnung!!
Aber laut http://lilypond.org/doc/v2.12/input/lsr/0e/lily-d7d3650a.ly (http://lilypond.org/doc/v2.12/input/lsr/0e/lily-d7d3650a.ly) funktioniert "expicit alignment" nur in Verbindung mit \override DynamicText #'X-offset = #0 oder \override DynamicText #'X-offset = ##ff (-> Solution 6).
Der Code müßte also so aussehen:
\version "2.12.3"
pptop = #(make-dynamic-script
(markup #:line(
#:left-align
#:dynamic "pp"
#:normal-text #:italic "<"
#:dynamic "p"
#:normal-text #:italic ">"
#:dynamic "pp"
#:normal-text #:italic "etc. . ."
)))
\relative c' {
\override DynamicText #'X-offset = ##f
c1
c1\pptop
c1
}
Gruß,
Harm
-
Hallo kil,
angeregt durch einen Thread auf Old Nabble (http://old.nabble.com/Dynamic-%2B-text-aligned%3A-BEST-solution--td31881932.html) habe ich mich noch mal mit dem Thema befaßt und bin zu folgender Funktion gekommen:
\version "2.14.1"
#(define my-dynamic-alist '(
("pptop" . ("pp" "<" "p" ">" "pp" "etc" "" ". . ." ""))
("ffdolcef" . ("ff" "dolce" "" ">" "" "" "" "" "f"))
("pleggierodolce" . ("p" ", leggiero" "" "e" "" "dolce" "" "" ""))
("dolcecantabile" . ("" "dolce" "" "e" "" "cantabile" "" "" "" ""))
("fcantabile" . ("f" ", ma cantabile" "" "" "" "" "" "" ""))
("pquasieco" . ("p" ", quasi" "" "eco" "" "" "" "" ""))
("ffsubito" . ("ff" "subito" "" "" "" "" "" "" ""))
))
myDynamic =
#(define-music-function (parser location listPos)(string?)
(let* (
(firstExpr (list-ref (assoc listPos my-dynamic-alist) 1))
(MARKUP (markup ;#:whiteout
#:line (
#:dynamic firstExpr
#:hspace -0.3
#:normal-text #:italic (list-ref (assoc listPos my-dynamic-alist) 2)
#:dynamic (list-ref (assoc listPos my-dynamic-alist) 3)
#:normal-text #:italic (list-ref (assoc listPos my-dynamic-alist) 4)
#:dynamic (list-ref (assoc listPos my-dynamic-alist) 5)
#:normal-text #:italic (list-ref (assoc listPos my-dynamic-alist) 6)
#:dynamic (list-ref (assoc listPos my-dynamic-alist) 7)
#:normal-text #:italic (list-ref (assoc listPos my-dynamic-alist) 8)
#:dynamic (list-ref (assoc listPos my-dynamic-alist) 9)
)))
)
(make-music
'AbsoluteDynamicEvent
'tweaks
;; calculate centering for firstExpr
(list (cons 'X-offset (+ -0.5 (* -0.5 (string-length firstExpr)))))
'text
MARKUP
)))
%------------------------------ Test -------------------------------------------
\relative c''
{
a4 bes-\myDynamic "pptop" a a |
a bes a a |
a a a a |\break
a bes-\myDynamic "ffdolcef" a a |
a a a a |
a a a a |\break
a bes-\myDynamic "pleggierodolce" a a |
a a a a |
a a a a |\break
a bes-\myDynamic "dolcecantabile" a a |
a a a a|
a a a a |\break
a bes-\myDynamic "fcantabile" a a |
a a a a |
a a a a |\break
a bes-\myDynamic "pquasieco" a a |
a a a a |
a a a a |
}
"Bedienungsanleitung":
Zunächst wird die my-dynamic-alist nach folgendem Aufbau erstellt:
( Name . (Dynamik1 Text2 Dynamik3 Text4 Dynamik5 Text6 Dynamik7 Text8 Dynamik9))
Wenn der erste Ausdruck kein dynamisches Zeichen ist sollte "" stehen bleiben. (An anderen Stellen entsprechend)
Man kann also ziemlich viel reinschreiben! ;)
Die sich anschließende Funktion zentriert das erste Zeichen (falls es sich um Dynamik handelt) unter der Note. Falls in der alist "" zuerst und dann normaler Text kommt erfolgt einfaches left-align. Das Minus-Zeichen vor Aufruf der Funktion ist unbedingt erforderlich, sonst wird er der Aufruf der folgenden Note zugeordnet.
Custom-Dynamic einfach in einer Liste abzulegen finde eigentlich ich noch praktischer als die Definition via make-dynamic-script. Ideal wäre natürlich eine Einstellmöglichkeit wahlweise für left-, center- oder right-align aber das habe ich noch nicht hinbekommen.
Gruß,
Harm
-
Hey harm!
Wow, dass ist schon ziemlich cool! Eine Liste zu erstellen finde ich auch recht praktisch. Der zweite Teil davon ( myDynamic = ) finde ich etwas verwirrend, aber copy/paste war nie zu banal für mich ;)
U Rock!
-
Hallo kil,
ich habe noch etwas besseres gefunden und dafür einen neuen Thread angefangen. ->building and aligning custom-dynamics (https://liarchiv.joonet.de/index.php?topic=916.msg5074#msg5074)
Gruß,
Harm