TextSpanner (gelöst)

Begonnen von rgree, Montag, 8. Mai 2017, 09:20

« vorheriges - nächstes »

rgree

Der Textspanner macht mir Kopfzerbrechen.
Wie im angehängten Bild zu sehen, erzeugt der folgende Code:

\version "2.18.0"
% Test TextSpanner
tonLeiter = {
  c'4 d' e' f'
  g' a' b' c''
}
mus = {
  \tonLeiter
  \tonLeiter
  c'4\startTextSpan^"►" d' e' f'
  \break
  g'\stopTextSpan^"◀" a' b' c''
  \tonLeiter
  \tonLeiter
}
{
  \override TextSpanner.direction = #DOWN
  \override TextSpanner.style = #'line
  \override TextSpanner.bound-details.left.text = \markup\teeny\normal-text\sans "2"
  \override TextSpanner.bound-details.right.text = \markup\teeny\normal-text\sans "2"
  \mus
}

ein nicht befriedigendes Ergebnis

Ich versuche, TextSpanner dazu zu benutzen, um anzuzeigen, dass ein Finger liegenbleiben soll (ich spiele Geige).
Beim Zeilenwechsel werden aber "left.text" und "right.text" noch einmal angezeigt,
was die eigentliche Absicht konterkariert.
Meine Frage: kann ich TextSpanner zu einem anderen Verhalten beim Zeilenwechsel überreden, nämlich nichts zu tun ?
Oder kann man das mit einem anderen Konstrukt besser machen ?

Wer eine Antwort weiß, möge mir auch bitte mitteilen, wo ich die Info finden kann; das spart vielleicht manch zukünftige Frage.

Vielen Dank im Voraus,
Reinhard

kilgore

Hallo rgree,

Dir fehlen die Befehle:

\override TextSpanner.bound-details.right-broken.text = ##f
\override TextSpanner.bound-details.left-broken.text = ##f


Im Notation-Manual habe ich sie eben auch nicht gefunden... vielleicht fehlt das in der Dokumentation.

Gruß
kil

rgree

Hallo kilgore,

vielen Dank für diese lichtschnelle Antwort !

Ich habe in einem Post aus 2010 auch die Antwort gefunden, aber erst gerade eben :-)) .
Ich sollte beim nächsten Mal vielleicht erst mal im Archiv suchen ...

Viele Grüße,
Reinhard

Malte

Zitat von: rgree am Montag,  8. Mai 2017, 09:20
Wer eine Antwort weiß, möge mir auch bitte mitteilen, wo ich die Info finden kann; das spart vielleicht manch zukünftige Frage.
Alle Kontext- und Grobeigenschaften sowie Musikfunktionen und ein paar Dinge mehr findet man in der ,,Internals Reference" (zu deutsch ,,Referenz der Interna", es gibt aber keine deutsche Übersetzung vom Inhalt). Diese findest du hier, für dein Problem relevant ist der Abschnitt über das Grob TextSpanner. Ich seh gerade, daß da an keiner Stelle das Prinzip von left, right, left-broken und right-broken erklärt ist (auch im spanner-interface nicht). Für Erklärungen ist aber auch die Notationsreferenz da, in diesem Fall Abschnitt 5.4.5.

harm6

Hallo,

der Vollständigkeit halber, hier noch ein Coding von David Nalesnik.
Nachteil: Glissando kann jetzt nicht mehr gleichzeitig (zumindest nicht gleichzeitig und in derselben Voice) verwendet werden.

Ich hab die Syntax gestrafft, modernisiert (war für 2.15), etwas robuster gemacht und 'connectGliss' hinzugefügt.
Bild im Anhang.
Original hier:
http://lilypond.1069038.n5.nabble.com/Glissando-on-single-note-in-chords-tt34672.html#a34676


\version "2.19.60"

% http://lilypond.1069038.n5.nabble.com/Glissando-on-single-note-in-chords-tt34672.html#a34676

#(define (define-grob-custom-property symbol type? description)
  (if (not (equal? (object-property symbol 'backend-doc) #f))
      (ly:error (_ "symbol ~S redefined") symbol))
  (set-object-property! symbol 'backend-type? type?)
  (set-object-property! symbol 'backend-doc description)
  symbol)
   
#(for-each
  (lambda (x)
    (apply define-grob-custom-property x))
    `((to-fingerings ,boolean? "boolean for moving glissandi to fingerings")))
             
fingeringSlideEngraver =
#(lambda (context)
   (let ((glissandi '())
         (fingerings '()))
     (make-engraver
       (acknowledgers
         ((glissando-interface engraver grob source-engraver)
                (if (eq? #t (ly:grob-property grob 'to-fingerings))
                    (set! glissandi (cons grob glissandi))))
         ((finger-interface engraver grob source-engraver)
                (set! fingerings (cons grob fingerings))))
       ((stop-translation-timestep translator)
         (for-each
           (lambda (gliss)
             (for-each
               (lambda (finger)
                 (if (eq? (ly:spanner-bound gliss LEFT)
                          (ly:grob-parent finger X))
                     (ly:spanner-set-bound! gliss LEFT finger))
                 (if (eq? (ly:spanner-bound gliss RIGHT)
                          (ly:grob-parent finger X))
                     (begin
                       (ly:spanner-set-bound! gliss RIGHT finger)
                       (set! glissandi
                             (remove (lambda (x) (eq? x gliss)) glissandi)))))
               fingerings))
           glissandi)
         (set! fingerings '())))))

\layout {
  \context {
    \Voice
    \consists \fingeringSlideEngraver
  }
}

%% \set glissandoMap = #'(pair-1 pair-2) ended with \unset glissandoMap is
%% more flexible but not really needed for the fingeringSlideEngraver, thus:
connectGliss =
#(define-music-function (which)(number-list?)
#{ \set glissandoMap = #(map (lambda (w) (cons w w)) which) #})

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

\relative c'' {
  \override Fingering.staff-padding = #'()
  %% switch it on
  \override Glissando.to-fingerings = ##t
  \connectGliss 0
  \set fingeringOrientations = #'(down)
  <fis-1 d'>4\glissando
  <g-1 d'>
}

\relative c'' {
  \key f \major
  \time 3/4
 
  \override Glissando.to-fingerings = ##t
  %% Let Glissando be breakable
  \override Glissando.breakable = ##t
  %% Print small Glissandos at line start
  \override Glissando.after-line-breaking = ##f
 
  %\set fingeringOrientations = #'(up)
  <d-3 f-1>8[\glissando
  \once \connectGliss 1
  <e-3 g-1>\glissando
  \once \connectGliss 1
  <f-2 a-1>\glissando
  <e-3 g-1>\glissando <d-3 f-1>8. <c-1 e-0>16]
  <d-3 f-1>2.\glissando
  \break
  <e-3 g-1>
}


Gruß,
  Harm