I just fixed the typo highlighted by Aaron. It was responsible of the
hairpin problem.
I also added these two lines, which strengthen the snippet in case of slurs
and hairpins

\override Staff.TextScript.avoid-slur = #'ignore
\override Staff.DynamicLineSpanner.outside-staff-padding = 0

Now all seems to work. Attached to this post there's the updated version.

HTH
P
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% SCHEME CODE %%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\version "2.19.83"

#(define PADDER_RECT_DEF_W (cons -3 3))
#(define OSPadderColor grey)
#(define OSPadderThickness 0.1)
#(define posIdxUp 0)
#(define posListUp '())
#(define posIdxDown 0)
#(define posListDown '())
#(define OSBox #{ \markup " " #})

#(define (box-stencil stencil thickness padding color expand?)
   "Add a box around @var{stencil}, producing a new stencil."
   (define (css-style-padding padding)
     ;; padding => (top right bottom left)
     (cond
       ((or (null? padding) (eqv? #f padding)) '(0 0 0 0))
       ((number? padding) (make-list 4 padding))
       ((number-pair? padding)
         (list (car padding) (cdr padding)
               (car padding) (cdr padding)))
       ((and (number-list? padding) (<= (length padding) 4))
         (case (length padding)
           ((1) (make-list 4 (first padding)))
           ((2) (list (first padding) (second padding)
                      (first padding) (second padding)))
           ((3) (list (first padding) (second padding)
                      (third padding) (second padding)))
           (else padding)))
       (else
         (begin (ly:warning "Ignoring invalid padding: ~a" padding)
                '(0 0 0 0)))))
          (let* ((padding (css-style-padding padding))
                 (padding-top (first padding))
                 (padding-right (second padding))
                 (padding-bottom (third padding))
                 (padding-left (fourth padding))

          (x-ext-orig (ly:stencil-extent stencil X))
          (y-ext-orig (ly:stencil-extent stencil Y))
          (x-ext-inner
            (cons (- (interval-start x-ext-orig) padding-left)
                  (+ (interval-end x-ext-orig) padding-right)))
          (y-ext-inner
            (cons (- (interval-start y-ext-orig) padding-bottom)
                  (+ (interval-end y-ext-orig) padding-top)))
          (x-ext-outer (interval-widen x-ext-inner thickness))
          (y-ext-outer (interval-widen y-ext-inner thickness))
          (x-ext-new (if expand? x-ext-outer x-ext-orig))
          (y-ext-new (if expand? y-ext-outer y-ext-orig))

          (x-rule (make-filled-box-stencil (cons 0 thickness) y-ext-inner))
          (y-rule (make-filled-box-stencil x-ext-outer (cons 0 thickness)))
          (box (stencil-with-color
            (ly:stencil-add
              (ly:stencil-translate-axis y-rule (interval-end y-ext-inner) Y)
              (ly:stencil-translate-axis x-rule (interval-end x-ext-inner) X)
              (ly:stencil-translate-axis y-rule (interval-start y-ext-outer) Y)
              (ly:stencil-translate-axis x-rule (interval-start x-ext-outer) X))
            color)))
     (ly:make-stencil
       (ly:stencil-expr (ly:stencil-add stencil box))
       x-ext-new y-ext-new)))

#(define* (make-stencil-boxer thickness padding
            #:optional (callback #f) (color OSPadderColor) (expand? #t))
   "Return function that adds a box around the grob passed as argument."
   (if (procedure? callback)
     (lambda (grob)
       (box-stencil (callback grob) thickness padding color expand?))
     (grob-transformer 'stencil (lambda (grob orig)
       (box-stencil orig thickness padding color expand?)))))

#(define (next-not-in-list n list) 
  (let ((s (+ 1 n))) 
    (if (memv s list) 
      (next-not-in-list s list) s)))

resetOSPositions  =  #(define-scheme-function () () 
  (set! posIdxUp 0)
  (set! posListUp '())
  (set! posIdxDown 0)
  (set! posListDown '()))

#(define (symbol-list-or-music? x) (or (symbol-list? x) (ly:music? x)))

OSOObj = #(define-music-function (arg) (ly:music?)
  (let ((posIdx 0)
        (name (ly:music-property arg 'name)))
  (if (eq? (ly:music-property arg 'direction) UP)
    (begin
      (set! posIdxUp (next-not-in-list posIdxUp posListUp))
      (set! posListUp (cons posIdxUp posListUp))
      (set! posListUp (sort! posListUp <))
      (set! posIdx posIdxUp))
    (begin
      (set! posIdxDown (next-not-in-list posIdxDown posListDown))
      (set! posListDown (cons posIdxDown posListDown))
      (set! posListDown (sort! posListDown <))
      (set! posIdx posIdxDown)))
    (cond
      ((eq? name 'AbsoluteDynamicEvent)
        #{ -\tweak DynamicLineSpanner.outside-staff-priority #(* 100 posIdx) #arg #})     
      ((eq? name 'SustainEvent)
        #{ -\tweak SustainPedalLineSpanner.outside-staff-priority #(* 100 posIdx) #arg #})
      ((eq? name 'SostenutoEvent)
        #{ -\tweak SostenutoPedalLineSpanner.outside-staff-priority #(* 100 posIdx) #arg #})
      ((eq? name 'UnaCordaEvent)
        #{ -\tweak UnaCordaPedalLineSpanner.outside-staff-priority #(* 100 posIdx) #arg #})      
      (else
        #{ -\tweak outside-staff-priority #(* 100 posIdx) #arg #}))))

OSOPadder = #(define-music-function (color thickness padding arg) ((color? white) (number? OSPadderThickness) scheme? symbol-list-or-music?)
  (let ((posIdx 0)
        (name (if (ly:music? arg) (ly:music-property arg 'name) "")))
    (if (ly:music? arg)
      (if (eq? (ly:music-property arg 'direction) UP)
        (begin
          (set! posIdxUp (next-not-in-list posIdxUp posListUp))
          (set! posListUp (cons posIdxUp posListUp))
          (set! posListUp (sort! posListUp <))
          (set! posIdx posIdxUp))
        (begin
          (set! posIdxDown (next-not-in-list posIdxDown posListDown))
          (set! posListDown (cons posIdxDown posListDown))
          (set! posListDown (sort! posListDown <))
          (set! posIdx posIdxDown))))
    (if (ly:music? arg)
      (cond
        ((eq? name 'AbsoluteDynamicEvent) #{ 
          -\tweak DynamicLineSpanner.padding 0
          -\tweak DynamicLineSpanner.staff-padding 0
          -\tweak DynamicLineSpanner.outside-staff-padding 0
          -\tweak stencil #(make-stencil-boxer thickness padding color)
          -\tweak DynamicLineSpanner.outside-staff-priority #(* 100 posIdx) #arg #})     
        ((eq? name 'SustainEvent) #{
          -\tweak SustainPedalLineSpanner.padding 0
          -\tweak SustainPedalLineSpanner.staff-padding 0
          -\tweak SustainPedalLineSpanner.outside-staff-padding 0  
          -\tweak SustainPedalLineSpanner.outside-staff-priority #(* 100 posIdx) 
          -\tweak SustainPedal.stencil #(make-stencil-boxer thickness padding color) #arg #})          
        ((eq? name 'SostenutoEvent) #{ 
          -\tweak SostenutoPedalLineSpanner.padding 0
          -\tweak SostenutoPedalLineSpanner.staff-padding 0
          -\tweak SostenutoPedalLineSpanner.outside-staff-padding 0             
          -\tweak SostenutoPedalLineSpanner.outside-staff-priority #(* 100 posIdx) 
          -\tweak SostenutoPedal.stencil #(make-stencil-boxer thickness padding color) #arg #})
        ((eq? name 'UnaCordaEvent) #{ 
          -\tweak UnaCordaPedalLineSpanner.padding 0
          -\tweak UnaCordaPedalLineSpanner.staff-padding 0
          -\tweak UnaCordaPedalLineSpanner.outside-staff-padding 0
          -\tweak stencil #(make-stencil-boxer thickness padding color) 
          -\tweak UnaCordaPedalLineSpanner.outside-staff-priority #(* 100 posIdx) #arg #})
        (else #{ 
          -\tweak padding 0
          -\tweak staff-padding 0
          -\tweak outside-staff-padding 0             
          -\tweak stencil #(make-stencil-boxer thickness padding color) 
          -\tweak outside-staff-priority #(* 100 posIdx) #arg #}))
      ;else (symbols)
      (cond
        ((memv 'OttavaBracket arg) #{
           \once \override Staff.OttavaBracket.padding = 0
           \once \override Staff.OttavaBracket.staff-padding = 0
           \once \override Staff.OttavaBracket.outside-staff-padding = 0
           \once \override Staff.OttavaBracket.stencil = 
           #(make-stencil-boxer OSPadderThickness padding color)  #})
        ((memv 'TupletBracket arg) #{
           \once \override TupletBracket.padding = 0
           \once \override TupletBracket.staff-padding = 0
           \once \override TupletBracket.outside-staff-padding = 0           
           \once \override TupletBracket.stencil = 
           #(make-stencil-boxer OSPadderThickness padding color)  #})))))   

setOSPosition = #(define-music-function (direction pos arg) (number? number? symbol-list?)                                       
  (if (eq? direction UP)
    (begin
      (set! posListUp (cons pos posListUp))
      (set! posListUp (sort! posListUp <)))
    (begin
      (set! posListDown (cons pos posListDown))
      (set! posListDown (sort! posListDown <))))
    #{ \once \override #arg .outside-staff-priority = #(* 100 pos) #})

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% USER CODE %%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define OSOPCOL grey)

{

\time 2/4

\set Staff.pedalSustainStyle = #'mixed
\once \override TupletBracket.direction = #UP

#(define OSSLayoutA  #{

\resetOSPositions
\setOSPosition #UP 2 TupletBracket
\setOSPosition #UP 4 Slur
\setOSPosition #UP 6 Staff.OttavaBracket
\setOSPosition #DOWN 4 DynamicLineSpanner

\OSOPadder #OSOPCOL #'(0 1 0 1) Staff.OttavaBracket
\OSOPadder #OSOPCOL #'(0 1 0 1) TupletBracket

#})

\override Staff.TextScript.avoid-slur = #'ignore
\override Staff.DynamicLineSpanner.outside-staff-padding = 0

#(define OSSLayoutB  #{

%-----------ABOVE STAFF------------ (bottom -> top order)
\OSOPadder #OSOPCOL #'(5 1 0 1) ^\OSBox
\OSOPadder #OSOPCOL #'(5 1 1 1) ^\OSBox
\OSOPadder #OSOPCOL #'(5 1 1 1) ^\OSBox
\OSOPadder #OSOPCOL #'(5 1 1 1) ^\OSBox
\OSOPadder #OSOPCOL #'(0 1 0 1) ^\fermata

%-----------BELOW STAFF------------ (top -> bottom order)
\OSOPadder #OSOPCOL #'(1 1 1 1) _\OSBox
\OSOPadder #OSOPCOL #'(1 1 1 1) _>
\OSOPadder #OSOPCOL #'(4 1 1 1) _\OSBox
\OSOPadder #OSOPCOL #'(0 1 0 1) _\p\<
\OSOPadder #OSOPCOL #'(1 0 1 0) _\sostenutoOn
\OSOPadder #OSOPCOL #'(1 1 1 1) _\OSBox
\OSOPadder #OSOPCOL #'(1 0 1 0) _\sustainOn
\OSOPadder #OSOPCOL #'(1 1 1 1) _\OSBox
\OSOPadder #OSOPCOL #'(0 1 0 1) _\markup {"Use ped. with care!"}
\OSOPadder #OSOPCOL #'(1 1 1 1) _\OSBox

#})


\tuplet 3/2 { $OSSLayoutA \ottava #1 c''''( $OSSLayoutB a'''' c''''\ff)\sustainOff\sostenutoOff \ottava #0 }

}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Reply via email to