\version "2.16.1" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% generalized offsetter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #(define (pair-list? x) (and (pair? x) (every number-pair? x))) #(define (offset-general arg offsets) (cond ((null? offsets) arg) ((number? arg) (+ arg offsets)) ((number-pair? arg) (coord-translate arg offsets)) ((pair-list? arg) (map (lambda (x y) (coord-translate x y)) arg offsets)))) #(define ((offsetter property offsets) grob) (let* ((immutable (ly:grob-basic-properties grob)) (target (assoc-get property (reverse immutable))) (vals (if (procedure? target) (if (procedure-name target) ; check for # (target grob) '()) target))) (if (or (number? vals) (number-pair? vals) (pair-list? vals)) (let* ((orig (ly:grob-original grob)) (siblings (if (ly:spanner? grob) (ly:spanner-broken-into orig) '())) (total-found (length siblings))) (define (helper sibs offs) (if (pair? offs) (if (eq? (car sibs) grob) (offset-general vals (car offs)) (helper (cdr sibs) (cdr offs))) vals)) ;; standardize form of offsets (if (or (null? offsets) (and (number? offsets) (number? vals)) (and (number-pair? offsets) (number-pair? vals)) (and (pair-list? offsets) (pair-list? vals))) (set! offsets (list offsets))) (if (>= total-found 2) (helper siblings offsets) (offset-general vals (car offsets)))) vals))) offset = #(define-music-function (parser location name property offsets) (string? scheme? scheme?) (let* ((name (string-regexp-substitute " " "" name)) ; remove any spaces (name-components (string-split name #\.)) (context-name "Voice") (grob-name #f)) (if (> 2 (length name-components)) (set! grob-name (car name-components)) (begin (set! grob-name (cadr name-components)) (set! context-name (car name-components)))) #{ \override $context-name . $grob-name $property = #(lambda (grob) ((offsetter property offsets) grob)) #})) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% staffUp = \change Staff = "upper" staffDown = \change Staff = "lower" soprano= \relative c'{ \time 2/4 s2 \once \offset Beam #'positions #'(1.75 . -1.5) % For broken beams, you would use something like the following: % \once \offset Beam #'positions #'((-1 . -2) (-3 . -2)) %\override Beam #'positions = #'(1 . 0.7) %can't adjust beam relative to upper staff centerline (desired) %\override Beam #'positions = #'(10.5 . 9.5) %values relative to lower staff centerline subject to between-staff distance \staffDown g8[ \staffUp e'd c] } bass = \relative c{ \clef bass s2 2} \score{ \new PianoStaff << \new Staff = "upper" \soprano \new Staff = "lower" \bass >> \layout{} }