Bindebogen ohne vorhergehende Note erzeugen

Begonnen von Multimax, Freitag, 3. April 2020, 06:10

« vorheriges - nächstes »

Multimax

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.

Manuela

Dafür gibt es einen eigenen Grob, RepeatTie heißt hier.

Hier gibt es eine Anleitung, wie man den RepeatTie und sein Gegenstück, den LaissezVibrerTie, in der Länge modifizieren kann.
Danke für eure Hilfe
viele Grüße
-- Manuela

Multimax

Ah wie geil.

Danke für die schnelle Antwort  ;)

harm6

Hallo Multimax,

die extendLV/extendRT-Funktionen zu denen Manuela verlinkt hat beruhen auf
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))


Manuela

Danke für deine Ausführungen, Harm.
Es gibt im Archiv einen Thread: \laissezVibrer länger machen

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).
Danke für eure Hilfe
viele Grüße
-- Manuela