Autor Thema: Pausen zu tief nach Zeilenwechsel einer Stimme  (Gelesen 2247 mal)

stefanhuglfing

  • Member
Pausen zu tief nach Zeilenwechsel einer Stimme
« 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?

fugenkomponist

  • Member
Re: Pausen zu tief nach Zeilenwechsel einer Stimme
« Antwort #1 am: Donnerstag, 3. November 2016, 08:59 »
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.
Zitat
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 ;)
Zitat
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.

Manuela

  • Member
Re: Pausen zu tief nach Zeilenwechsel einer Stimme
« Antwort #2 am: Donnerstag, 3. November 2016, 11:00 »
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?

stefanhuglfing

  • Member
Re: Pausen zu tief nach Zeilenwechsel einer Stimme
« Antwort #3 am: Donnerstag, 3. November 2016, 13:57 »
Danke! "\oneVoice" war, was ich gesucht habe. Ich wusste, so etwas gibt es, aber ich habe nach \voiceNeutral gesucht.

Zitat
Ein Minimalbeispiel mit Angabe der LilyPond-Version erhöht die Chancen auf schnelle, entspannte und hilfreiche Antworten
Waren meine Beispiel nicht minimal genug?
« Letzte Änderung: Donnerstag, 3. November 2016, 13:59 von stefanhuglfing »

fugenkomponist

  • Member
Re: Pausen zu tief nach Zeilenwechsel einer Stimme
« Antwort #4 am: Donnerstag, 3. November 2016, 14:57 »
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.

Manuela

  • Member
Re: Pausen zu tief nach Zeilenwechsel einer Stimme
« Antwort #5 am: Donnerstag, 3. November 2016, 15:05 »
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  ;)