Barré als music-function - Unattached TextSpanEvent

Begonnen von asmodeus, Mittwoch, 24. Februar 2021, 21:41

« vorheriges - nächstes »

asmodeus

Hallo zusammen,

ich bin Achim und neu im Forum (und auch bei Lilypond) *winkt in die Runde*.
Moechte gerne Barrés nach meinen Vorstellungen mit Lilypond setzen und habe mir dazu etwas aus diversen Quellen gebastelt. Das funktioniert soweit ganz gut (barre1.png):


\version "2.22"
startBarre=
#(define-event-function (parser location position strings-covered)
   (number? string?)
    #{

      \tweak bound-details.left.text
        \markup
          \column {
            \line { \concat { \roman C #(format #f "~@r" position) } }
            \line { \raise #1.8 \concat { \fontsize #-2 #strings-covered } }
          }
      \tweak font-size -1
      \tweak font-shape #'upright
      \tweak style #'line
      \tweak bound-details.left.padding #0
      \tweak bound-details.left.attach-dir #LEFT
      \tweak bound-details.right.attach-dir #RIGHT
      \tweak bound-details.right.text
        \markup
          \with-dimensions #'(0 . 0) #'(-.3 . 0)
          \draw-line #'(0 . -1)
      \startTextSpan
   #})

stopBarre = \stopTextSpan

keytime = {
  \key d \major
  \time 12/8
}

melody = \relative c' {
  \keytime

  r8 fis-2 e-0 fis4-2 cis8-1 b2.\3-4 |
  fis'8-2 d-3 \startBarre #2 #"2-3" cis-1 \stopBarre \startBarre #3 #"2-3" d-1 ais-1 cis-4\3\stopBarre b g b d-2 e-0 fis-2 |
  % siehe Frage 2:
  % fis'8-2 d-3 \barre #2 #"2-3" { cis-1 } \barre #3 #"2-3" { d-1 ais-1 cis-4\3} b g b d-2 e-0 fis-2 |
}

bass = \relative c {
  \keytime

  d,1. |
  d4.-0 fis-2 g-3  b-1 |
}

middle = \relative c' {
  \keytime
  s2 \startBarre #2 #"2-3" a8-1 s4 \stopBarre d8-3 fis-2 s4. | %3
}

lower = \relative c' {
  \keytime
  s1 s8 a-1 gis-1 fis-4 |
}

\score {
  \new StaffGroup \with {
    instrumentName = \markup { \rotate #90 "Guitar" }
  } <<
    \new Staff = "guitar" <<
      \context Voice = "melody" {
        \clef "G_8" \voiceOne
        \melody
      }
      \context Voice = "bass" {
        \clef "G_8" \voiceTwo
        \bass
      }
      \context Voice = "middle" {
        \clef "G_8" \voiceThree
        \middle
      }
      \context Voice = "lower" {
        \clef "G_8" \voiceFour
        \lower
      }
    >>
    \new TabStaff = "tab" <<
      \set Staff.stringTunings = #guitar-drop-d-tuning
      \context TabVoice = "melody tab" { \clef "moderntab" \voiceOne \melody }
      \context TabVoice = "bass tab"   { \clef "moderntab" \voiceTwo \bass }
      \context TabVoice = "middle tab" { \clef "moderntab" \voiceThree \middle }
      \context TabVoice = "lower tab" { \clef "moderntab" \voiceFour \lower}
    >>
  >>
}


Ein paar Verbesserungen wuerde ich gerne noch erreichen:

1. Statt \startBarre ... \stopBarre lieber \barre { ... } schreiben. Soweit ich Lilypond verstehe - und das tue ich nur begrenzt  ;) - brauche ich dafuer eine music-function statt einer event-function. Mein Versuch sieht so aus:


barre=
#(define-music-function (parser location position strings-covered music)
   (number? string? ly:music?)
    #{

      \tweak bound-details.left.text
        \markup
          \column {
            \line { \concat { \roman C #(format #f "~@r" position) } }
            \line { \raise #1.8 \concat { \fontsize #-2 #strings-covered } }
          }
      \tweak font-size -1
      \tweak font-shape #'upright
      \tweak style #'line

      \tweak bound-details.left.padding #0
      \tweak bound-details.left.attach-dir #LEFT
      \tweak bound-details.right.attach-dir #RIGHT
      \tweak bound-details.right.text
        \markup
          \with-dimensions #'(0 . 0) #'(-.3 . 0)
          \draw-line #'(0 . -1)
      \startTextSpan
      $music
      \stopTextSpan
   #})


Die zweite Zeile in melody mit der kommentierten Zeile getauscht ergibt einige Warnings, und der zweite Barré wird "verschluckt" (barre2.png):


/var/folders/wr/qd8vq3pj72s7wkr3rc5ls5j80000gn/T/frescobaldi-5x2u1ub3/tmpxk3mosku/document.ly:66:17: warning: Unattached TextSpanEvent
  <>fis'8-2 d-3
                \barre 2 #"2-3" { cis-1 } \barre #3 #"2-3" { d-1 ais-1 cis-4\3} b g b d-2 e-0 fis-2 |
/var/folders/wr/qd8vq3pj72s7wkr3rc5ls5j80000gn/T/frescobaldi-5x2u1ub3/tmpxk3mosku/document.ly:66:43: warning: Unattached TextSpanEvent
  <>fis'8-2 d-3 \barre 2 #"2-3" { cis-1 }
                                          \barre #3 #"2-3" { d-1 ais-1 cis-4\3} b g b d-2 e-0 fis-2 |
Interpreting music...
/var/folders/wr/qd8vq3pj72s7wkr3rc5ls5j80000gn/T/frescobaldi-5x2u1ub3/tmpxk3mosku/document.ly:66:17: warning: cannot find start of text spanner
  <>fis'8-2 d-3
                \barre 2 #"2-3" { cis-1 } \barre #3 #"2-3" { d-1 ais-1 cis-4\3} b g b d-2 e-0 fis-2 |
/var/folders/wr/qd8vq3pj72s7wkr3rc5ls5j80000gn/T/frescobaldi-5x2u1ub3/tmpxk3mosku/document.ly:66:17: warning: cannot find start of text spanner
  <>fis'8-2 d-3
                \barre 2 #"2-3" { cis-1 } \barre #3 #"2-3" { d-1 ais-1 cis-4\3} b g b d-2 e-0 fis-2 |
/var/folders/wr/qd8vq3pj72s7wkr3rc5ls5j80000gn/T/frescobaldi-5x2u1ub3/tmpxk3mosku/document.ly:66:43: warning: already have a text spanner
  <>fis'8-2 d-3 \barre 2 #"2-3" { cis-1 }
                                          \barre #3 #"2-3" { d-1 ais-1 cis-4\3} b g b d-2 e-0 fis-2 |
/var/folders/wr/qd8vq3pj72s7wkr3rc5ls5j80000gn/T/frescobaldi-5x2u1ub3/tmpxk3mosku/document.ly:66:43: warning: already have a text spanner
  <>fis'8-2 d-3 \barre 2 #"2-3" { cis-1 }
                                          \barre #3 #"2-3" { d-1 ais-1 cis-4\3} b g b d-2 e-0 fis-2 |


Ich weiss leider nicht genau was hier passiert, was koennte weiterhelfen? Ich hab tatsaechlich mal Lisp/Scheme programmiert, aber mir fehlt der domaenenspezifische Kontext zu Lilypond. Fuer Lesetipps oder Hinweise waere ich euch sehr dankbar  :)

2. Fuer kurze Barréanweisungen von nur einer Note - siehe Beispiel im zweiten Takt - wuerde ich gerne die Endmarkierung rechts und die horizontale Linie weglassen. Wie wuerde ich das in Abhaengigkeit der Laenge des Arguments machen?

3. Gibt es Ideen/Notation mit der man einen Barré in einer Stimme starten kann und in einer anderen beenden kann?

Danke,
Achim

trulli

#1
Hallo Achim,

herzlich willkommen hier!
Die Barre-Definition unter Gitarristen ist ein beliebtes Thema. ;) Hier mal die vor langer Zeit erstellte Definition vom User Comper, die ich hier unten verwendet habe. (https://archiv.lilypondforum.de/index.php/topic,412.msg2379.html#msg2379)

Allgemein sollte man sich klarmachen, dass eine umfangreiche Barredefinition das Auge beim Lesen belastet. Fingersätze und Barres sind immer Vorschläge etwas so oder so zu spielen, aber letztlich entscheidet immer der Gitarrist, ob er die Fingersätze anwendet oder nicht. In deinem Beispiel steht z.B. an dem Ton H einmal die 4 als Fingersatz und die 3 als Saitenangabe. Das wäre in deinem Falle überflüssig, weil mit den ersten Noten schon gleich klar ist, dass wir uns in der ersten Lage bewegen. Darum KANN eine 4 am Ton H nur bedeuten, dass wir auf der G-Saite sind.
Gleiches gilt für den Barre. Sollen die Zahlen unter dem CII (z.B. 2-3) die Saiten bedeuten? Das halte ich für überflüssig, weil je nach Vorliebe des Gitarristen ein kleiner oder großer Barre denselben Effekt hat. Auch ist es in deinem Beispiel überflüssig den Barre von Anfang an aufzusetzen, es reicht vollkommen, wenn man ab der Note A den Barre aufsetzt.

Es ist also besser etwas wegzulassen und den Notentext luftiger zu machen. Das erhöht die Lesbarkeit. Man kann dem Gitarristen schon zutrauen, dass er mitdenkt und selbst Entscheidungen treffen kann.

Eine andere Sache ist noch die musikalische Notation. Du notierst im ersten Takt insgesamt 4 verschiedene Stimmen und das in einem 12/8-Takt. In Takt 2 sind es aber plötzlich nur zwei Stimmen. Versuche das mal zu bereinigen und gut lesbar zu machen. Ich habe mal unten einen Vorschlag dazu gemacht. Nach meiner Meinung reicht eine kleine Barreklammer in diesem Takt aus.

Zu 2) dann würde ich einfach nur ein \markup setzen (also ohne die Barre Definition)
Zu 3) soweit ich weiß, geht das nicht. Brauchst du das unbedingt? Denn die Definition in einer Stimme reicht doch, oder?

Grüße von Trulli

P.S.: Ich habe immer noch ne alte Lily-Version. Ich gelobe Besserung.  ;D


\version "2.18.2"
barre = #(define-music-function (parser location grow) (number?)
#{
  \override Arpeggio.stencil = #ly:arpeggio::brew-chord-bracket
  \once \override Arpeggio.positions  = #(lambda (grob)
    (let ((iv (ly:arpeggio::calc-positions grob))
          (grow-hi (max 0 (/ grow 2)))
          (grow-lo (min 0 (/ grow 2))))
      (cons (+ (car iv) grow-lo) (+ (cdr iv) grow-hi))))
  $(make-music 'EventChord 'elements (list (make-music 'ArpeggioEvent)))
#})


startBarre=
#(define-event-function (parser location position strings-covered)
   (number? string?)
    #{

      \tweak bound-details.left.text
        \markup
          \column {
            \line { \concat { \roman C #(format #f "~@r" position) } }
            \line { \raise #1.8 \concat { \fontsize #-2 #strings-covered } }
          }
      \tweak font-size -1
      \tweak font-shape #'upright
      \tweak style #'line
      \tweak bound-details.left.padding #0
      \tweak bound-details.left.attach-dir #LEFT
      \tweak bound-details.right.attach-dir #RIGHT
      \tweak bound-details.right.text
        \markup
          \with-dimensions #'(0 . 0) #'(-.3 . 0)
          \draw-line #'(0 . -1)
      \startTextSpan
   #})

stopBarre = \stopTextSpan

keytime = {
  \key d \major
  \time 12/8
}

melody = \relative c' {
  \keytime

  r8 fis-2 e-0  fis8 \barre #1 a, cis  b-4 d8-3 fis-2 ~ fis4.|
 
  % siehe Frage 2:
  % fis'8-2 d-3 \barre #2 #"2-3" { cis-1 } \barre #3 #"2-3" { d-1 ais-1 cis-4\3} b g b d-2 e-0 fis-2 |
}

bass = \relative c {
  \keytime

  d,1. |
 
}

middle = \relative c' {
  \keytime \stemDown
   | %3
}

lower = \relative c' {
  \keytime
  s1 s8 a-1
  gis-\tweak text #(markup #:concat (#:hspace -.5 #:hspace -1.6 #:raise 1  #:draw-line '(1 . -0.1) " 1"))-1 fis-4 |
}

\score {
  \new StaffGroup \with {
    instrumentName = \markup { \rotate #90 "Guitar" }
  } <<
    \new Staff = "guitar" <<
      \context Voice = "melody" {
        \clef "G_8" \voiceOne
        \melody
      }
      \context Voice = "bass" {
        \clef "G_8" \voiceTwo
        \bass
      }
      \context Voice = "middle" {
        \clef "G_8" \voiceThree
        \middle
      }
      \context Voice = "lower" {
        \clef "G_8" \voiceFour
        \lower
      }
    >>
    \new TabStaff = "tab" <<
      \set Staff.stringTunings = #guitar-drop-d-tuning
      \context TabVoice = "melody tab" { \clef "moderntab" \voiceOne \melody }
      \context TabVoice = "bass tab"   { \clef "moderntab" \voiceTwo \bass }
      \context TabVoice = "middle tab" { \clef "moderntab" \voiceThree \middle }
      \context TabVoice = "lower tab" { \clef "moderntab" \voiceFour \lower}
    >>
  >>
}

harm6

Hallo Achim,

ich übergehe mal trullis Gedanken zum allgemeinen Notensatz (Anzahl der Stimmen) und zur Sinnhaftigkeit solch ausführlicher Barré-Angaben, auch wenn ich dem meisten zustimme und seine Version besser finde (ich würde das obere Ende der Klammer allerdings noch etwas höher sehen wollen).

Stattdessen zu den technischen Fragen.
(a)
Bei der Anwendung Deiner eigenen event-function ist Dir ein Versehen passiert. Im zweiten Takt muß der Barré III auf dem vierten Achtel starten, nicht auf dem dritten.
(b)
Die event-function wird ja mit der Syntax: <note>\event-function angewendet.
Eine music-function mit ähnlicher Wirkung, die wie \music-function { note1 ... noteN } angewendet werden soll, muß also vor der Note mit der der TextSpanner startet aufgerufen werden. Sie muß aber sicherstellen, daß diese Note das \startTextSpan-postevent erhält.
Dazu kannst Du versuchen <>-\tweak ... \startTextSpan zu schreiben. Die postevents von dem leeren event-chord <> werden dann der nächsten sinnvollen Möglichkeit zugeschlagen. Ob das allerdings immer zum gewünschten Ergebnis führt solltest Du sorgfältig testen.
Führt zu:

\version "2.22.0"

barre=
#(define-music-function (parser location position strings-covered music)
   (number? string? ly:music?)
    #{
      <>
        -\tweak bound-details.left.text
          \markup
            \column {
              \line { \concat { \roman C #(format #f "~@r" position) } }
              \line { \raise #1.8 \concat { \fontsize #-2 #strings-covered } }
            }
        -\tweak font-size -1
        -\tweak font-shape #'upright
        -\tweak style #'line
       
        -\tweak bound-details.left.padding #0
        -\tweak bound-details.left.attach-dir #LEFT
        -\tweak bound-details.right.attach-dir #RIGHT
        -\tweak bound-details.right.text
          \markup
            \with-dimensions #'(0 . 0) #'(-.3 . 0)
            \draw-line #'(0 . -1)
        -\startTextSpan
      $music
      \stopTextSpan
   #})
   
keytime = {
  \key d \major
  \time 12/8
}

melody = \relative c' {
  \keytime

  r8 fis-2 e-0 fis4-2 cis8-1 b2.\3-4 |
  fis'8-2 \barre #2 #"2-3" { d-3  cis-1 } \barre #3 #"2-3" { d-1 ais-1 cis-4\3 } b g b d-2 e-0 fis-2 |
}

bass = \relative c {
  \keytime

  d,1. |
  d4.-0 fis-2 g-3  b-1 |
}

middle = \relative c' {
  \keytime
  \barre #2 #"2-3" { s2 a8-1 s4 } d8-3 fis-2 s4. | %3
}

lower = \relative c' {
  \keytime
  s1 s8 a-1 gis-1 fis-4 |
}

\score {
  \new StaffGroup \with {
    instrumentName = \markup { \rotate #90 "Guitar" }
  } <<
    \new Staff = "guitar" <<
      \context Voice = "melody" {
        \clef "G_8" \voiceOne
        \melody
      }
      \context Voice = "bass" {
        \clef "G_8" \voiceTwo
        \bass
      }
      \context Voice = "middle" {
        \clef "G_8" \voiceThree
        \middle
      }
      \context Voice = "lower" {
        \clef "G_8" \voiceFour
        \lower
      }
    >>
    \new TabStaff = "tab" <<
      \set Staff.stringTunings = #guitar-drop-d-tuning
      \context TabVoice = "melody tab" { \clef "moderntab" \voiceOne \melody }
      \context TabVoice = "bass tab"   { \clef "moderntab" \voiceTwo \bass }
      \context TabVoice = "middle tab" { \clef "moderntab" \voiceThree \middle }
      \context TabVoice = "lower tab" { \clef "moderntab" \voiceFour \lower}
    >>
  >>
}


(c)
Ein Barré für eine einzelne Note oder einen einzelnen Akkord, ist mit einem TextSpanner nicht darstellbar, da Du den TextSpanner nicht zum selben Zeitpunkt starten und enden lassen kannst. In solch einem Fall folge trullis Vorschlag.
(d)
Spanner wie der TextSpanner können per default nicht in verschiedenen Stimmen gestartet und beendet werden, es sei denn Du verlegst den entsprechenden engraver vom Voice- in den Staff-context.
Allerdings hat der TextSpanner die default-Beschränkung, daß nur einer pro Voice gleichzeitig möglich ist. Diese Beschränkung würde dann für den Staff-context gelten. Ich würde davon abraten, auch wenn es vielleicht möglich wäre TextSpanner mit unterschiedlicher spanner-id zu unterscheiden (so wie bei Slur, siehe NR). Wenn ich mich recht erinnere ist das für TextSpanner allerdings nicht per default implementiert, kann aber mit jeder Menge Zusatzcode ermöglicht werden. Hab ich jetzt aber nicht weiter nachgeforscht...


Allgemeine Gedanken zum Barré.

Ein Barré-Zeichen kann ja folgende Elemente beinhalten:
- zur linken eine vertikale Linie, die bis zur tiefsten Barré-Note reicht, evtl. dort eine kurze horizontale Linie (siehe Bild im Anhang)
- die Angabe der Lage, evtl mit "C", "B" oder ähnlichem
- horizontale Linie über den Noten als Angabe wie lange der Barré gelten soll
- eine kurz vertikale Linie als Abschluss

Somit unterläge der Barré mit seiner horizontalen Ausdehnung der outside-staff-priority, sowie anderen Faktoren, die ihn nach oben bzw unten schieben können.
Das hat aber natürlich direkte Auswirkungen auf die benötigte Länge der linken vertikalen Linie, die ihrerseits evtl der script-priority unterliegt. Was dann wieder Auswirkungen auf die benötigte horizontale Länge hat.
Alle dafür benötigten Werte sind aber bestenfalls bei Beendigung des Barré verfügbar.

Alle Versuche den Barré mittels eines anderen grobs zu erhalten sind hier dann aufgeschmissen und haben außerdem den Nachteil, daß das dann verwendete grob nicht mehr zum selben Zeitpunkt verwendet werden kann.
Hier der TextSpanner, in Compers Code das Arpeggio.

Eigentlich muß also ein neues grob geschaffen werden.
Tatsächlich habe ich schon des öfteren neue grobs codiert, bin aber bislang daran gescheitert diesem neuen (Barré-)grob einen stencil zuzuweisen, der obige Kriterien auch umsetzen kann.

Insoweit verwende ich meistens eine simple Implementierung via TextSpanner, deutlich einfacher als Deine eigene, und nehme weitere Einstellungen manuell mit zusätzlichen tweaks und overrides vor, da ich die Erfahrung gemacht hab, daß häufig Anpassung bei details.left/right.padding erforderlich sind. Diese in einer Funktion mit zu geben reduziert Verständlichkeit und Lesbarkeit des Codes, imho.

Aber wer weß, vielleicht komme ich ja noch dahinter wie ich ein Barré-grob sinnvoll codieren kann.


Gruß,
  Harm

asmodeus

Zitat von: trulli am Samstag, 27. Februar 2021, 14:42
Hallo Achim,

Hallo trulli, Vielen Dank :)

Zitat von: trulli am Samstag, 27. Februar 2021, 14:42
Allgemein sollte man sich klarmachen, dass eine umfangreiche Barredefinition das Auge beim Lesen belastet. Fingersätze und Barres sind immer Vorschläge etwas so oder so zu spielen, aber letztlich entscheidet immer der Gitarrist, ob er die Fingersätze anwendet oder nicht. In deinem Beispiel steht z.B. an dem Ton H einmal die 4 als Fingersatz und die 3 als Saitenangabe. Das wäre in deinem Falle überflüssig, weil mit den ersten Noten schon gleich klar ist, dass wir uns in der ersten Lage bewegen. Darum KANN eine 4 am Ton H nur bedeuten, dass wir auf der G-Saite sind.
Du hast voellig Recht dass die Seitenangabe (eingekreist) redundant ist - ich hatte das in meinem kompletten Quelltext versteckt, im Minimalbeispiel aber nicht mit eingebunden.

ZitatGleiches gilt für den Barre. Sollen die Zahlen unter dem CII (z.B. 2-3) die Saiten bedeuten? Das halte ich für überflüssig, weil je nach Vorliebe des Gitarristen ein kleiner oder großer Barre denselben Effekt hat. Auch ist es in deinem Beispiel überflüssig den Barre von Anfang an aufzusetzen, es reicht vollkommen, wenn man ab der Note A den Barre aufsetzt.
Ich verwende diese Noten als Erinnerung fuer mich selbst, d.h. ich moechte moeglichst genau dokumentieren wie ich ein Stueck erlernt habe. Dementsprechend ausfuehrlich sind sie, und natuerlich auch nur auf mich anwendbar :)
Der Barre ab A ist denke ich genau so notiert wie Du vorschlaegst (siehe Stimme "middle", die mit s2 beginnt und den Barre ab a hat). Mein Code ist aber anscheinend nicht in der Lage das korrekt zu setzen...


Zitat
Eine andere Sache ist noch die musikalische Notation. Du notierst im ersten Takt insgesamt 4 verschiedene Stimmen und das in einem 12/8-Takt. In Takt 2 sind es aber plötzlich nur zwei Stimmen. Versuche das mal zu bereinigen und gut lesbar zu machen. Ich habe mal unten einen Vorschlag dazu gemacht. Nach meiner Meinung reicht eine kleine Barreklammer in diesem Takt aus.
Stimmt, es ist hier etwas verwirrend - das ist auch dem Umstand geschulded dass ich nur einen Auszug gepostet habe. Die Mehrstimmigkeit kommt beim Rest des Stueckes voll zum tragen (es ist die Prelude aus BWV 998, spannende Interpretationsansaetze lassen sich z.B. bei Hoppstock nachlesen).

Ich mag die Barreklammer, das uebernehme ich gerne aus Deinem Beispiel. Vielen Dank fuer Deinen Vorschlag!

Zitat
Zu 2) dann würde ich einfach nur ein \markup setzen (also ohne die Barre Definition)
Stimmt, das macht es einfacher. Da hab ich vielleicht zu kompliziert gedacht.

Zitat
Zu 3) soweit ich weiß, geht das nicht. Brauchst du das unbedingt? Denn die Definition in einer Stimme reicht doch, oder?
Das waere praktisch, dann koennte ich unabhaengig von der Stimme Barreeanweisungen setzen, ohne mich versteckter Noten oder Pausen zu bedienen. Mein Beispiel in der Prelude war ein Barre der ab einem Ton in einer anderen Stimme bereits aufgelegt werden soll, und dann in dieser Stimme endet.

asmodeus

Zitat von: harm6 am Sonntag, 28. Februar 2021, 09:19
Hallo Achim,

Hallo Harm,

Vielen Dank fuer Deine ausfuehrliche Erklaerung! Ich lerne jeden Tag dazu...

Zitat

Stattdessen zu den technischen Fragen.
(a)
Bei der Anwendung Deiner eigenen event-function ist Dir ein Versehen passiert. Im zweiten Takt muß der Barré III auf dem vierten Achtel starten, nicht auf dem dritten.
Es ist so gedacht wie es notiert ist: auf dem dritten Achtel (cis) startet der Barre in II und fuer die vierte Achtel (d) rutscht der 1. Finger nach III. Deine Erklaerung in (c) bzgl. Barree auf einer einzelnen Note macht mir aber klar was schief geht.

Zitat
(b)
Die event-function wird ja mit der Syntax: <note>\event-function angewendet.
Eine music-function mit ähnlicher Wirkung, die wie \music-function { note1 ... noteN } angewendet werden soll, muß also vor der Note mit der der TextSpanner startet aufgerufen werden. Sie muß aber sicherstellen, daß diese Note das \startTextSpan-postevent erhält.
Dazu kannst Du versuchen <>-\tweak ... \startTextSpan zu schreiben. Die postevents von dem leeren event-chord <> werden dann der nächsten sinnvollen Möglichkeit zugeschlagen. Ob das allerdings immer zum gewünschten Ergebnis führt solltest Du sorgfältig testen.
Danke! Ich schaue mir das im kompletten Stueck einmal an...

Zitat
(c)
Ein Barré für eine einzelne Note oder einen einzelnen Akkord, ist mit einem TextSpanner nicht darstellbar, da Du den TextSpanner nicht zum selben Zeitpunkt starten und enden lassen kannst. In solch einem Fall folge trullis Vorschlag.
Koennte man eine Art "dummy" hinzufuegen der so etwas moeglich macht?

Zitat
(d)
...

Alle dafür benötigten Werte sind aber bestenfalls bei Beendigung des Barré verfügbar.

Eigentlich muß also ein neues grob geschaffen werden.
Danke fuer die Erklaerung was hier in Lilypond passiert. Ich werde mir mal "grobs" zu Gemuete fuehren. Ist eigtl. bekannt woher der Name "grob" kommt?

Zitat
Insoweit verwende ich meistens eine simple Implementierung via TextSpanner, deutlich einfacher als Deine eigene, und nehme weitere Einstellungen manuell mit zusätzlichen tweaks und overrides vor, da ich die Erfahrung gemacht hab, daß häufig Anpassung bei details.left/right.padding erforderlich sind. Diese in einer Funktion mit zu geben reduziert Verständlichkeit und Lesbarkeit des Codes, imho.
Ich wuerde so etwas wie Darstellung eines Barré gerne an einer Stelle zentral loesen und moeglichst wenig "Handarbeit" in einzelne Stellen stecken. Aber ganz sicher steckt der Teufel im Detail, und dann sind die Moeglichkeiten anzupassen sehr hilfreich.

VG,
Achim

harm6

ZitatKoennte man eine Art "dummy" hinzufuegen der so etwas moeglich macht?
Ja, macht aber mehr Ärger als es Wert ist.

ZitatIst eigtl. bekannt woher der Name "grob" kommt?
grob = "graphical object"

HTH,
  Harm

trulli

ZitatJa, macht aber mehr Ärger als es Wert ist.
:D

@Achim
Hast du T3+4 vom BWV 998 gepostet? Dann ginge es aber falsch weiter, weil Bach keine punktierte Viertelbewegung in den Bass geschrieben hat. Oder meinst du ein anderes Stück?

@harm
He, he, ich hatte vergessen, wie genau ihr hier seid und du hast natürlich völlig recht, wenn du die Länge meines Barres bemängelst. Das habe ich gleich mal korrigiert.  8)
Manchem mögen diese Millimeterbruchteile pedantisch erscheinen, aber gerade das finde ich hier im Forum super.


asmodeus

Zitat von: trulli am Dienstag,  2. März 2021, 23:05
ZitatJa, macht aber mehr Ärger als es Wert ist.
:D

Haha  :) Was fuer einen Dummy koennte man denn nehmen? Frage fuer einen Freund...  ;)

Zitat
Hast du T3+4 vom BWV 998 gepostet? Dann ginge es aber falsch weiter, weil Bach keine punktierte Viertelbewegung in den Bass geschrieben hat. Oder meinst du ein anderes Stück?
Ja, es ist die Prelude aus BWV 998. Du hast Recht, da sind Achtelpausen zwischen den Vierteln notiert im Urtext. Meine Interpretation davon - und die moechte ich notieren - ignoriert die Pausen und laesst die Baesse durchklingen 8)

Zitat
He, he, ich hatte vergessen, wie genau ihr hier seid und du hast natürlich völlig recht, wenn du die Länge meines Barres bemängelst. Das habe ich gleich mal korrigiert.  8)
Manchem mögen diese Millimeterbruchteile pedantisch erscheinen, aber gerade das finde ich hier im Forum super.
Das ist auch der Hauptgrund warum ich anderen Programmen den Ruecken gekehrt habe... Endlich programmieren statt "WYSIWYG" ;-)

trulli

Zitat von: asmodeus am Mittwoch,  3. März 2021, 08:57
Ja, es ist die Prelude aus BWV 998. Du hast Recht, da sind Achtelpausen zwischen den Vierteln notiert im Urtext. Meine Interpretation davon - und die moechte ich notieren - ignoriert die Pausen und laesst die Baesse durchklingen 8)
Ich habe den Urtext dieses Stückes in der NBA (Neue Bachausgabe). Da stehen nur zwei Noten im Bass. Auch in meinen Gitarrentranskriptionen stehen nur zwei Noten. Bei dir sind es aber vier.
Es ist auch ein ganz anderer Melodieverlauf. Reden wir von T3+4?

Zitat
Das ist auch der Hauptgrund warum ich anderen Programmen den Ruecken gekehrt habe... Endlich programmieren statt "WYSIWYG" ;-)
Finde ich auch. :)

asmodeus

Zitat von: trulli am Mittwoch,  3. März 2021, 17:00
Zitat von: asmodeus am Mittwoch,  3. März 2021, 08:57
Ja, es ist die Prelude aus BWV 998. Du hast Recht, da sind Achtelpausen zwischen den Vierteln notiert im Urtext. Meine Interpretation davon - und die moechte ich notieren - ignoriert die Pausen und laesst die Baesse durchklingen 8)
Ich habe den Urtext dieses Stückes in der NBA (Neue Bachausgabe). Da stehen nur zwei Noten im Bass. Auch in meinen Gitarrentranskriptionen stehen nur zwei Noten. Bei dir sind es aber vier.
Es ist auch ein ganz anderer Melodieverlauf. Reden wir von T3+4?
Ah, nein Sorry - ich habe zusammenhanglos Takte aus dem Stueck herausgegriffen bei denen ich Fragen zum Satz hatte.

harm6

Zitat von: asmodeus am Mittwoch,  3. März 2021, 08:57
Zitat von: trulli am Dienstag,  2. März 2021, 23:05
ZitatJa, macht aber mehr Ärger als es Wert ist.
:D

Haha  :) Was fuer einen Dummy koennte man denn nehmen? Frage fuer einen Freund...  ;)

Verschiedene Möglichkeiten:
(a) Notenlängen skalieren und spacer einfügen:

{
  b1*1/2 \startTextSpan s1*1/2\stopTextSpan
}

(b) David Kastrups \at-Funktion

at =
#(define-music-function (time event music)
  (ly:duration? ly:music? ly:music?)
"Place @var{event} at a relative duration @var{time} in relation
to @var{music}."
  #{ \context Bottom << { \skip $time <>$event } $music >> #})

{
  \at 2 \stopTextSpan b1\startTextSpan
}

(c) Graces

{
  \grace s1\startTextSpan
  b1\stopTextSpan
}

Und dann immer etwas wie:

\layout {
  \override TextSpanner.style = #'solid
  %% switch to:
  \override TextSpanner.style = #'none
  \override TextSpanner.bound-details.left.text = "II"
  \override TextSpanner.bound-details.right.text = \markup \draw-line #'(0 . -1)
  %% switch to:
  \override TextSpanner.bound-details.right.text = ##f
}


Nachteile:
ad (a) midi hat Löcher, zusätzlicher Eingabeaufwand
ad (b) gewöhnungsbedürftige Syntax
ad (c) left.text ist verschoben und muß korrigiert werden, früher oder später hebt issue 34 sein Haupt.

Geuß,
  Harm