Hallo zusammen,
ich finde Eluzes Ansatz mit den
dash-definitions sehr elegant, weil er mit relativ wenig Aufwand dort ansetzt, wo das Problem entsteht, nämlich beim Bogen, und die dafür vorgesehenen Einstellmöglichkeiten nutzt.
Trotzdem ein kleiner Änderungsvorschlag in anderer Sache, nämlich dem halben Takt in der zweiten Klammer, dem Christa schon per
\partial zuleibe rücken wollte. Das provoziert allerdings LilyPond-Warnungen.
Ich würde statt Eluzes
\set Timing.measureLength = #(ly:make-moment 2 4)lieber
\set Timing.measurePosition = #(ly:make-moment 2 4)benutzen, denn antsatt den Takt auf 2/4 umzustellen, scheint es mir vorteilhafter, einfach die Position innerhalb des Taktes zu verstellen. Das kommt dem realen Ereingis näher (schließlich geht es erst ab der Hälfte los, die erste Hälfte steht vor den Voltenklammern. Vor allem aber stimmt die Taktnumerierung und das Ende der zweiten Klammer, ohne daß man die Taktlänge wieder zurücksetzen müßte.
Mit dem Snippet komme ich zu keinem Ergebnis
Der Vollständigkeit halber eine Begründung:
Das liegt wohl daran, daß das Snippet nicht auf das allgemeine Ausblenden von Teilbögen um des Ausblenden Willens ausgerichtet, sondern für den
Kollisionsfall gedacht ist.
Und ein Bogen
unter dem Notensystem kollidiert niemals mit einer Voltenklammer
über dem Notensystem.
Die Lösung benutzt eine weißes Rechteck, das den Bogen überdeckt.
Ausweg: wenn man den zweiten Parameter (die Y-Werte) von
\hideCurvesFrom entsprechend klein (negativ!) einstellt, kommt man weit genug herunter, um den Haltebogen zu überdecken:
(Ich habe übrigens vorher per convert-ly das Snippet auf Christas 2.16er-Stand gebracht).
\version "2.16.1"
% LSR In 2_13_0 and earlier, the following
% LSR warning may be triggered multiple times:
% LSR warning: Ignoring grob for slur: <grob>. avoid-slur not set?
% LSR This issue has been resolved in 2_13_1
#(define (parse-grob-sym grob-sym)
(let* ((grob-str (symbol->string grob-sym))
(dot-index (string-index grob-str #\.))
(context (if dot-index
(string-take grob-str dot-index)
"Voice"))
(grob (if dot-index
(substring grob-str (+ dot-index 1))
grob-str)))
(cons context grob)))
hideCurvesFrom =
#(define-music-function
(parser location grob-sym x-padding y-padding)
(symbol? pair? pair?)
(let* ((context (car (parse-grob-sym grob-sym)))
(top-grob (cdr (parse-grob-sym grob-sym))))
#{
\override Tie #'layer = #-2
\override Slur #'layer = #-2
\override PhrasingSlur #'layer = #-2
\override $context . $top-grob #'avoid-slur = #'ignore
\override $context . $top-grob #'layer = #-1
\override $context . $top-grob #'stencil =
#(lambda (grob)
(define (get-stil-proc alist)
;; removes the first 'stencil entry from the grob-property
;; alist, implicitly created by this callback:
;; (stencil . #<procedure #f (grob)>)
;; and then retrieves the original 'stencil procedure.
(let ((stil-proc (ly:assoc-get 'stencil alist)))
(if (procedure-name stil-proc)
stil-proc
(begin (set! alist (assoc-remove! alist 'stencil))
(get-stil-proc alist)))))
(let* ((basic-props (ly:grob-basic-properties grob))
(stil-proc (get-stil-proc basic-props))
(this-stil (stil-proc grob)))
(if (ly:stencil? this-stil)
(let* ((stil-x-ext (ly:stencil-extent this-stil 0))
(stil-y-ext (ly:stencil-extent this-stil 1))
(box-x-ext (cons (- (car stil-x-ext) (car x-padding))
(+ (cdr stil-x-ext) (cdr x-padding))))
(box-y-ext (cons (- (car stil-y-ext) (car y-padding))
(+ (cdr stil-y-ext) (cdr y-padding))))
(box-w (- (cdr box-x-ext) (car box-x-ext)))
(box-h (- (cdr box-y-ext) (car box-y-ext))))
(ly:stencil-add
(ly:make-stencil
(list 'embedded-ps
(ly:format
(string-append "gsave\n"
"currentpoint translate\n"
"1 setgray\n"
"~4f ~4f ~4f ~4f rectfill\n"
"grestore\n")
(car box-x-ext)
(car box-y-ext)
box-w
box-h))
stil-x-ext
stil-y-ext)
this-stil))
'())))
#}))
revertHideCurvesFrom =
#(define-music-function (parser location grob-sym) (symbol?)
(let ((context (car (parse-grob-sym grob-sym)))
(top-grob (cdr (parse-grob-sym grob-sym))))
#{
\revert Tie #'layer
\revert Slur #'layer
\revert PhrasingSlur #'layer
\revert $context . $top-grob #'avoid-slur
\revert $context . $top-grob #'layer
\revert $context . $top-grob #'stencil
#}))
%%%%%%%%%%%%%%%%%% EXAMPLE %%%%%%%%%%%%%%%%%%
\relative c' {
\repeat volta 2 {
c4
\set tieWaitForNote = ##t
\hideCurvesFrom #'Score.VoltaBracket #'(-0.2 . 0.2) #'(-8 . -10)
e~ }
\alternative {
{ g d | c1 | }
{ \revertHideCurvesFrom #'Score.VoltaBracket
\set Timing.measurePosition = #(ly:make-moment 2 4)
e4 d | c1 }
}
}
Der einzige Vorteil gegenüber Eluzes Ansatz ist allerdings, daß die Anfangspositionen (mit gewolltem leichten "Überlapp") sich an der tatsächlichen Breite der Voltenklammer) orientieren, unabhängig davon, wie die Zeile gerade gedehnt oder gestaucht wird.
Viele Grüße
Torsten