Deutsches Lilypond Forum (Archiv)

Notationsspezifisch => Noten für Gitarre => Thema gestartet von: Castor am Sonntag, 9. Februar 2014, 10:13

Titel: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag 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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: fugenkomponist am Sonntag, 9. Februar 2014, 11:02
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
          #})
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: eluze am Sonntag, 9. Februar 2014, 11:15
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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: Castor am Sonntag, 9. Februar 2014, 13:22
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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: eluze am Sonntag, 9. Februar 2014, 14:25
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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: fugenkomponist am Sonntag, 9. Februar 2014, 15:29
@ 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 …
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: Castor am Sonntag, 9. Februar 2014, 15:56
@ Eluze: Tausend Dank, so gefällt mir das!! :D

@ fugenkomponist: kein problem, nächstes mal tu ich ein einfaches bsp dazu ;)
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: harm6 am Sonntag, 9. Februar 2014, 23:03
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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: eluze am Montag, 10. Februar 2014, 00:24

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
Zitat
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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: Castor am Montag, 10. Februar 2014, 13:57
auch wenn ich von diesem funktions-kram eig keine ahnung hab, schalt ich mich nochmal ein ;)

Zitat
#(define-event-function ist  hier offenbar besser als #(define-music-function

inwiefern?

Zitat
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 ..?
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: eluze am Montag, 10. Februar 2014, 16:00
Zitat
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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: Castor am Dienstag, 11. Februar 2014, 18:30
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 ...
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: eluze am Dienstag, 11. Februar 2014, 20:48
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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: trulli am Donnerstag, 13. Februar 2014, 20:10
andere meinungen?

Nein.  :D
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: harm6 am Freitag, 14. Februar 2014, 02:35
Zitat von: Castor
auch wenn ich von diesem funktions-kram eig keine ahnung hab, schalt ich mich nochmal ein ;)

Zitat
#(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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: trulli am Samstag, 15. Februar 2014, 10:43
"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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: eluze am Samstag, 15. Februar 2014, 11:39
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
Titel: Re: TextSpanner-Befehl für Barré-Angabe abkürzen
Beitrag von: trulli am Samstag, 15. Februar 2014, 13:12
\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