Hairpins kürzen

Begonnen von chf, Mittwoch, 25. Oktober 2017, 19:06

« vorheriges - nächstes »

chf

\
version "2.18.2"
\relative c' {
  c'4\> bes4 <\tweak #'X-offset #-4 f>\!
}


Liebe Freunde,

wie Hairpins zu verlängern sind ist klar, aber gibt es eine Möglichkeit für das Gegenteil?
Ich sehe diese Notwendigkeit aus optischen Gründen in einer mehrstimmigen Cadenz , aber die Gabeln passen sich den Tweaks nicht an...

Gruß
Christa

harm6

In neueren devel-Versionen kann man shorten-pair verwenden.
In 2.18 sehe ich nur zwei Möglichkeiten.
(1) Zweite Stimme für Dynamics. Aber ohne es getestet zu haben vermute ich, daß es nur unbeholfen funktionieren wird.
(2) Den stencil neu schreiben. Hier eine Möglichkeit, ebenfalls aus der devel-Version, downgraded. Wie das am ZeilenUmbruch funktioniert hab' ich nicht getestet.

\version "2.18.2"

#(define-public (make-connected-line points grob)
  "Takes a list of points, @var{points}.
Returns a line connecting @var{points}, using @code{ly:line-interface::line},
gets layout information from @var{grob}"
  (define (connected-points grob ls pts)
    (if (not (pair? (cdr pts)))
        (reduce ly:stencil-add empty-stencil ls)
        (connected-points
          grob
          (cons
            (make-line-stencil
              0.1
              (car (first pts))
              (cdr (first pts))
              (car (second pts))
              (cdr (second pts)))
            ls)
          (cdr pts))))
  (if (< (length points) 2)
      (begin
        (ly:warning
          "´make-connected-line´ needs at least two points: ~a"
          points)
        empty-stencil)
      (connected-points grob '() points)))

#(define ((elbowed-hairpin coords mirrored?) grob)
  "Create hairpin based on a list of @var{coords} in @code{(cons x y)}
form.  @code{x} is the portion of the width consumed for a given line
and @code{y} is the portion of the height.  For example,
@code{'((0 . 0) (0.3 . 0.7) (0.8 . 0.9) (1.0 . 1.0))} means that at the point
where the hairpin has consumed 30% of its width, it must
be at 70% of its height.  Once it is to 80% width, it
must be at 90% height.  It finishes at 100% width and 100% height.
If @var{coords} does not begin with @code{'(0 . 0)} the final hairpin may have
an open tip.  For example '(0 . 0.5) will cause an open end of 50% of the usual
height.
@var{mirrored?} indicates if the hairpin is mirrored over the Y-axis or if
just the upper part is drawn.
Returns a function that accepts a hairpin grob as an argument
and draws the stencil based on its coordinates.

@lilypond[verbatim,quote]
#(define simple-hairpin
  (elbowed-hairpin '((0 . 0)(1.0 . 1.0)) #t))

\\relative c' {
  \\override Hairpin #'stencil = #simple-hairpin
  a\\p\\< a a a\\f
}
@end lilypond
"
  (define (scale-coords coords-list x y)
    (map
      (lambda (coord) (cons (* x (car coord)) (* y (cdr coord))))
      coords-list))

  (define (hairpin::print-part points decresc? me)
    (let ((stil (make-connected-line points me)))
      (if decresc? (ly:stencil-scale stil -1 1) stil)))

  ;; outer let to trigger suicide
  (let ((sten (ly:hairpin::print grob)))
    (if (grob::is-live? grob)
        (let* ((decresc? (eqv? (ly:grob-property grob 'grow-direction) LEFT))
               (xex (ly:stencil-extent sten X))
               (lenx (interval-length xex))
               (yex (ly:stencil-extent sten Y))
               (leny (interval-length yex))
               (xtrans (+ (car xex) (if decresc? lenx 0)))
               (ytrans (car yex))
               (uplist (scale-coords coords lenx (/ leny 2)))
               (downlist (scale-coords coords lenx (/ leny -2)))
               (stil
                 (ly:stencil-aligned-to
                   (ly:stencil-translate
                     (ly:stencil-add
                       (hairpin::print-part uplist decresc? grob)
                       (if mirrored?
                           (hairpin::print-part downlist decresc? grob)
                           empty-stencil))
                     (cons xtrans ytrans))
                   Y CENTER))
               (stil-y-extent (ly:stencil-extent stil Y)))
        ;; Return a final stencil properly aligned in Y-axis direction and with
        ;; proper extents. Otherwise stencil-operations like 'box-stencil' will
        ;; return badly. Extent in X-axis direction is taken from the original,
        ;; in Y-axis direction from the new stencil.
        (ly:make-stencil (ly:stencil-expr stil) xex stil-y-extent))
        ;; return empty, if no Hairpin.stencil present.
        '())))

\relative c' {
  % 2.19.x
  %\override Hairpin.shorten-pair = #'(2 . 2)
  \override Hairpin.stencil = #(elbowed-hairpin '((0.1 . 0)(0.8 . 1.0)) #t)
  c'4\<
  bes4
  f\!
}


Oder Du wartest noch auf die neue stable. Zumindest der ganze scheme-Kladderadatsch ist dort in einer besseren Version (für die 2.18.2 einfach noch nicht die Mittel bereitstellt) der default.

Warum Du in Deinem Beispiel den Notenhals versetzt, erschließt sich mir nicht.


Gruß,
  Harm

chf

Hallo Harm,

du hast mir sehr geholfen - mit deinem famosen Code konnte ich die Gabeln fein "justieren".
(Den Notenhals in meinem Beispiel hatte ich schlicht vergessen, im Ernstfall heben meine Noten keine Hälse.
Das Ganze ist eine gewaltige Bastelarbeit... (s. Anhang).

Danke!
Christa