Deutsches Lilypond Forum (Archiv)
Notationsspezifisch => Noten für Gitarre => Thema gestartet von: Castor am Sonntag, 9. Februar 2014, 10:13
-
Wie kann ich diesen Befehl
\override TextSpanner #'(bound-details left text) = \markup { \upright "X " }
so abkürzen, dass ich nur noch das, was in den Anführungszeichen steht, zu schreiben brauch? Also etwas wie:
\barre "X "
Ist das möglich? Vielen Dank schonmal!
lg Castor
-
Das ist möglich. Folgender Code ist ungetestet (mangels kompilierbarem Beispiel, bitte in Zukunft immer eins angeben):
\version "2.18.0"
barre = #(define-music-function
(parser location str)
(string)
#{
\override TextSpanner.bound-details.left.text = \markup \upright #str
#})
-
Wie kann ich diesen Befehl
\override TextSpanner #'(bound-details left text) = \markup { \upright "X " }
so abkürzen, dass ich nur noch das, was in den Anführungszeichen steht, zu schreiben brauch? Also etwas wie:
\barre "X "
hier wird das leerzeichen eingesetzt und der spanner gleich gestartet.
anführungszeichen sind bei einfachen zeichenfolgen nicht nötig.
\version "2.19.2"
bx=#(define-music-function
(parser location str)
(string?)
#{ \override TextSpanner.bound-details.left.text=\markup \upright \concat {$str " "}
<> \startTextSpan
#})
\relative c'{
c d \bx IIX d c
c c c \stopTextSpan f,
c'1
}Eluze
-
Vielen Dank!
@ Eluze: ist es auch möglich, dass der \bx-befehl sich genauso verhält wie der \startTextSpanner-befehl, also der spanner an der note startet, an die der befehl hinten dran gesetzt ist, und nicht erst bei der nächsten? ist zwar nicht soooo wichtig, würde mir aber besser gefallen. das wäre lieb (:
denn z.b. bei folgendem code\version "2.18.0"
bx = #(define-music-function
(parser location str)
(string?)
#{ \override TextSpanner.bound-details.left.text =
\markup \upright \concat {$str " "}
<> \startTextSpan
#})
\relative c'' {
\bx III \acciaccatura f,8 g d' bes g' \acciaccatura { e16-4 d-1 }
<e-3>8 bes g' d\stopTextSpan | }
beginnt die röm III schon über dem acciaccatura-f und nicht über g danach und überhaupt wäre es so praktischer. denn einfach so:
\acciaccatura \bx III f,8 g d' ... usw.
geht es leider nicht.
@ fugenkomponist: ich hatte nur nach so einem "barre = define blablabla" dingens gesucht, wie du und Eluze für mich gemacht habt, und deshalb nicht dran gedacht, dass ein beispiel vllt hilfreich wäre. aber hättest es ja einfach an .. was weiß ich ..
\relative c' { c1 c c }
oder so ausprobieren können, was vllt sogar schneller gegangen wäre als es auf irgendein bsp von mir anzuwenden ..
lg Castor
-
Vielen Dank!
@ Eluze: ist es auch möglich, dass der \bx-befehl sich genauso verhält wie der \startTextSpanner-befehl, also der spanner an der note startet, an die der befehl hinten dran gesetzt ist, und nicht erst bei der nächsten? ist zwar nicht soooo wichtig, würde mir aber besser gefallen.
so geht es nicht: bx definiert sowohl den text wie auch den startpunkt.
du kannst aber bx so definieren, dass nur der text dort definiert wird und dann normal deinen \startTextSpan und \stopTextSpan setzen.
bx = #(define-music-function
(parser location str)
(string?)
#{ \override TextSpanner.bound-details.left.text=\markup \upright \concat {$str " "}
#})
\relative c'' {
\acciaccatura f,8 \bx III g \startTextSpan d' bes g' \acciaccatura { e16-4 d-1 } <e-3>8 bes g' d\stopTextSpan |
}
Eluze
-
@ fugenkomponist: ich hatte nur nach so einem "barre = define blablabla" dingens gesucht, wie du und Eluze für mich gemacht habt, und deshalb nicht dran gedacht, dass ein beispiel vllt hilfreich wäre. aber hättest es ja einfach an .. was weiß ich ..
\relative c' { c1 c c }
oder so ausprobieren können, was vllt sogar schneller gegangen wäre als es auf irgendein bsp von mir anzuwenden ..
lg Castor
Sorry, ich hab halt nie oder fast nie TextSpanner verwendet … \relative c' { c1 c c } hätte ich auch noch selbst zusammen bauen können, aber ich hätte nicht auf Anhieb gewusst, was eigentlich ein TextSpanner ist und wie ich ihn da jetzt einsetze …
-
@ Eluze: Tausend Dank, so gefällt mir das!! :D
@ fugenkomponist: kein problem, nächstes mal tu ich ein einfaches bsp dazu ;)
-
Hallo,
um den Text und den Startpunkt in eine Funktion zu packen kann man so vorgehen:
\version "2.18.0"
startBarr =
#(define-event-function (parser location str) (string?)
#{
\tweak TextSpanner.bound-details.left.text \markup \upright \concat { $str " " }
\startTextSpan
#})
stopBarr = \stopTextSpan
\relative c'' {
\acciaccatura f,8 g\startBarr III
d' bes g' \acciaccatura { e16-4 d-1 } <e-3>8 bes g' d\stopBarr |
}
oder ausgefeilter und mit mehr features:
\version "2.18.0"
startBarrB =
#(define-event-function (parser location str) (string?)
(let* ((mrkp (markup #:vcenter #:upright #:concat (str " "))))
(define (width grob text-string)
(let* ((layout (ly:grob-layout grob))
(props (ly:grob-alist-chain
grob
(ly:output-def-lookup layout 'text-font-defaults))))
(interval-length
(ly:stencil-extent
(interpret-markup layout props (markup text-string))
X))))
#{
\tweak TextSpanner.after-line-breaking
#(lambda (grob)
(let* ((mrkp-width (width grob mrkp))
(line-thickness (ly:staff-symbol-line-thickness grob)))
(ly:grob-set-nested-property!
grob
'(bound-details left padding)
(+ (/ mrkp-width -4) (* line-thickness 2)))))
\tweak TextSpanner.bound-details.left.text #mrkp
\tweak TextSpanner.bound-details.left-broken.text ##f
%% adjust the numeric values to fit your needs:
\tweak TextSpanner.bound-details.left-broken.padding 1.5
\tweak TextSpanner.bound-details.right-broken.padding 1
\tweak TextSpanner.bound-details.right.padding -1
\tweak TextSpanner.bound-details.right-broken.text ##f
\tweak TextSpanner.bound-details.right.text
\markup \draw-line #'(0 . -0.75)
\startTextSpan
#}))
stopBarrB = \stopTextSpan
\relative c'' {
\acciaccatura f,8 g\startBarrB "IX"
d' bes g' \acciaccatura { e16-4 d-1 } <e-3>8 bes g' d\stopBarrB
\break
\acciaccatura f,8 g\startBarrB "IX" d' bes g' \acciaccatura { e16-4 d-1 } <e-3>8 bes g' d
\break
g, d' bes g' \acciaccatura { e16-4 d-1 } <e-3>8 bes g' d\stopBarrB
}
HTH,
Harm
-
um den Text und den Startpunkt in eine Funktion zu packen kann man so vorgehen:
startBarr =
#(define-event-function (parser location str) (string?)
a { e16-4 d-1 } <e-3>8 bes g' d\stopBarr |
}
ahh - #(define-event-function ist hier offenbar besser als #(define-music-function
danke für den tip!
das folgende gefällt mir eigentlich nur als zusammenfassung aller(?) properties, da man ja jedesmal die ganze funktion ändern müsste um zu variieren
oder ausgefeilter und mit mehr features:
\version "2.18.0"
startBarrB =
#(define-event-function (parser location str) (string?)
...
wäre es angesichts der limitierten lagen nicht sinnvoller, die möglichen 19-20 lagen zu definieren
fretI=...
fretII=...
beste grüsse
Eluze
-
auch wenn ich von diesem funktions-kram eig keine ahnung hab, schalt ich mich nochmal ein ;)
#(define-event-function ist hier offenbar besser als #(define-music-function
inwiefern?
wäre es angesichts der limitierten lagen nicht sinnvoller, die möglichen 19-20 lagen zu definieren
fretI=...
fretII=...
warum limitiert? wenn man jetz \barre XX eingibt oder so geht das doch einwandfrei ..?
-
wäre es angesichts der limitierten lagen nicht sinnvoller, die möglichen 19-20 lagen zu definieren
warum limitiert? wenn man jetz \barre XX eingibt oder so geht das doch einwandfrei ..?
und noch einfacher wäre
c'''' \XX ...oder?
Eluze
-
achsooooooooo ah ok jetz weiß ich was du meinst - es gibt eh nur eine begrenzte anzahl an lagen und um die befehle zu verkürzen kann man einfach I=, II= ..... XII= definieren? na ob sich das lohnt ...
-
achsooooooooo ah ok jetz weiß ich was du meinst - es gibt eh nur eine begrenzte anzahl an lagen und um die befehle zu verkürzen kann man einfach I=, II= ..... XII= definieren? na ob sich das lohnt ...
ich brauche sehr selten solche lagebezeichnungen - aber im sinne einer einheitlichen + einfachen handhabung wäre es vielleicht gar nicht schlecht (und ich bin sicher dass jemand diese 20 definitionen mit einer funktion zu erstellen weiss, oder!?)
andere meinungen?
Eluze
-
andere meinungen?
Nein. :D
-
auch wenn ich von diesem funktions-kram eig keine ahnung hab, schalt ich mich nochmal ein ;)
#(define-event-function ist hier offenbar besser als #(define-music-function
inwiefern?
Eigentlich ist der wesentliche Punkt die Benutzung von \tweak.
define-music-function funktioniert damit auch:
\version "2.18.0"
brx = #(define-music-function (parser location str) (string?)
#{
\tweak TextSpanner.bound-details.left.text \markup \upright \concat { $str " " }
\startTextSpan
#})
\relative c'' {
\acciaccatura f,8 g-\brx "III" d' bes g' \acciaccatura { e16-4 d-1 } <e-3>8 bes g' d\stopTextSpan |
}
Allerdings muß man ein "-" vor den Funktionsaufruf setzen.
Ist hier also nur bequemer, "syntactic sugar".
Gruß,
Harm
-
"syntactic sugar".
...sehr schöne Formulierung. :D
Als Feintuning für harms Code schlage ich eine leichte Versetzung der Lagenangabe und einen Abschluss der verlängerten Linie am rechten Ende vor.
Ist aber - wie immer - Geschmackssache.
\version "2.18.0"
brx = #(define-music-function (parser location str) (string?)
#{
\tweak TextSpanner.bound-details.left.text \markup \upright \concat { \raise #-0.11 $str " " }
\tweak TextSpanner.bound-details.right.text \markup \draw-line #'(0 . -0.5)
\tweak TextSpanner.bound-details.right.padding -1.2
\startTextSpan
#})
\relative c'' {
\stemUp
e,4 f g8-\brx "III" b d c d e \stopTextSpan f2
}
Sag mal harm, kann ich eine \override TextSpanner #'style = #'solid auch als \tweak in die \brx-Funktion schreiben? Das habe ich nicht hinbekommen...
Grüße von Trulli
-
kann ich eine \override TextSpanner #'style = #'solid auch als \tweak in die \brx-Funktion schreiben? Das habe ich nicht hinbekommen...
warum nicht?
\tweak TextSpanner.style #'dashed-lineEluze
-
\tweak TextSpanner.style #'dashed-line
Ha, ha, danke. Auch nach vielen Jahren Lily kann man sich immer noch wie ein Anfänger vorkommen.... ::)
Mir ging es darum die übliche Schreibweise für das Beibehalten einer Saite darzustellen.
\version "2.18.0"
sta = #(define-music-function (parser location str) (string?)
#{
\tweak TextSpanner.bound-details.left.text \markup \vcenter \concat { \circle \number \fontsize #-5 $str " " }
\tweak TextSpanner.bound-details.right.text \markup \draw-line #'(0 . -0.5)
\tweak TextSpanner.bound-details.right.padding -1.2
\tweak TextSpanner.style #'solid
\startTextSpan
#})
stb = \stopTextSpan
\relative c'' {
\stemUp
e4 f b,8-\sta "2" c d c d e \stb g4 a g
}
Grüße von Trulli