Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: stefanhuglfing am Donnerstag, 3. November 2016, 08:19
-
In meinem ersten Beispiel sind mir die Pausen zu weit oben bzw. unten.
Das ist entstanden, weil eine Stimme die Zeile wechselt und die in der Zeile verbleibende Stimme dann in der Zeile allein bleibt
\version "2.18.2"
\score
{
<<
\new PianoStaff
<<
\new Staff = "R"
<<
\new Voice { \voiceOne r1 a'2 a' }
>>
\new Staff
<<
\clef "F"
\new Voice { \voiceOne e4 f g a \change Staff = "R" \voiceTwo { b c' d' e' } }
\new Voice { \voiceTwo a,2 a, r1 }
>>
>>
>>
\layout {}
}
Ich hätte sie gern in der Mitte. Das ist mir zwar im zweiten Beispiel gelungen, aber etwas abenteuerlich, finde ich:
Ich habe zusätzliche Stimmen eingefügt, um die Pausen zu verdoppeln, und sie dann wieder mit dem vorangestellten Schnipsel zu vereinigen.
\version "2.18.2"
%% http://lsr.dsi.unimi.it/LSR/Item?id=336
%% see also http://code.google.com/p/lilypond/issues/detail?id=1228
%% Usage:
%% \new Staff \with {
%% \override RestCollision.positioning-done = #merge-rests-on-positioning
%% } << \somevoice \\ \othervoice >>
%% or (globally):
%% \layout {
%% \context {
%% \Staff
%% \override RestCollision.positioning-done = #merge-rests-on-positioning
%% }
%% }
%%
%% Limitations:
%% - only handles two voices
%% - does not handle multi-measure/whole-measure rests
#(define (rest-score r)
(let ((score 0)
(yoff (ly:grob-property-data r 'Y-offset))
(sp (ly:grob-property-data r 'staff-position)))
(if (number? yoff)
(set! score (+ score 2))
(if (eq? yoff 'calculation-in-progress)
(set! score (- score 3))))
(and (number? sp)
(<= 0 2 sp)
(set! score (+ score 2))
(set! score (- score (abs (- 1 sp)))))
score))
#(define (merge-rests-on-positioning grob)
(let* ((can-merge #f)
(elts (ly:grob-object grob 'elements))
(num-elts (and (ly:grob-array? elts)
(ly:grob-array-length elts)))
(two-voice? (= num-elts 2)))
(if two-voice?
(let* ((v1-grob (ly:grob-array-ref elts 0))
(v2-grob (ly:grob-array-ref elts 1))
(v1-rest (ly:grob-object v1-grob 'rest))
(v2-rest (ly:grob-object v2-grob 'rest)))
(and
(ly:grob? v1-rest)
(ly:grob? v2-rest)
(let* ((v1-duration-log (ly:grob-property v1-rest 'duration-log))
(v2-duration-log (ly:grob-property v2-rest 'duration-log))
(v1-dot (ly:grob-object v1-rest 'dot))
(v2-dot (ly:grob-object v2-rest 'dot))
(v1-dot-count (and (ly:grob? v1-dot)
(ly:grob-property v1-dot 'dot-count -1)))
(v2-dot-count (and (ly:grob? v2-dot)
(ly:grob-property v2-dot 'dot-count -1))))
(set! can-merge
(and
(number? v1-duration-log)
(number? v2-duration-log)
(= v1-duration-log v2-duration-log)
(eq? v1-dot-count v2-dot-count)))
(if can-merge
;; keep the rest that looks best:
(let* ((keep-v1? (>= (rest-score v1-rest)
(rest-score v2-rest)))
(rest-to-keep (if keep-v1? v1-rest v2-rest))
(dot-to-kill (if keep-v1? v2-dot v1-dot)))
;; uncomment if you're curious of which rest was chosen:
;;(ly:grob-set-property! v1-rest 'color green)
;;(ly:grob-set-property! v2-rest 'color blue)
(ly:grob-suicide! (if keep-v1? v2-rest v1-rest))
(if (ly:grob? dot-to-kill)
(ly:grob-suicide! dot-to-kill))
(ly:grob-set-property! rest-to-keep 'direction 0)
(ly:rest::y-offset-callback rest-to-keep)))))))
(if can-merge
#t
(ly:rest-collision::calc-positioning-done grob))))
\score
{
<<
\new PianoStaff
<<
\new Staff = "R"
\with { \override RestCollision.positioning-done = #merge-rests-on-positioning }
<<
\new Voice { \voiceOne << \new Voice { r1 } { r1 } >> a'2 a' }
>>
\new Staff
\with { \override RestCollision.positioning-done = #merge-rests-on-positioning }
<<
\clef "F"
\new Voice { \voiceOne e4 f g a \change Staff = "R" \voiceTwo { b c' d' e' } }
\new Voice { \voiceTwo a,2 a, << \new Voice { r1 } { r1 } >> }
>>
>>
>>
\layout {}
}
die Pausen mit 'staff-position' zu verschieben, erscheint mir auch umständlich, denn das müsste ich ja für jede Pause einzeln machen.
Weiß jemand eine praktische Methode?
-
Ich hätte sie gern in der Mitte. Das ist mir zwar im zweiten Beispiel gelungen, aber etwas abenteuerlich, finde ich:
Ich habe zusätzliche Stimmen eingefügt, um die Pausen zu verdoppeln, und sie dann wieder mit dem vorangestellten Schnipsel zu vereinigen.
In der Tat sehr abenteuerlich und ein ungerechtfertigter Aufwand.
die Pausen mit 'staff-position' zu verschieben, erscheint mir auch umständlich, denn das müsste ich ja für jede Pause einzeln machen.
Warum denn einzeln? Hast du auch in Zweistimmigkeit so viele Pausen? Und einfacher als jedes Mal ne neue Stimme anzulegen ist es allemal. Übrigens: Du solltest für Ganztaktpausen R1 statt r1 verwenden, dann werden die zentriert, wie es sich gehört ;)
Weiß jemand eine praktische Methode?
Entweder du machst nen allgemeinen \override:
\new PianoStaff \with { \override MultiMeasureRest.staff-position = 2 } << … >>Oder wenn du nicht alle Pausen damit erwischen willst, setzt du halt \oneVoice (oder \once \oneVoice, wenns nur eine ist) vor die Pausen.
-
Fugenkomponist, da hätte ich noch ein Frage.
Mit
c4\rest
kann ich ja die Höhe der Pause beeinflussen, Rx setzt mir die Pause in die Mitte.
c1\Rest
klappt leider nicht, wenn ich eine Ganztaktpause mittig platziert haben will. Gibt es für diesen Fall eine elegante Lösung oder muss ich mit diversen Einstellungen herumprobieren?
-
Danke! "\oneVoice" war, was ich gesucht habe. Ich wusste, so etwas gibt es, aber ich habe nach \voiceNeutral gesucht.
Ein Minimalbeispiel mit Angabe der LilyPond-Version erhöht die Chancen auf schnelle, entspannte und hilfreiche Antworten
Waren meine Beispiel nicht minimal genug?
-
wenn ich eine Ganztaktpause mittig platziert haben will. Gibt es für diesen Fall eine elegante Lösung oder muss ich mit diversen Einstellungen herumprobieren?
So etwas wie c\Rest gibts wirklich nicht, aber rumprobieren musst du nicht, der folgende override ist schlüsselunabhängig:
\override MultiMeasureRest.staff-position = 2Zur Erklärung der 2: die ganze Pause wird mit ihrer oberen Kante 2 Positionen, also eine Terz oberhalb der mittleren Notenlinie (0), positioniert.
Und Stefan, das ist meine Signatur, betraf also nicht speziell deinen Post.
-
So etwas wie c\Rest gibts wirklich nicht, aber rumprobieren musst du nicht, der folgende override ist schlüsselunabhängig:
\override MultiMeasureRest.staff-position = 2
Danke, ich hoffe bloß, es fällt mir wieder ein, wenn ich es brauche ;)