Violine Fingersatz: "liegen lassen"

Begonnen von Wabbe, Sonntag, 5. April 2020, 12:22

« vorheriges - nächstes »

Wabbe

Hallo Leute, kennt evtl. jemand eine Möglichkeit, wie man notieren kann, wenn ein Finger eine Zeit lang auf der Saite liegen bleiben soll?
Danke und beste Grüße

harm6

Hallo,

es gibt gleich eine Reihe von Ansätzen:

Template: integrating \startTextSpan and \stopTextSpan in a customized TextSpanner
http://lsr.di.unimi.it/LSR/Item?id=857

String number extender lines
http://lsr.di.unimi.it/LSR/Item?id=616

Adding line between fingerings or a glissando between nonadjacent notes
http://lsr.di.unimi.it/LSR/Item?id=662

David Nalesnik, fingering-slide-engraver
http://lilypond.1069038.n5.nabble.com/Glissando-on-single-note-in-chords-tt34672.html#a34676

Mein eigener Versuch eine eierlegende Wollmilchsau zu züchten ist angehängt.
Allerdings ist das work-in-progress. Mein eigentliches Ziel war es "Finger-Glissando" so zu implementieren, daß normales Glissando weiterhin möglich und unbeeinflußt bleibt. Das funktioniert noch nicht. Insoweit gibt mein bisheriger Code nur weitere style-optionen für "Finger-Glissando".

Ich hab ihn angehängt, falls jemand daran weiter arbeiten möchte.
In diesem Fall sollte man im \layout von fingeringSlideEngraverFF auf fingeringSlideEngraver wechseln.
fingeringSlideEngraverFF druckt glissandi nur zwischen den Fingersätzen.
fingeringSlideEngraver druckt zwar normale und gestylte Glissandi. Die normalen sind aber auch zwischen den Fingersätzen, diese auf die Notenköpfe zu beschränken wäre die Aufgabe...

Welchen Code Du jetzt nimmst hängt davon ab, was Du tatsächlich brauchst und wieviel Zeit Du aufzuwenden bereit bist, die Manipulationsmöglichkeiten der komplexeren codings zu erforschen. ;)
Die LSR-snippets müssen teilweise etwas angepaßt werden, sollte aber unproblematisch. Falls nicht, dann frag hier.


Gruß,
  Harm

Wabbe

Hallo Harm,
ganz ganz vielen Dank für die umfangreichen Beispiele. Mein erster Impuls war zwar, dass ich chancenlos bin, da was draus zu machen, weil Welten zwischen dem liegen, was Du weißt und was ich weiß, aber inzwischen habe ich es wenigstens geschafft, mit overwrite TextSpanner eine Linie zu ziehen, und viel mehr will ich ja auch nicht:
\relative c'' {
    \override TextSpanner.style = #'line
    a4-1 \startTextSpan
    b4 c-3
    a4-1 \stopTextSpan
}

Wenn die Linie jetzt noch auf Höhe der Fingersatzzahlen gerückt werden könnte, und wenn man solche Linien auch schachteln könnte, dann gäbe es nix mehr, was ich weiter brauchen würde.
Nochmal danke und beste Grüße  --  Wabbe


Zitat von: harm6 am Montag,  6. April 2020, 09:45
Hallo,

es gibt gleich eine Reihe von Ansätzen:

Template: integrating \startTextSpan and \stopTextSpan in a customized TextSpanner
http://lsr.di.unimi.it/LSR/Item?id=857

String number extender lines
http://lsr.di.unimi.it/LSR/Item?id=616

Adding line between fingerings or a glissando between nonadjacent notes
http://lsr.di.unimi.it/LSR/Item?id=662

David Nalesnik, fingering-slide-engraver
http://lilypond.1069038.n5.nabble.com/Glissando-on-single-note-in-chords-tt34672.html#a34676

Mein eigener Versuch eine eierlegende Wollmilchsau zu züchten ist angehängt.
Allerdings ist das work-in-progress. Mein eigentliches Ziel war es "Finger-Glissando" so zu implementieren, daß normales Glissando weiterhin möglich und unbeeinflußt bleibt. Das funktioniert noch nicht. Insoweit gibt mein bisheriger Code nur weitere style-optionen für "Finger-Glissando".

Ich hab ihn angehängt, falls jemand daran weiter arbeiten möchte.
In diesem Fall sollte man im \layout von fingeringSlideEngraverFF auf fingeringSlideEngraver wechseln.
fingeringSlideEngraverFF druckt glissandi nur zwischen den Fingersätzen.
fingeringSlideEngraver druckt zwar normale und gestylte Glissandi. Die normalen sind aber auch zwischen den Fingersätzen, diese auf die Notenköpfe zu beschränken wäre die Aufgabe...

Welchen Code Du jetzt nimmst hängt davon ab, was Du tatsächlich brauchst und wieviel Zeit Du aufzuwenden bereit bist, die Manipulationsmöglichkeiten der komplexeren codings zu erforschen. ;)
Die LSR-snippets müssen teilweise etwas angepaßt werden, sollte aber unproblematisch. Falls nicht, dann frag hier.


Gruß,
  Harm

Enthalpy

Als Geiger erwarte ich keine solche Anweisung vom Notenheft. Einen Finger auf der Seite lassen wird vom Klang benötigt, und dafür genügen die Noten, oder manchmal für einen einfachere Ausführung, aber das muß ausprobiert werden und ist schlecht vorhersehbar. Also in der Regel nicht die Aufgabe des Komponisten.

Oder habe ich da einen Fall verpaßt?

Dazu die Beobachtung, daß praktisch alle Professoren möchten, mit mehr oder weniger Überzeugung, daß die Schüler die Finger so lang wie möglich liegen lassen, und den kleinen Finger sowie den Zeigefinger nicht ausstrecken wenn gerade ungebraucht, "um unnötige Bewegungen zu meiden" - und daß 100,000% der Geiger, auch die allerbesten, alle diese angeblich unnötigen Bewegungen machen.

Wabbe

#4
Hallo Enthalpy, hallo Harm, um meine Anfrage etwas einzuordnen: Als blutiger Anfänger auf der Geige habe ich Übungen wie hier im Anhang, bei denen es zweckmäßig und praktisch ist, Finger auch mal liegen zu lassen (oder zumindest mit der Möglichkeit zu experimentieren). Und da ich von Lilypond begeistert bin, interessiert mich auch, ob man sowas notieren kann. Im Beispiel (2) überlappen sich liegengelassene Finger auch noch. Falls sich sowas per Lilypond nicht so einfach machen lässt, kann ich (als Anfänger!) aber natürlich auch gut damit leben, wenn ich sowas nachträglich per Hand in die Noten 'reinmale.
Aber trotzdem noch mal ausdrücklich ganz vielen Dank für alle Hinweise hier. Ganz besonders die goldwerten Tipps von Harm, dass es solche wunderbaren Seiten gibt wie:
- http://lsr.di.unimi.it/
- http://lilypond.1069038.n5.nabble.com/

Also nochmal Danke und beste Grüße  --  Wabbe


harm6

ZitatUnd da ich von Lilypond begeistert bin, interessiert mich auch, ob man sowas notieren kann

Mein credo war immer "LilyPond kann alles". Mittlerweile habe ich doch ein paar Flecken gesehen, wo LilyPond es nicht gut hinbekommt und es auch keine gute Möglichkeit gibt als user einzugreifen.
Irgendwie "hinfummeln" kann man solche Sachen aber trotzdem.
Es dauert aber wahrscheinlich etwas, bis Du auf solche Fälle stößt. Bis dahin ist es eher eine Frage wieviel Zeit und Arbeit Du reinsteckst und wieviel Hilfe Du bekommst, wenn Du mal nicht weiter weißt.

Zum eigentlichen Thema.
Du scheinst den TextSpanner für Dein Projekt nutzen zu wollen. Per default gibt es da die Einschränkung, daß nur ein TextSpanner pro Voice akzeptiert wird. Diese Einschränkung gilt eigentlich auch für andere Spanner wie Slur etc.
Aber gerade für Slur ist man schon vor einiger Zeit darauf gekommen, geschachtelte Slurs mit einer spanner-id zu versehen, dann geht es doch.
Ein syntax-Beispiel hier:
http://lilypond.org/doc/v2.21/Documentation/notation/expressive-marks-as-curves#slurs

Für TextSpanner geht das noch nicht per default. Aber David Nalesnik hat schon vor einiger Zeit den entsprechenden engraver in scheme neu geschrieben und die spanner-ids in diesem Zuge berücksichtigt.
https://lists.gnu.org/archive/html/lilypond-user/2015-10/msg00545.html

Allerdings ist die 'direction per user-override oder -direction-modifiers nicht berücksichtigt worden.
Auch fusst dieser code darauf, daß spanner-id als string eingegeben wird, was die Verwendung der "\= <id>"-Syntax wie bei Slurs verhindert.

Insoweit habe ich den Code ein bißchen modifiziert als text-spanner-id-harm-01.ly.
Dein Beispiel ist in text-spanner-id-harm-01-examples.ly welches text-spanner-id-harm-01.ly inkludiert.

Zur Anwendung.
Speichere text-spanner-id-harm-01.ly im selben Ordner wie text-spanner-id-harm-01-examples.ly (falls wo anders, mußt Du den include-Pfad anpassen.) Am besten schaust Du gar nicht in dieses File rein. ;)
Und kompiliere text-spanner-id-harm-01-examples.ly
Da sind auch noch ein paar weiter kommentierte Beispiele.
Siehe Anhang

Ich hab den code jetzt auch in den post gesetzt, nachher klaut wieder jemand oder etwas die Anhänge
Hier der zu inkludierende code, text-spanner-id-harm-01.ly

\version "2.20.0"

%% by David Nalesnik
%% https://lists.gnu.org/archive/html/lilypond-user/2015-10/txtJPHUw0NH1p.txt

%% Incorporating some code from the rewrite in Scheme of
%% Text_spanner_engraver in input/regression/scheme-text-spanner.ly

%% Revised by Harm
%%  Change-log
%%  - let the new TextSpanners respect directions entered via
%%    direction-modifiers or \override
%%  - let 'spanner-id take a number or symbol or string
%%  - entering 'spanner-id via "\= ..."-syntax is now possible

#(define (add-bound-item spanner item)
   (if (null? (ly:spanner-bound spanner LEFT))
       (ly:spanner-set-bound! spanner LEFT item)
       (ly:spanner-set-bound! spanner RIGHT item)))

#(define (axis-offset-symbol axis)
   (if (eq? axis X) 'X-offset 'Y-offset))

#(define (set-axis! grob axis)
   (if (not (number? (ly:grob-property grob 'side-axis)))
       (begin
        (set! (ly:grob-property grob 'side-axis) axis)
        (ly:grob-chain-callback
         grob
         (if (eq? axis X)
             ly:side-position-interface::x-aligned-side
             side-position-interface::y-aligned-side)
         (axis-offset-symbol axis)))))

#(define (assign-spanner-index spanner orig-ls)
   "Determine the position of a new spanner in an ordered sequence
of spanners.  The goal is for the sequence to begin with zero and
contain no gaps.  Return the index representing the spanner's position."
   (if (null? orig-ls)
       0
       (let loop ((ls orig-ls) (insert? #t) (result 0))
         (cond
          ((null? ls) result)
          ;; position at head of list
          ((and insert? (> (caar orig-ls) 0))
           (loop ls #f 0))
          ;; no gaps, put at end of list
          ((and insert? (null? (cdr ls)))
           (loop (cdr ls) #f (1+ (caar ls))))
          ;; fill lowest position of gap
          ((and insert?
                (> (caadr ls) (1+ (caar ls))))
           (loop (cdr ls) #f (1+ (caar ls))))
          (else (loop (cdr ls) insert? result))))))

alternateTextSpannerEngraver =
#(lambda (context)
   (let (;; a list of pairs comprising a spanner index
          ;;  (not spanner-id) and a spanner which has been begun
          (spanners '())
          (finished '()) ; list of spanners in completion stage
          (start-events '()) ; list of START events
          (stop-events '())) ; list of STOP events
     (make-engraver
      ;; \startTextSpan, \stopTextSpan, and the like create events
      ;; which we collect here.
      (listeners
       ((text-span-event engraver event)
        (if (= START (ly:event-property event 'span-direction))
            (set! start-events (cons event start-events))
            (set! stop-events (cons event stop-events)))))
      ;; Populate 'note-columns property of spanners.  Bounds are
      ;; set to note columns, and each spanner keeps a record of
      ;; the note columns it traverses.
      (acknowledgers
       ((note-column-interface engraver grob source-engraver)
        (for-each (lambda (s)
                    (ly:pointer-group-interface::add-grob
                     (cdr s) 'note-columns grob)
                    (add-bound-item (cdr s) grob))
          spanners)
         
        ;; finished only contains spanners, no indices
        (for-each (lambda (f)
                    (ly:pointer-group-interface::add-grob
                     f 'note-columns grob)
                    (add-bound-item f grob))
          finished)))

      ((process-music trans)
       ;; Move begun spanners from 'spanners' to 'finished'.  We do this
       ;; on the basis of 'spanner-id.  If we find a match--either
       ;; the ids are the same, or both are unset--a transfer
       ;; can be made.  Return a warning if we find no match: spanner
       ;; hasn't been properly begun.
       (for-each
        (lambda (es)
          (let ((es-id (ly:event-property es 'spanner-id)))
            (let loop ((sp spanners))
              (if (null? sp)
                  (ly:warning "No spanner to end!! 'id is ~a" es-id)
                  (let ((sp-id (ly:event-property
                                (event-cause (cdar sp)) 'spanner-id)))
                    (cond
                     ;; id's are numbers
                     ((and
                       (number? es-id)
                       (number? sp-id)
                       (= es-id sp-id))
                      (set! finished (cons (cdar sp) finished))
                      (set! spanners (remove (lambda (s) (eq? s (car sp))) spanners)))
                     ;; id's are symbols
                     ((and
                       (symbol? es-id)
                       (symbol? sp-id)
                       (eq? es-id sp-id))
                      (set! finished (cons (cdar sp) finished))
                      (set! spanners (remove (lambda (s) (eq? s (car sp))) spanners)))
                     ;; id's are strings
                     ((or
                       (and
                        (string? sp-id)
                        (string? es-id)
                        (string=? sp-id es-id))
                       ;; deal with \startTextSpan, \stopTextSpan
                       (and
                        (null? sp-id)
                        (null? es-id)))
                      (set! finished (cons (cdar sp) finished))
                      (set! spanners (remove (lambda (s) (eq? s (car sp))) spanners)))
                     (else (loop (cdr sp)))))))))
        stop-events)
       ;; The end of our spanners can be acknowledged by other engravers.
       (for-each
        (lambda (f)
          (ly:engraver-announce-end-grob trans f (event-cause f)))
        finished)

       ;; Make spanners in response to START events.
       ;;
       ;; Each new spanner is assigned an index denoting its position relative to
       ;; other active spanners.  This is enforced (for the moment) by adding
       ;; a small amount to the spanner's 'outside-staff-priority proportional to
       ;; this index.  This is unlikely to result in conflicts, though a better
       ;; solution may be to organize the spanners by a new alignment grob.
       ;;
       ;; Also, add any existing spanners to the 'side-support-elements array of
       ;; the new spanner.  This ensures correct ordering over line breaks when
       ;; 'outside-staff-priority is set to #f (which means that it is no longer
       ;; an outside-staff-object--not the default).
       (for-each
        (lambda (es)
          (let* ((new (ly:engraver-make-grob trans 'TextSpanner es))
                 (new-idx (assign-spanner-index new spanners))
                 (new-osp (ly:grob-property new 'outside-staff-priority))
                 (new-osp (if (number? new-osp)
                              (+ new-osp (/ new-idx 1000.0))
                              new-osp))
                 (es-dir-prob (ly:prob-property es 'direction))
                              )
            ;; Keep spanners direction, if entered with direction-modifiers
            (if (number? es-dir-prob)
                (set! (ly:grob-property new 'direction) es-dir-prob))
            (set! (ly:grob-property new 'outside-staff-priority) new-osp)
            (set-axis! new Y)
            ;; Add spanners with a lower index than new spanner to
            ;; its 'side-support-elements.  This allows new spanners
            ;; to fill gaps under the topmost spanner.
            (for-each
             (lambda (sp)
               (if (< (car sp) new-idx)
                   (ly:pointer-group-interface::add-grob new
                     'side-support-elements (cdr sp))))
             spanners)
            (set! spanners (cons (cons new-idx new) spanners))
            ;; Keep spanners direction, if entered via \override
            ;; Note: direction-modifiers are always prefered
            (set! spanners
                  (map
                    (lambda (sp)
                      (let ((dir (ly:grob-property (cdr sp) 'direction 1)))
                        (ly:grob-set-property! (cdr sp) 'direction dir)
                        (cons (car sp) (cdr sp))))
                    spanners))
            (set! spanners
                  (sort spanners (lambda (x y) (< (car x) (car y)))))))
        start-events)
       ;; Events have served their purpose for this timestep.  Clear
       ;; the way for new events in later timesteps.
       (set! start-events '())
       (set! stop-events '()))

      ((stop-translation-timestep trans)
       ;; Set bounds of spanners to PaperColumns if they haven't been set.
       ;; This allows spanners to be drawn between spacers.  Other uses?
       ;; Doesn't appear to affect whether spanners can de drawn between
       ;; rests.
       (for-each
        (lambda (s)
          (if (null? (ly:spanner-bound (cdr s) LEFT))
              (ly:spanner-set-bound! (cdr s) LEFT
                (ly:context-property context 'currentMusicalColumn))))
        spanners)

       (for-each
        (lambda (f)
          (if (null? (ly:spanner-bound f RIGHT))
              (ly:spanner-set-bound! f RIGHT
                (ly:context-property context 'currentMusicalColumn))))
        finished)

       (set! finished '()))

      ((finalize trans)
       ;; If spanner ends on spacer at end of context?
       (for-each
        (lambda (f)
          (if (null? (ly:spanner-bound f RIGHT))
              (ly:spanner-set-bound! f RIGHT
                (ly:context-property context 'currentMusicalColumn))))
        finished)
       (set! finished '())
       ;; User didn't end spanner.
       (for-each
        (lambda (sp)
          (ly:warning "incomplete spanner removed! 'id is ~a"
                      (ly:prob-property
                        (ly:grob-property (cdr sp) 'cause)
                        'spanner-id))
          (ly:grob-suicide! (cdr sp)))
        spanners)
       (set! spanners '())))))




%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EXAMPLES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\layout {
  \context {
    \Voice
    \remove #"Text_spanner_engraver"
    \consists \alternateTextSpannerEngraver
  }
}



Hier die Beispiele, text-spanner-id-harm-01-examples.ly

\version "2.20.0"

\include "text-spanner-id-harm-01.ly"

%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EXAMPLES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\layout {
  \context {
    \Voice
    \override TextSpanner.style = ##f
  }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% your example
%% https://lilypondforum.de/index.php/topic,675.msg3846.html#msg3846
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

diamond = {
  \once \override NoteHead.style = #'neomensural
  \once \omit Stem
}

fingerTextSpan =
#(define-event-function (finger mus)(markup? ly:music?)
#{
  \tweak bound-details.left.text \markup { \vcenter \finger #finger }
  $mus
#})


{
  \override Fingering.add-stem-support = ##t
  \override TextSpanner.bound-details.right.padding = 1
  \override TextSpanner.staff-padding = 2.3
 
  \key f \major
 
  \mark "(2)"
 
  %% Takt 1
  f'2 \fingerTextSpan "2 " \=2 _\startTextSpan
 
  a'2*1/2^4
  \diamond bes' \=2 _\stopTextSpan
                \=1 \fingerTextSpan "1 " _\startTextSpan

  %% Takt 2
  bes'2^1
  c''\=2 \fingerTextSpan "2 " _\startTextSpan
 
  %% Takt 3
  e''2*1/2 \=3 \fingerTextSpan "4 " \startTextSpan
  \diamond f''\=1 _\stopTextSpan
              \=1 \fingerTextSpan "1 " _\startTextSpan
  f''2^1
 
  %% Takt 4
  f''2 -\=3 \stopTextSpan
  e''^4 \=2 \stopTextSpan
 
  %% Takt 5
  c''2*1/2^2
  \diamond bes'\=1\stopTextSpan bes'^1 \diamond a'
}

%{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% test 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\score {
  {
    %% default, TextSpanner.direction is above
    b1\startTextSpan b\stopTextSpan
   
    %% TextSpanner.direction is below (via override)
    \once \override TextSpanner.direction = -1
    b1\startTextSpan b\stopTextSpan
   
    %% TextSpanner.direction is below (via direction-modifier)
    b1_\startTextSpan
    b1 \stopTextSpan
   
    %% TextSpanner.direction is below (via direction-modifier, override takes no
    %% effect, as wished!)
    \once \override TextSpanner.direction = 1
    b1_\startTextSpan
    b1 \stopTextSpan
   
    \break
   
    %% default, TextSpanner.direction is above
    b1\=1 \startTextSpan b\=1\stopTextSpan
   
    %% TextSpanner.direction is below (via override)
    \once \override TextSpanner.direction = -1
    b1\=2 \startTextSpan b\=2 \stopTextSpan
   
    %% TextSpanner.direction is below (via direction-modifier)
    b1\=3_\startTextSpan
    b1\=3 \stopTextSpan
   
    %% TextSpanner.direction is below (via direction-modifier, override takes no
    %% effect, as wished!)
    \once \override TextSpanner.direction = 1
    b1\=4_\startTextSpan
    b1\=4 \stopTextSpan
  }
  \header {
  piece =
    \markup
      \rounded-box
      \column {
        "Basic testing direction, via override and direction-modifiers."
        "Default and with setting spanner-id."
        "spanner-id is entered by \"\\=\""
        "No nested TextSpanners."
      }
  }
  \layout {
  indent = 0
  }
}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% test 2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\score {
  {
    %% Experiment with override and/or direction-modifiers
   
  \override TextSpanner.direction = #DOWN
    b1
                               ^\startTextSpan
      \=1 \tweak color #red    ^\startTextSpan
      \=2 \tweak color #green  _\startTextSpan
      \=3 \tweak color #blue   ^\startTextSpan
      \=4 \tweak color #yellow ^\startTextSpan
   
    b\stopTextSpan
   
    b \=1 \stopTextSpan
   
    \break
   
    b \=2 \stopTextSpan
      \=5 \startTextSpan
   
    b \=3 \stopTextSpan
      \=5 \stopTextSpan
   
    b \=4 \stopTextSpan
  }
   

  \header {
  piece =
    \markup
      \rounded-box
      \column {
        "Basic testing direction, via override and direction-modifiers."
        "Default and with setting spanner-id."
        "spanner-id is entered by \"\\=\""
        "Nested TextSpanners."
      }
  }
  \layout {
  indent = 0
  }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% David' example, with predefined shortcuts
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

startTextSpanOne =
#(make-music 'TextSpanEvent 'span-direction START 'spanner-id "1")

stopTextSpanOne =
#(make-music 'TextSpanEvent 'span-direction STOP 'spanner-id "1")

startTextSpanTwo =
#(make-music 'TextSpanEvent 'span-direction START 'spanner-id "2")

stopTextSpanTwo =
#(make-music 'TextSpanEvent 'span-direction STOP 'spanner-id "2")

startTextSpanThree =
#(make-music 'TextSpanEvent 'span-direction START 'spanner-id "3")

stopTextSpanThree =
#(make-music 'TextSpanEvent 'span-direction STOP 'spanner-id "3")

\score {
  \relative c' {
    \override TextSpanner.thickness = 10
    %\override TextSpanner.to-barline = ##t
    %\override TextSpanner.outside-staff-priority = ##f
    \override TextSpanner.outside-staff-padding = 1.5
 
    a4
    -\tweak color #red
    \startTextSpan
   
    b
    -\tweak color #green
    \startTextSpanOne
    c
    -\tweak color #blue
    \startTextSpanTwo
    d
    \startTextSpanThree
 
    a4\stopTextSpan
    b
    \stopTextSpanOne
    -\tweak color #red
    \startTextSpan
    c
    \stopTextSpanTwo
    -\tweak color #green
    \startTextSpanOne
    d
    \stopTextSpanThree
    -\tweak color #blue
    \startTextSpanTwo
 
    a4
    \startTextSpanThree
    b c d
    \break
 
    a4 b c d
 
    a1\stopTextSpan\stopTextSpanOne\stopTextSpanTwo\stopTextSpanThree
  }
  \header {
  piece =
    \markup
      \rounded-box
      \column {
        "David's original example."
        "spanner-id is entered by predefined (verbose) shortcuts."
      }
  }
  \layout {
  indent = 0
  }
}
%}


Hier das Ergebnis.
(Takt 5 ist unvollständig, da war mir Dein Bild zu undeutlich)





HTH,
  Harm

Wabbe

Zitat von: harm6 am Freitag, 10. April 2020, 14:46
Mein credo war immer "LilyPond kann alles".

Hallo Harm, vielen Dank für Deine Zeit und die Software. Es funktioniert, und nur die Götter wissen, warum.

Beste Grüße  --  Wabbe