Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: ingmar am Mittwoch, 23. Dezember 2015, 06:52
-
hallo,
ich finde die Trillerzeichen in manchen Fällen zu groß. Beispiel:
\version "2.18.2"
MUSIC = \relative c' { c d e\trill f g f e d\trill c1 }
\score {
\new Staff { \MUSIC }
}
Wahrscheinlich muss ich irgendwo sowas wie \override TrillSpanner #'font-size = #-3 ergänzen - aber allle meine Versuche führen nur zu Fehlermeldungen.
Ist die Zeile richtig? Wohin gehört sie?
Danke, Gruß,
--ingmar
-
Nein, TrillSpanner sind nur für Triller mit diesen gewellten Linien zuständig (\start|stopTrillSpan), \trill erzeugt ein Script (wie auch \fermata und Artikulationen), d. h. um „tr“ kleiner zu bekommen, müsstest du Script.fontsize per \override ändern.
Das hat aber den Nachteil, dass natürlich alle anderen Artikulationen mit geändert werden. Ich würde daher einen eigenen Trillerbefehl benutzen:\version "2.18.2"
ttrill =
#(define-event-function () ()
#{
-\single \override Script.font-size = -3
\trill
#})
MUSIC = \relative c' {
c d\fermata e\trill f
\override Script.font-size = -3
g f\fermata e\trill d
\revert Script.font-size
c d\fermata e\ttrill f
g1
}
\score {
\new Staff { \MUSIC }
}Hier hab ich die font-size mal auf -3 gesetzt, um das Ergebnis deutlicher zu machen, in der Anwendung würde wahrscheinlich -1 oder -1.5 reichen.
Eine Alternative ab Version 2.19.12 wäre es, den Font „Cadence“ zu verwenden (hier (https://fonts.openlilylib.org/) zu finden). Der sieht Feta (LilyPonds Standardfont) sehr ähnlich, macht ein paar Zeichen (z. B. „tr“ und Trillspanner, Violinschlüssel, ganze Note und Auflösungszeichen) etwas ausgewogener (im Falle von „tr“ einfach das t nach oben kürzer).
Edit: im zweiten Bild mal das Ergebnis mit Cadence. Auch in Version 2.18.2 gehts schon, aber ab 2.19.12 wirds einfacher, andere Notenfonts zu verwenden ;)
-
Ich hab' mal versucht das ganze allgemeiner zu machen.
Wär ja schön mit einem override, den man dann auch ins layout setzen kann, alle Scripts eines bestimmten Typs ansprechen zu können.
Ich bin noch nicht ganz zufrieden aber soweit klappt es:
\version "2.18.2"
#(define (get-script-type grob)
"Get the type of a Script with the direction-indicator (if any),
outputs a string."
(let* ((script-stencil (ly:grob-property grob 'script-stencil))
(direction (ly:grob-property grob 'direction))
(dir-script-type
(if (and (pair? script-stencil) (pair? (cdr script-stencil)))
(if (>= 0 direction)
(cadr script-stencil)
(cddr script-stencil))
'())))
;(write-me "\n\tscript-type: " dir-script-type)
dir-script-type))
#(define ((set-font-size-for-certain-scripts scripts value) grob)
"Sets @code{font-size} to @var{value} for all script-types of @var{scripts}.
@var{scripts} needs to be a single string or a list of strings."
(if (or (string? scripts)
(and (list? scripts)
(every string? scripts)))
(for-each
(lambda (type)
(if (or (string=? type (get-script-type grob))
(string=? type (string-drop (get-script-type grob) 1)))
(ly:grob-set-property! grob 'font-size value)))
(if (string? scripts)
(list scripts)
scripts))
(ly:error "~a needs to be a string or list of strings" scripts)))
setScriptTypeFontsize =
#(define-music-function (parser location types fs)(string-or-pair? number?)
"Sets @code{font-size} to @var{fs} for script-types of @var{types}"
;; TODO keep previous overrides of 'before-line-breaking
#{
\temporary
\override Script.before-line-breaking =
#(set-font-size-for-certain-scripts types fs)
#})
%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%%
%% affect only Fermata below Staff
{
\setScriptTypeFontsize
"dfermata"
#-8
c'^\fermata
c'_\fermata
}
%% affect all Fermata
{
\setScriptTypeFontsize
"fermata"
#-8
c'^\fermata
c'_\fermata
}
%% affect selected Scripts
%% Limitation: if a certain script-type has the same type for both, below and
%% above Staff, both are selected
{
\setScriptTypeFontsize
#'("trill" "dfermata")
#-8
c'^\fermata
c'_\fermata
c'^\trill
c'_\trill
}
HTH,
Harm
-
...erstmal vielen Dank für den Aufwand!
Um ganz ehrlich zu sein: Das Trillerzeichen sieht in dieser Schrift nach meiner bescheidenen Meinung immer schrecklich aus - jedenfalls, wenn es häufig vorkommt. Und wo man es jetzt in klein sehen kann, sehe ich, dass das unabhängig von der Größe ist; es fügt sich typographisch einfach nicht ein, und in kleiner Größe wird das nicht besser, eher schlimmer. Wenn Lilypond 2.20 rauskommt, werde ich wohl für meine Partituren einen anderen Zeichensatz wählen, gerade mit Blick auf die Verzierungen. Gegenwärtig ist mir das noch zuviel Aufwand.
Ich hab in meinem Fall das Trillerzeichen einfach durch etwas anderes ersetzt. Es ist aber gut zu wissen, dass man auf die Größe der anderen Zeichen Einfluss hat. Eine Fermate ist sicher ein Kandidat, wo ich das mal einsetzen werde.
Weniger schön ist es, zu sehen, wieviel Scheme-Code dazu notwendig war. Ich hatte die Vorstellung (und Hoffnung), man könne einfach irgendwo die Größe mit Trill.size = -1 oder sowas angeben und wär durch mit dem Thema. Offenbar geht das nicht so einfach.
Also, nochmal danke für die Mühe; es gibt sicher jemand, dem das nützlich sein wird.
Gruß,
--ingmar
-
Um ganz ehrlich zu sein: Das Trillerzeichen sieht in dieser Schrift nach meiner bescheidenen Meinung immer schrecklich aus
Finde ich nicht, aber das ist natürlich Ansichtssache...
Wenn Lilypond 2.20 rauskommt, werde ich wohl für meine Partituren einen anderen Zeichensatz wählen, gerade mit Blick auf die Verzierungen. Gegenwärtig ist mir das noch zuviel Aufwand.
Ich sehe im Moment keine Entwicklung, daß es mit 2.20 einfacher werden wird als mit einer aktuellen devel-version. Das größte Hindernis für eine 2.20.-release scheint die fehlende guilev2-Unterstützung zu sein. Aber auch hier sehe ich momentan keinen Fortschritt.
Falls kein Meinungsumschwung stattfindet guilev2 auf 2.22 zu verschieben, wirst Du noch lange warten müssen.
Warum kein upgrade auf die aktuelle devel?
Weniger schön ist es, zu sehen, wieviel Scheme-Code dazu notwendig war. Ich hatte die Vorstellung (und Hoffnung), man könne einfach irgendwo die Größe mit Trill.size = -1 oder sowas angeben und wär durch mit dem Thema. Offenbar geht das nicht so einfach.
Es gibt keine Möglichkeit ein einzelnes Script separat anzusprechen.
Wenn ich also eine solche Möglichkeit neu schaffe ist einiges an fundamentaler Codierung zu leisten. Tatsächlich finde ich den scheme-code nicht besonders umfangreich, insbesondere wenn man bedenkt, daß ca ein Drittel davon Dokumentation und Kommentar ist. Oder dazu dient es DAU-sicher zu machen, indem bei Bedarf hübsche errors/warnings ausgegeben werden.
Nichtsdestotrotz hier noch eine überarbeitete, noch allgemeinere Fassung:
\version "2.19.32"
#(define (get-script-type grob)
"Get the type of a Script with the direction-indicator (if any),
outputs a string."
(let* ((script-stencil (ly:grob-property grob 'script-stencil))
(direction (ly:grob-property grob 'direction))
(dir-script-type
(if (and (pair? script-stencil) (pair? (cdr script-stencil)))
(if (>= 0 direction)
(cadr script-stencil)
(cddr script-stencil))
'())))
;(write-me "\n\tscript-type: " dir-script-type)
dir-script-type))
#(define script-names
;; Returns all script-types and their script-stencil-names as a list of strings
(append-map
(lambda (s)
(let ((script-stencils (cdr (assoc-get 'script-stencil (cdr s)))))
(cons (car s)
(list (car script-stencils) (cdr script-stencils)))))
default-script-alist))
#(define ((set-script-property scripts property value) grob)
"Sets @code{property} to @var{value} for all script-types of @var{scripts}."
(for-each
(lambda (type)
(if (not (member (symbol->string type) script-names))
(ly:warning "~a is not a Script, ignoring" type))
(if (or (eq? type (string->symbol (get-script-type grob)))
(eq? type
(string->symbol (string-drop (get-script-type grob) 1))))
(ly:grob-set-property! grob property value)))
scripts))
setScriptTypeProperty =
#(define-music-function (parser location types-property value)
(symbol-list? scheme?)
"Sets specified grob-property of @var{types-property} to @var{value} for
script-types of @var{types-property}"
;; TODO keep previous overrides of 'before-line-breaking
(if (< (length types-property) 2)
(ly:warning "script-type or property missing in ~a, skipping \n~a"
types-property
(*location*)))
#{
\temporary
\override Script.before-line-breaking =
#(set-script-property
(drop-right types-property 1)
(car (last-pair types-property))
value)
#})
%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%%
%% affect only Fermata below Staff
{
\setScriptTypeProperty
dfermata.font-size #-8
c'^\fermata
c'_\fermata
}
%% affect all Fermata
{
\setScriptTypeProperty
fermata.font-size #-8
c'^\fermata
c'_\fermata
}
%% affect selected Scripts
%% Limitation: if a certain script-type has the same type for both, below and
%% above Staff, both are selected
{
\setScriptTypeProperty
trill.ufermata.font-size #-8
c'^\fermata
c'_\fermata
c'^\trill
c'_\trill
}
Gruß,
Harm
-
tl;dr alles off-topic, hat mit den Trillern nichts mehr zu tun, sorry
Ich sehe im Moment keine Entwicklung, daß es mit 2.20 einfacher werden wird als mit einer aktuellen devel-version. Das größte Hindernis für eine 2.20.-release scheint die fehlende guilev2-Unterstützung zu sein. Aber auch hier sehe ich momentan keinen Fortschritt.
Falls kein Meinungsumschwung stattfindet guilev2 auf 2.22 zu verschieben, wirst Du noch lange warten müssen.
Hat das nen besonderen Grund, dass man guilev2 noch in die 2.20 packen will? Ich mein, sonst scheinen die stabilen Versionen immer in 1–2 Jahren Abstand gekommen zu sein und 2.18.0 ist jetzt 24 Monate alt (und meiner Meinung nach hat sich ja auch genug schon getan, was eine neue stabile Version rechtfertigen würde, ich nutze schon seit Ewigkeiten nur noch 2.19). Und als Leute ungeduldig auf 2.18 gewartet haben hieß es „nur noch critical bugs verhindern die nächste stable“. Da gibts zwar im Moment noch welche, aber die haben ja mit guile nichts zu tun ;)
-
Ist guile 1.8 nicht schon seit einiger Zeit deprecated ?
Dann wäre ein neues Release damit keine gute Idee.
Davon abgesehen verstehe ich die ablehnende Haltung gegenüber den aktuellen devel Versionen nicht so ganz. Soweit ich das beurteilen kann laufen die stabiler als die 2.18.2 und haben darüber hinaus ein paar Notensatzfehler weniger. Ganz zu schweigen von den diversen neuen Funktionen.
Jedenfalls sehen einige meiner Noten mit 2.19.33 besser aus, als mit 2.18.2