Hallo,
\stemUp und \stemDown sind absolut ungeeignet eine dauerhafte Zweistimmigkeit zu etablieren, siehe folgendes Beispiel:
\version "2.18.2"
\score {
\new Staff
<<
\new Voice {
\stemUp
R1*2 R1 e'1-- -1 -"foo"
}
\new Voice {
\stemDown
\once \override MultiMeasureRest.extra-offset = #'(1 . 1) R1*3
c'1-- -2 -"bar"
}
>>
\layout { \context { \Score skipBars = ##t } }
}
Die tenutos sind praktisch nicht erkennbar, die Fingersätze werden übereinander gedruckt, die markups sind nicht eindeutig zuzuordnen, die einfachen Pausen werden übereinander gedruckt. Auch die Mehrtaktpausen werden übereinander gedruckt, was der extra-offset-override verdeutlichen sollte.
Mit einem Wort: g-r-a-u-e-n-h-a-f-t.
All das passiert nicht mit \voiceXxx.
Die Pausen werden separat gesetzt, ja, denn eigentlich
soll das ja auch so sein. Ansonsten kann man ja \partcombine verwenden:
\version "2.18.2"
mI = { R1*2 R1 r2 r4 r2 r4 r e'1-- -1 -"foo" }
mII = { R1*3 r4 r2 r2 r4 r c'1-- -2 -"bar" }
\partcombine \mI \mII
Wobei hier die markups auch nicht so schön gesetzt werden.
Nun sind aber Fälle denkbar, in denen \voiceXxx sinnvoll ist, man aber doch die (Ganztakt-)Pausen vereint sehen möchte.
Das LSR-snippet kümmert sich um die einfachen Pausen. Für die Ganztaktpausen wurde `merge-multi-measure-rest-on-Y-offset' entwickelt. Kannst ja mal in den Archiven danach suchen...
Mittlerweile gibt es aber engraver dafür.
http://www.mail-archive.com/lilypond-user%40gnu.org/msg69703.html\version "2.18.2"
#(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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mI = { R1*2 R1 r2 r4 r2 r4 r e'1-- -1 -"foo" }
mII = { R1*3 r4 r2 r2 r4 r c'1-- -2 -"bar" }
\score {
\new Staff
<<
\new Voice { \voiceOne \mI }
\new Voice { \voiceTwo \mII }
>>
\layout {
\context {
\Staff
\consists #merge-mmrests-engraver
\consists #merge-rests-engraver
}
\context {
\Score
\override BarNumber.padding = #3
skipBars = ##t
}
}
}
\mI
\mII
HTH,
Harm
P.S.
Pausen verschiebt man mittels 'staff-position, 'extra-offset ist absolut last ressort.
\version "2.18.2"
{
\once \override Rest.staff-position = #8
r1
\once \override MultiMeasureRest.staff-position = #-8
R1
}