Autor Thema: TextSpanner-Befehl für Barré-Angabe abkürzen  (Gelesen 10022 mal)

Castor

  • Member
TextSpanner-Befehl für Barré-Angabe abkürzen
« 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

fugenkomponist

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #1 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
          #})

eluze

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #2 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

Castor

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #3 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
« Letzte Änderung: Sonntag, 9. Februar 2014, 13:28 von Castor »

eluze

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #4 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

fugenkomponist

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #5 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 …

Castor

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #6 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 ;)

harm6

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #7 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

eluze

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #8 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

Castor

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #9 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 ..?

eluze

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #10 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

Castor

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #11 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 ...

eluze

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #12 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

trulli

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #13 am: Donnerstag, 13. Februar 2014, 20:10 »

harm6

  • Member
Re: TextSpanner-Befehl für Barré-Angabe abkürzen
« Antwort #14 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