\version "2.13.3" %%%%%% begin property-init.ly revision %%%%%% #(define (arpeggio-generic context pushpops) (let* ((parent (ly:context-property-where-defined context 'connectArpeggios)) (target (if (and (not (null? parent)) (eq? #t (ly:context-property parent 'connectArpeggios))) parent context))) (for-each (lambda (pushpop) (if (pair? pushpop) (ly:context-pushpop-property target 'Arpeggio (car pushpop) (cdr pushpop)) (ly:context-pushpop-property target 'Arpeggio pushpop))) pushpops))) #(define move-arpeggio-to-this-context ;; if the active arpeggio properties are set in GrandStaff, PianoStaff, ;; or StaffGroup, move them into this context (usually Voice). (lambda (context) (let ((parent (ly:context-property-where-defined context 'connectArpeggios))) (if (and (not (null? parent)) (eq? #t (ly:context-property parent 'connectArpeggios))) (let* ((Arpeggio (ly:context-grob-definition context 'Arpeggio)) (X-extent (assoc 'X-extent Arpeggio)) (stencil (assoc 'stencil Arpeggio)) (arpeggio-direction (assoc 'arpeggio-direction Arpeggio)) (direction (assoc 'direction Arpeggio)) (dash-definition (assoc 'dash-definition Arpeggio)) (props `((X-extent . ,X-extent) (stencil . ,stencil) (arpeggio-direction . ,arpeggio-direction) (direction . ,direction) (dash-definition . ,dash-definition)))) (for-each (lambda (prop) ;; copy .Arpeggio props to .Arpeggio (if (cdr prop) (ly:context-pushpop-property context 'Arpeggio (cadr prop) (cddr prop)) (ly:context-pushpop-property context 'Arpeggio (car prop))) ;; revert .Arpeggio props (ly:context-pushpop-property parent 'Arpeggio (car prop))) props)))))) #(define (connect-arpeggios-switch value) (lambda (context) (define target-list '(GrandStaff PianoStaff StaffGroup)) (define (find-target context) (if (member (ly:context-name context) target-list) context (let ((parent (ly:context-parent context))) (if parent (let ((parent-name (ly:context-name parent))) (if (member parent-name target-list) parent (find-target parent))) #f)))) (let ((target (find-target context))) (if target (ly:context-set-property! target 'connectArpeggios value) (ly:warning "No viable context found for connectArpeggios"))))) connectArpeggiosOn = \applyContext #(connect-arpeggios-switch #t) connectArpeggiosOff = { \applyContext #move-arpeggio-to-this-context \applyContext #(connect-arpeggios-switch #f) } arpeggioArrowUp = \applyContext #(lambda (context) (arpeggio-generic context `(stencil X-extent (arpeggio-direction . ,UP)))) arpeggioArrowDown = \applyContext #(lambda (context) (arpeggio-generic context `(stencil X-extent (arpeggio-direction . ,DOWN)))) arpeggioNormal = \applyContext #(lambda (context) (arpeggio-generic context '(stencil X-extent arpeggio-direction dash-definition))) arpeggioBracket = \applyContext #(lambda (context) (arpeggio-generic context `(X-extent (stencil . ,ly:arpeggio::brew-chord-bracket)))) %%%%%% end property-init.ly revision %%%%%% %%%%%% demonstration %%%%%% \new PianoStaff \relative << \new Staff { \arpeggioArrowUp 4\arpeggio \connectArpeggiosOn \arpeggioBracket 4\arpeggio \connectArpeggiosOff \arpeggio } \new Staff { \clef bass \arpeggioArrowDown 4\arpeggio \arpeggio \arpeggio } >>