Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Multimax am Freitag, 3. April 2020, 06:10

Titel: Bindebogen ohne vorhergehende Note erzeugen
Beitrag von: Multimax am Freitag, 3. April 2020, 06:10
Wegen eines Coda-Sprunges benötige ich einen Haltebogen, der am Beginn eines Teils ohne vorhergehende Note erzeugt wird. Er kommt von links aus dem Nichts und endet an der ersten Note. Das angehängte Bild verdeutlicht, was ich meine.



\version "2.20.0"
\language "deutsch"

{ ~c'}


Dieser Code funktioniert natürlich nicht, weil der linke Ankerpunkt für den Bogen fehlt.
Titel: Antw:Bindebogen ohne vorhergehende Note erzeugen
Beitrag von: Manuela am Freitag, 3. April 2020, 07:50
Dafür gibt es einen eigenen Grob, RepeatTie (https://lilypond.org/doc/v2.20/Documentation/internals/repeattie) heißt hier.

Hier gibt es eine Anleitung (https://lilypond.miraheze.org/wiki/ExtendLV), wie man den RepeatTie und sein Gegenstück, den LaissezVibrerTie, in der Länge modifizieren kann.
Titel: Antw:Bindebogen ohne vorhergehende Note erzeugen
Beitrag von: Multimax am Freitag, 3. April 2020, 08:00
Ah wie geil.

Danke für die schnelle Antwort  ;)
Titel: Antw:Bindebogen ohne vorhergehende Note erzeugen
Beitrag von: harm6 am Samstag, 4. April 2020, 10:55
Hallo Multimax,

die extendLV/extendRT-Funktionen zu denen Manuela verlinkt hat beruhen auf
http://lsr.di.unimi.it/LSR/Item?id=715 (http://lsr.di.unimi.it/LSR/Item?id=715)

Aber all diese Funktionen modifizieren X-extent, details.note-head-gap und setzen extra-offset.

Ein paar Worte zu extra-offset
Jeder override für exra-offset wird ausgeführt, nachdem die Platzierung aller grobs berechnet ist. Diese Berechnungen werden durch die Anwendung von extra-offset, ausschließlich für das grob welches den extra-offset gesetzt bekommt modifiziert.
Also kann man das entsprechende grob durch die Gegend schieben ohne ein anderes grob zu beeinflussen.

Manchmal möchte ich genau das, dann ist extra-offset das Mittel der Wahl. Aber man kann dadurch natürlich sehr schnell Kollisionen bekommen. Möchte man das? Falls ja, gut. Falls nein, ist extra-offset ungeeignet.

Nun zu den Funktionen.
Ich habe mal ein bißchen Test-code geschrieben. Bild im Anhang. Code unten (falls es jemand interessiert).
Der Test achtet nur auf die Weite der Bögen, die Höhe wird nicht beeinflußt (in ernsthaftem Code sollte man da schon Sorge für tragen).

(1) extentLV/extentRT
Auch hier führt extra-offset dazu, daß andere grobs nicht beachtet werden.
Ist das gewollt? Wenn nein, siehe Abschnitt zu \shape.
Allerdings gibt es ein paar Probleme mit den Funktionen.
Der RT entfernt sich immer weiter vom Notenkopf, auch ist der "Ansatzpunkt" der Bögen am Notenkopf unterschiedlich.
Es scheint auch keine neutrale Einstellung zu geben. Imho, sollten die Funktionen für den Wert 0 den default ausgeben.
Ich postuliere, daß die numerischen Werte in den Funktionen verbesserungswürdig sind. Sorry Manuela ;)
Auch ändert sich irgendwann die Ausrichtung der Bögen. Da hab ich keinen blassen Schimmer warum das passiert. Kommt allerdings auch beim originalen LSR-snippet vor.

(2) control-points
Man kann die control-points manuell setzen. Ist in der NR zwar dokumentiert, aber es wurde schon vor einiger Zeit die Funktion \shape geschaffen (und auch dokumentiert) um das zu erleichtern.

(3) \shape
Addiert Werte zu den ausgelesenen control-points. Also braucht man sie nicht von Grund auf zu erraten (was sehr mühsam ist).
Zur Syntax siehe NR.
Da \shape die control-points modifiziert und kein extra-offset wirkt, werden andere grobs beachtet. Direkte Kollisionen werden vermieden. Will man das? Wenn ja, fein!


Ich persönlich würde versuchen das Beste aus beiden Ansätzen zu vereinen:
D.h. \shape verwenden und bei Bedarf
  \override RepeatTie.X-extent = #'(0 . 0)
und/oder
  \override LaissezVibrerTie.X-extent = #'(0 . 0)
hinzusetzen.
(Ist aber nicht Teil des Testcodes.)


Gruß,
  Harm


Hier der Testcode:

\version "2.20.0"

\language "deutsch"

extendLV =
#(define-music-function (further) (number?)
   #{
     \once \override LaissezVibrerTie.X-extent = #'(0 . 0)
     \once \override LaissezVibrerTie.details.note-head-gap = #(/ further -8)
     \once \override LaissezVibrerTie.extra-offset = #(cons (/ further 8) .3)
   #} )

extendRT =
#(define-music-function (further) (number?)
   #{
     \once \override RepeatTie.X-extent = #'(0 . 0)
     \once \override RepeatTie.details.note-head-gap = #(/ further -8)
     \once \override RepeatTie.extra-offset = #(cons (- 0.5 (/ further 3)) .1)
   #} )


\markup \rounded-box \fill-line { "Test extendLV and extendRT" }

tstI =
#(define-scheme-function (nmbrs)(number-list?)
  (map
    (lambda (x)
      #{
        \new Staff \with { instrumentName = #(number->string x) }
          { s1 \extendLV #x \extendRT #x h'\laissezVibrer\repeatTie s1 }
      #})
    nmbrs))
 


  \new Staff
    \with { instrumentName = "default" }
    { s1 h'\laissezVibrer\repeatTie s1 }
  $@(tstI (iota 4 0 3))

\markup \rounded-box \fill-line { "Test with \\shape" }
tstII =
#(define-scheme-function (nmbrs)(number-list?)
  (map
    (lambda (x)
      #{
        \new Staff \with { instrumentName = #(number->string x) }
          {
            s1
            h'
              -\shape #`((0 . 0) (0 . 0) (,x . 0) (,x . 0)) \laissezVibrer
              -\shape #`((,(- x) . 0) (,(- x) . 0) (0 . 0) (0 . 0))\repeatTie
              s1
          }
      #})
    nmbrs))

   
  \new Staff
    \with { instrumentName = "default" }
    { s1 h'\laissezVibrer\repeatTie s1 }
  $@(tstII (iota 4 0 3))

Titel: Antw:Bindebogen ohne vorhergehende Note erzeugen
Beitrag von: Manuela am Samstag, 4. April 2020, 11:31
Danke für deine Ausführungen, Harm.
Es gibt im Archiv einen Thread: \laissezVibrer länger machen (https://archiv.lilypondforum.de/index.php/topic,1516.msg8477.html)

von dort habe ich wahrscheinlich den Code (ist schon länger her, dass ich mich damit befasst habe, nur den Code für \repeattie habe ich auf die Schnelle dazu geschrieben).