Form gleichzeitiger Bindebögen unabhängig voneinander verändern

Begonnen von flatfoot, Mittwoch, 31. Oktober 2018, 11:14

« vorheriges - nächstes »

flatfoot

Hallo zusammen,

ich versuche, zwei gleichzeitige Bindebögen um eine dritte Stimme herum zu führen, jedoch verändert der override-Befehl in der einen Stimme den Bindebogen in der anderen Stimme mit.

Kann mir jemand dabei helfen, die beiden Bögen unabhängig voneinander zu verändern?


\version "2.18.0"

refMelEins = \relative e' {
e2
\voiceOne
\once \override Tie.control-points = #'((1.75 . 0.5) (3 . 2.15) (12.5 . 2.15) (15 . 0.75))
e ~ | e2.
\oneVoice

\bar "|."
}

refMelZwei = \relative b' {
b2
\voiceOne
b ~ | b2.
\oneVoice
}

refMelDrei = \relative e' {
e2
<<
\new Voice {
\voiceTwo
\override NoteColumn.force-hshift = #1.5
\once \override NoteColumn.force-hshift = #2.5
g8[ a] g( fis ) |
\once \override NoteColumn.force-hshift = #1.5
g2.
}
>>
\oneVoice
}

\new Voice = "Refrain" {
<<
\key e \minor
\time 4/4
\refMelEins
\refMelZwei
\refMelDrei
>>
}

Arnold

Hallo,

vielleicht lag in deiner Frage schon die Antwort.

Zu einem Zeitstempel kann ja jeweils nur ein Bindebogen (und ein Haltebogen und ein Phrasierungsbogen) anfangen - innerhalb eines Kontextes, hier der Voice-Kontext.

Somit bleibt \override Tie... innerhalb der Voice begrenzt, in welcher es definiert wurde - dann also in jedem Voice-Kontext für dessen Tie-Grob ein eigenes override definieren.
Ein \override Staff.Tie... funktioniert so lange, so lange in der Voice keine anderen Festlegungen die Staff-weite Definition verdecken.

Arnold


flatfoot

Zitat von: Arnold am Mittwoch, 31. Oktober 2018, 12:56
...

Zu einem Zeitstempel kann ja jeweils nur ein Bindebogen (und ein Haltebogen und ein Phrasierungsbogen) anfangen - innerhalb eines Kontextes, hier der Voice-Kontext.

...

Es werden ja aber, wenn man das \once \override in der ersten Stimme auskommentiert, zwei Haltebögen ausgegeben. Auch wenn man es nicht auskommentiert, werden zwei ausgegeben, die sich aber eben überlagern. Hier der Vergleich:






Mit dem tweak-Befehl lassen sich auch Dinge, die zum gleichen Zeitpunkt in einem Kontext stehen, modifizieren. Nur bin ich noch nicht dahinter gekommen, wie das in diesem Fall gehen würde.

Ich freue mich weiterhin über Lösungsvorschläge!

P.S.: Mich würde auch interessieren, wie ich im letzten Takt das g nach rechts verschieben kann, ohne dass die Punkte der beiden anderen Noten mit verschoben werden.

harm6

Hallo,

Zitatich versuche, zwei gleichzeitige Bindebögen um eine dritte Stimme herum zu führen,

hier liegt ein Irrtum vor. Du hast nur zwei Stimmen!
Die übergeordneten Stimme, Du hast sie "Refrain" benannt, enthält bis auf die neu initierte temporäre Voice nur simultaneous-music, alles andere wird dieser "Refrain"-Voice zugeschlagen.
Mit der Folge, daß Du die einzelnen Ties nicht mehr separat ansprechen kannst.

Ich rate dringend dazu Akkorde zu verwenden wo möglich und ansonsten explizit Voices zu kreieren, solange Du nicht wirklich weißt was Du tust birgt simultaneous-music dieser Art zu viele Fußangeln.

Ich hab mal einen code geschrieben mit dem man sich das context-Gefüge anzeifen lassen kann.
'printBottomContextParents' sollte an letzt-möglicher Stelle eingefügt werden:


%% Print a context-tree from Global down to bottom

#(define (single-context-parent-tree ctx)
  (if (and (ly:context? ctx) (ly:context? (ly:context-parent ctx)))
      (single-context-parent-tree (ly:context-parent ctx))
      (format #f "~a" ctx)))

printBottomContextParents =
\context Bottom
\applyContext
  #(lambda (a)
    (let ((ls (drop-right
                (string-split
                  (single-context-parent-tree a)
                  (car (string->list "(")))
                1)))
    (format #t "\n\nThe Context-parent-tree:")
    (format #t
      "\n(Only contexts of type Global, Score, Staff and Voice are printed)")
    (for-each
      (lambda (s)
        (format #t "\n~a~a"
          (cond ((string-contains s "Score")
                 (make-string 1 #\tab))
                ((string-contains s "Staff")
                 (make-string 2 #\tab))
                ((string-contains s "Voice")
                 (make-string 3 #\tab))
                (else ""))
          (string-trim-both s (lambda (c)
                                (or (eqv? c #\>) 
                                    (eqv? c #\sp)
                                    (eqv? c #\)))))))
      ls)))
     
      \version "2.18.0"

refMelEins = \relative e' {
e2
\voiceOne
\once \override Tie.control-points = #'((1.75 . 0.5) (3 . 2.15) (12.5 . 2.15) (15 . 0.75))
e ~ | e2.
\oneVoice

\bar "|."
}

refMelZwei = \relative b' {
b2
\voiceOne
b ~ | b2.
\oneVoice
}

refMelDrei = \relative e' {
e2
<<
\new Voice {
\voiceTwo
\override NoteColumn.force-hshift = #1.5
\once \override NoteColumn.force-hshift = #2.5
g8[ a] g( fis ) |
\once \override NoteColumn.force-hshift = #1.5
g2.
}
>>
\oneVoice
\printBottomContextParents
}

\new Voice = "Refrain" {
<<
\key e \minor
\time 4/4
\refMelEins
\refMelZwei
\refMelDrei
>>
}


Zitat von: terminalThe Context-parent-tree:
(Only contexts of type Global, Score, Staff and Voice are printed)
#<Global_context Global
   #<Context Score=\new
      #<Context Staff=\new
         #<Context Voice=Refrain
         #<Context Voice

Staff und Score werden von LilyPond automatisch gesetzt, falls der user es noch nicht gemacht hat. Der Global-context ist normalerweise nicht zugänglich.
Du siehst exakt zwei Voices!!

Falls Du nicht von Deinem setup lassen magst, kannst Du Tie.details.height-limit sowie \offset control-points verwenden.
Aber falls das nicht hinreicht, so befolge meinen obigen Rat.

ZitatMich würde auch interessieren, wie ich im letzten Takt das g nach rechts verschieben kann, ohne dass die Punkte der beiden anderen Noten mit verschoben werden.
Hierzu entferne den Dot_column_engraver aus dem Staff- und packe ihn in den Voice-context. Führt zu:


\version "2.18.0"

refMelEins = \relative e' {
\override NoteHead.color = #red
e2
\voiceOne
\once \override Tie.details.height-limit = 2
\offset control-points #'((0 . 0.2) (0 . 1) (0 . 1) (0 . 0.2)) Tie
e ~ | e2.
\oneVoice

\bar "|."
}

refMelZwei = \relative b' {
b2
\voiceOne
b ~ | b2.
\oneVoice
}

refMelDrei = \relative e' {
e2
<<
\new Voice  {
\voiceTwo
\override NoteColumn.force-hshift = #1.5
\once \override NoteColumn.force-hshift = #2.5
g8[ a] g( fis ) |
\once \override NoteColumn.force-hshift = #1.8
g2.
}
>>
\oneVoice
}

\layout {
  \context {
    \Staff
    \remove "Dot_column_engraver"
  }
  \context {
    \Voice
    \consists "Dot_column_engraver"
  }
}

\new Voice = "Refrain" {
<<
\key e \minor
\time 4/4
\refMelEins
\refMelZwei
\refMelDrei
>>
}


HTH,
  Harm

flatfoot

Vielen Dank für die ausführliche Antwort!

Habe das Problem mit den Haltebögen inzwischen mit Hilfe von
\override TieColumn #'tie-configuration = ...
gelöst. Das Ergebnis ist beileibe nicht perfekt, aber in Ordnung.

Danke auch für den Hinweis zum Dot_column_engraver!

Grüße
flatfoot