Perhaps it was a coincidence that both Kieren
and Maestraccio requested slur-hiding solutions
recently:

http://lists.gnu.org/archive/html/bug-lilypond/2009-03/msg00106.html
http://lists.gnu.org/archive/html/lilypond-user/2009-04/msg00153.html

I tried to solve both individually, but then 
realized that a generic solution was best, so
here it is. The name is not very poetic though.
Thanks, Neil and Patrick, for your coding help 
and suggestions.

Questions and comments are welcome. If anyone
wants to add it to the LSR, that's fine by me.
Change the function name too, if you want, I 
couldn't think of anything better.

Happy to help.
- Mark



      
\version "2.13.0"

#(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
   #(if (or ;; append to this list if you get the warning:
            ;; "Ignoring grob for slur: <grob>. avoid-slur not set?"
            (equal? $top-grob "Fingering")
            (equal? $top-grob "Accidental")
            )
        'stencil
        'avoid-slur) = ##f
    
  \override $context . $top-grob #'layer = #-1
  \override $context . $top-grob #'stencil =
    #(lambda (grob)
    
       ;; get-stil-proc is a workaround because there may
       ;; be more than one 'stencil entry in basic-props
       (define (get-stil-proc alist)
         (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))
              (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"
                         "~a ~a ~a ~a 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 %%%%%%%%%%%%%%%%%%
%{
\version "2.13.0"

\pointAndClickOff

\relative {
  \repeat volta 2 {
    
    %% syntax: \hideCurvesFrom [grob] [x-padding] [y-padding]
    %% See comment above if you get the warning message:
    %% "Ignoring grob for slur: <grob>. avoid-slur not set?"
        
    %  always call \hideCurvesFrom before the curve starts:
    \hideCurvesFrom #'Fingering           #'(0.3 . 0.3) #'(0 . 0)
    \hideCurvesFrom #'Staff.KeySignature  #'(0.3 . 0.3) #'(0 . 0)
    \hideCurvesFrom #'Staff.TimeSignature #'(0.3 . 0.3) #'(0 . 0)
    
    % a negative padding value can prevent whiteout near an edge:
    \hideCurvesFrom #'Staff.Clef          #'(0.3 . 0.3) #'(0 . -0.5)
    
    
    \clef bass
      \once \override TextScript #'extra-offset = #'(-8 . 0)
      e,2.\(^\markup \fontsize #-1 \italic
               {tacet la \concat {1 \super \lower #0.5 ma} volta:}
      d4( |
    
    \clef treble \key g \major
      c''4)^2 c2 b4~ |
    
    \time 3/4
      b2\) 
      % updating a previously entered command:
      \hideCurvesFrom #'Staff.Clef #'(0.3 . 0.3) #'(0 . 0)
      fis4( |
    
    \clef bass \time 2/4
      d,4)
      % always call \hideCurvesFrom before the curve starts:
      \hideCurvesFrom #'Score.VoltaBracket #'(0.3 . 0.8) #'(3 . 0)
      e4( |
  }
  
  \alternative {
    { r2 | }
    {
      % revert commands independently as needed:
      \revertHideCurvesFrom #'Score.VoltaBracket
      d2)
    }    
  }
    % revert commands when no longer needed:
    \revertHideCurvesFrom #'Fingering
    \revertHideCurvesFrom #'Staff.Clef
    \revertHideCurvesFrom #'Staff.KeySignature
    \revertHideCurvesFrom #'Staff.TimeSignature
}
%}

<<attachment: hideCurvesFrom.png>>

_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to