%%%%%%%%%% 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! posListUp <)) (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! posListUp <)) (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 6 Staff.OttavaBracket \OSOPadder #OSOPCOL #'(0 1 0 1) Staff.OttavaBracket \OSOPadder #OSOPCOL #'(0 1 0 1) TupletBracket #}) #(define OSSLayoutB #{ %-----------ABOVE STAFF------------ (bottom -> top order) \OSOPadder #OSOPCOL #'(3 1 1 1) ^\OSBox \OSOPadder #OSOPCOL #'(1 1 1 1) ^\OSBox \OSOObj ^( \OSOPadder #OSOPCOL #'(1 1 1 1) ^\OSBox \OSOPadder #OSOPCOL #'(1 1 1 1) ^\OSBox \OSOPadder #OSOPCOL #'(0 1 0 1) ^> \OSOPadder #OSOPCOL #'(1 1 1 1) ^\OSBox %-----------BELOW STAFF------------ (top -> bottom order) \OSOPadder #OSOPCOL #'(1 1 1 1) _\OSBox \OSOPadder #OSOPCOL #'(1 1 1 1) _\OSBox \OSOPadder #OSOPCOL #'(0 1 3 1) _\mf %\< TODO \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 } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%