ich bin leider zu blöd, mir eine neue Version von lilypond zu installieren. Ich habe 2.14.2.
Du hattest Deine Version nicht angegeben. Wenn das jemand ausläßt gehe ich halt von der aktuellen stable aus und das ist momentan 2.16.2.
Also:
Bitte immer die Version angeben.
Tatsächlich wird hart daran gearbeitet 2.18. release-fertig zu machen. Insoweit solltest Du Dir Hilfe für das manuelle upgraden suchen (z.B. hier im Forum

), falls Deine Distibution nur eine veraltete LilyPond-Version liefert.
(Aber bitte in einem anderen/neuen Thread.)
Zum eigentlichen Thema:
Der code für die engraver ist tatsächlich auch für 2.14.2 geeignet.
Mein Code kompiliert nur deshalb nicht, weil ich ein bißchen "syntactic sugar" in das Beispiel eingefügt habe. Den kann man aber rausnehmen.
2.14.2-Version:
%\version "2.16.1"
\version "2.14.2"
% http://www.mail-archive.com/lilypond-user@gnu.org/msg69703.html
%% Thanks to Jay Anderson
#(define has-one-or-less (lambda (lst) (or (null? lst) (null? (cdr lst)))))
#(define has-at-least-two (lambda (lst) (not (has-one-or-less lst))))
#(define (all-equal lst pred)
(or (has-one-or-less lst)
(and (pred (car lst) (cadr lst)) (all-equal (cdr lst) pred))))
#(define merge-rests-engraver
(lambda (context)
(let ((rest-same-length
(lambda (rest-a rest-b)
(eq? (ly:grob-property rest-a 'duration-log)
(ly:grob-property rest-b 'duration-log))))
(rests '()))
`((start-translation-timestep . ,(lambda (trans)
(set! rests '())))
(stop-translation-timestep . ,(lambda (trans)
(if (and (has-at-least-two rests)
(all-equal rests rest-same-length))
(for-each
(lambda (rest)
(ly:grob-set-property! rest 'Y-offset 0))
rests))))
(acknowledgers
(rest-interface . ,(lambda (engraver grob source-engraver)
(if (eq? 'Rest (assoc-ref (ly:grob-property grob 'meta) 'name))
(set! rests (cons grob rests))))))))))
#(define merge-mmrests-engraver
(lambda (context)
(let* ((mmrest-same-length
(lambda (rest-a rest-b)
(eq? (ly:grob-property rest-a 'measure-count)
(ly:grob-property rest-b 'measure-count))))
(merge-mmrests
(lambda (rests)
(if (all-equal rests mmrest-same-length)
(let ((offset (if (eq? (ly:grob-property (car rests) 'measure-count) 1) 1 0)))
(for-each
(lambda (rest) (ly:grob-set-property! rest 'Y-offset offset))
rests)))))
(curr-rests '())
(rests '()))
`((start-translation-timestep . ,(lambda (trans)
(set! curr-rests '())))
(stop-translation-timestep . ,(lambda (trans)
(if (has-at-least-two curr-rests)
(set! rests (cons curr-rests rests)))))
(finalize . ,(lambda (translator)
(for-each merge-mmrests rests)))
(acknowledgers
(rest-interface . ,(lambda (engraver grob source-engraver)
(if (eq? 'MultiMeasureRest (assoc-ref (ly:grob-property grob 'meta) 'name))
(set! curr-rests (cons grob curr-rests))))))))))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\score {
<<
\new Staff
<<
<>-\markup { "LilyPond-2.14.2 default, Rests in both voices." }
\relative c'' { c4 d e r | r2 e4 g | R1 \compressFullBarRests R1*9 }
\\
\relative c'' { c4 b a r | r a g2 | R1 \compressFullBarRests R1*9 }
>>
\new Staff
\with {
\consists #merge-rests-engraver
\consists #merge-mmrests-engraver
}
<<
<>-\markup{ "Merge Rests and MultiMeasureRests in both voices." }
\relative c'' { c4 d e r | r2 e4 g | R1 \compressFullBarRests R1*9 } \\
\relative c'' { c4 b a r | r a g2 | R1 \compressFullBarRests R1*9 }
>>
>>
}Gruß,
Harm