Autor Thema: self-alignment-x funktioniert nicht bei geänderten Kontexten  (Gelesen 2760 mal)

xr

  • Member
self-alignment-x funktioniert nicht bei geänderten Kontexten
« am: Montag, 9. Januar 2017, 12:05 »
Hi,

Ich versuche Text innerhalb eines Scores unterschiedlich zu setzen.

Deshalb habe ich aus dem allgemeinen Kontext den Hyphen_engraver und den Lyric_engraver entfernt und in neu definierten Kontexten wieder hinzugefügt.
In den neuen Definitionen funktionieren soweit alle neuen Einstellungen bis auf self-alignment-x.
self-alignment-x wird nur beim ersten Mal berücksichtigt, danach bleibt der Text linksbündig.

Muss ich eventuell noch mehr ändern?

Hier ist ein Beispiel:
\version "2.18.2"

\score {
 
  <<
  \relative {
   
    \time 4/4
    e'4 e4 e4 e4 | e4 e4 e4 e4 \break
    e'4 e4 e4 e4 | e4 e4 e4 e4
  }
  \addlyrics {
    \new standard {test test test test test test test test}
    \new version { test test test test test test test test}
  }
>>

  \layout  {
   
    \context {
      \Lyrics
     
      \remove "Hyphen_engraver"
      \remove "Lyric_engraver"

      \accepts "standard" 
      \accepts "version"
    }

    \context {
      \name standard
      \type "Engraver_group"
     
      \consists "Bar_engraver"
      \consists "Lyric_engraver"
      \consists "Hyphen_engraver"

      \override LyricText.self-alignment-X = #1
      \override LyricSpace.minimum-distance = #1
      \alias Lyrics 
    }
   
    \context {
      \name version
      \type "Engraver_group"

      \consists "Lyric_engraver"
      \consists "Hyphen_engraver"

      % Diese Einstellungen funktionieren
      \override LyricText.Y-offset = #-3
      \override LyricSpace.minimum-distance = #10
      \override LyricText.font-size = #3
     
      % funktioniert nicht
      \override LyricText.self-alignment-X = #1
     
      \alias Lyrics
    }   
  }
}


Vielen Dank für Hilfe,
Xaver
« Letzte Änderung: Montag, 9. Januar 2017, 12:07 von xr »

xr

  • Member
Re: self-alignment-x funktioniert nicht bei geänderten Kontexten
« Antwort #1 am: Montag, 9. Januar 2017, 16:47 »
Wie ich herausgefunden habe, funktioniert self-alignment-x dann nicht, wenn vor der Nutzung eines eigenen Kontextes noch kein Text im allgemeinen Kontext gesetzt wurde.
Als Workaround habe ich daher einen Dummy eingefügt. Nach dem Dummy funktioniert self-alignment-x wie es soll.

Ich nehme an, dass dieses Verhalten ein Bug ist - (fällt wohl bei normaler Nutzung nicht auf)

Hier mal der Code:
\version "2.18.2"

dummy = {
  \once \omit Score.TimeSignature
  \once \omit Score.Clef
  \partial 64
  \once  \hideNotes       
   e'64   
   \once \omit Score.BarLine
}

\score {
 
  <<
  \relative {   
    \dummy
    \time 4/4       
    e4 e4 e4 e4 | e4 e4 e4 e4 \break   
    e4 e4 e4 e4 | e4 e4 e4 e4 \break
  }
  \addlyrics {
    dummy_text       
    \new standard  { testa test test test test test test test } \break
    \new version {test test test test test test test test }                   
  }
>>

  \layout  {
   
    \context {
      \Lyrics
     
      \remove "Hyphen_engraver"
      \remove "Lyric_engraver"
     
      \accepts "version"
      \accepts "standard"       
    }


    \context {
      \name standard
      \type "Engraver_group"

      \consists "Lyric_engraver"
      \consists "Hyphen_engraver"

      \override LyricText.self-alignment-X = #1
      \override LyricSpace.minimum-distance = #1
      \override LyricText.Y-offset = #1     
     
      \alias Lyrics 
    }
   
    \context {
      \name version
      \type "Engraver_group"

      \consists "Lyric_engraver"
      \consists "Hyphen_engraver"

      \override LyricText.Y-offset = #-3
      \override LyricSpace.minimum-distance = #20
      \override LyricText.font-size = #3
      \override LyricText.self-alignment-X = #0
     
      \alias Lyrics
    }   
  }
}

Auf diese Weise wird am Anfang ein Auftakt eingefügt, dessen einzelne Komponenten wieder ausgeblendet werden. Dadurch wird der Anfangstakt linksseitig etwas länger.
Gibt es da vielleicht noch eine einfachere oder bessere Lösung?

harm6

  • Member
Re: self-alignment-x funktioniert nicht bei geänderten Kontexten
« Antwort #2 am: Montag, 9. Januar 2017, 23:15 »
Zitat
Gibt es da vielleicht noch eine einfachere oder bessere Lösung?

(1)
Upgrade auf eine neue devel-Version (mit 2.19.52 hats direkt funktioniert, mittlerweile ist 2.19.54 raus)

Aber warum dieses rumeiern mit neuen Kontexten, die dann in einem Lyrics-context aufgerufen werden?

Geht doch viel simpler mit ein paar overrides:

(2)
lyrSetsI = {
  \override LyricText.self-alignment-X = #1
  \override LyricSpace.minimum-distance = #1
}

lyrSetsII = {
      \override LyricText.Y-offset = #-3
      \override LyricSpace.minimum-distance = #10
      \override LyricText.font-size = #3
      \override LyricText.self-alignment-X = #0
}

\score {
  <<
    \relative {
     
      \time 4/4
      e'4 e4 e4 e4 | e4 e4 e4 e4 \break
      e'4 e4 e4 e4 | e4 e4 e4 e4
    }
    \addlyrics {
      \lyrSetsI test test test test test test test test
      \lyrSetsII test test test test test test test test
    }
  >>
}


Gruß,
  Harm

Manuela

  • Member
Re: self-alignment-x funktioniert nicht bei geänderten Kontexten
« Antwort #3 am: Dienstag, 10. Januar 2017, 09:14 »
Aber warum dieses rumeiern mit neuen Kontexten, die dann in einem Lyrics-context aufgerufen werden?

Geht doch viel simpler mit ein paar overrides:


Harm, mir geht es auch oft so, dass ich auf die einfache Lösung erst vieeel später draufkomme  ;)

Aber es wird besser...

harm6

  • Member
Re: self-alignment-x funktioniert nicht bei geänderten Kontexten
« Antwort #4 am: Dienstag, 10. Januar 2017, 09:44 »
Zitat von: harm
Aber warum dieses rumeiern mit neuen Kontexten, die dann in einem Lyrics-context aufgerufen werden?
Zitat von: Manuela
Harm, mir geht es auch oft so, dass ich auf die einfache Lösung erst vieeel später draufkomme

Die einfachste Lösung für das gezeigte Problem sind wohl einfache overrides. Es mag aber Gründe für neue Kontexte geben, die auf Grund der Kürze des minimal-Beispiels nicht ersichtlich werden.
Deshalb meine durchaus ernst gemeinte Frage.

Gruß,
  Harm

xr

  • Member
Re: self-alignment-x funktioniert nicht bei geänderten Kontexten
« Antwort #5 am: Dienstag, 10. Januar 2017, 10:24 »
Zitat von: harm
Es mag aber Gründe für neue Kontexte geben

Mit vers. 2.19.54 funktioniert es, vor allem funktioniert auch, was der eigentliche Grund für diese Konstruktion war:

Ich will Text mal über die Taktgrenzen hinausfließen lassen, mal auf die Takte begrenzen.
Darüberhinaus will ich Text unterschiedlich formatieren können - was auch ohne Kontexte prima geht.

Deshalb habe ich ein \consists "Bar_engraver" in den Kontext eingebunden, der den Text begrenzen soll. (Siehe Beispiel.)
Gäbe es dafür noch eine andere Möglichkeit?

Mit der version 2.19.54 bekomme ich jetzt allerdings Fehler angezeigt - auch wenn ich den "Bar_engraver" wieder herausnehme:
Programmierfehler: mis-predicted force, 108.120472 ~= 107.955649

Wenn ich den Score, den ich gerade bearbeite, mit 2.19.54 starte, habe ich dutzende solcher Fehler.

\version "2.19.54"

\paper {
 indent = 0.0\cm 
}


\score {
 
  <<
  \relative {   
     
    \time 4/4       
    e'4 e4 e4 e4 | e4 e4 e4 e4 \break   
     e4 e4 e4 e4 | e4 e4 e4 e4 \break
     e4 e4 e4 e4 | e4 e4 e4 e4 \break
  }
  \addlyrics {
         
    \new standard  { ---------- ---------- ---------- ---------- über-Takt ---------- ---------- ---------- }
    \new version   { ---------- ---------- ---------- ---------- nicht-drüber ---------- ---------- ---------- }   
    \new standard  { ---------- ---------- ---------- ---------- über-Takt ---------- ---------- ---------- }
  }
>>

  \layout  {
   
    \context {
      \Lyrics
     
      \remove "Hyphen_engraver"
      \remove "Lyric_engraver"
     
      \accepts "version"
      \accepts "standard"       
    }


    \context {
      \name standard
      \type "Engraver_group"

      \consists "Lyric_engraver"
      \consists "Hyphen_engraver"

      \override LyricText.self-alignment-X = #0     
      \alias Lyrics 
    }
   
    \context {
      \name version
      \type "Engraver_group"

      \consists "Lyric_engraver"
      \consists "Hyphen_engraver"
      \consists "Bar_engraver"
     
      \override BarLine.bar-extent = #'(-2 . 2)
     
      \alias Lyrics
    }   
  }
}

Gruß,
Xaver


« Letzte Änderung: Dienstag, 10. Januar 2017, 10:29 von xr »

xr

  • Member
Re: self-alignment-x funktioniert nicht bei geänderten Kontexten
« Antwort #6 am: Dienstag, 10. Januar 2017, 14:02 »
Leider funktioniert es doch noch nicht wie gewollt.
Sobald ich den Kontext, der den Bar_engraver enthält, zuerst anspreche, ist der auch im folgenden Kontext, obwohl der ihn gar nicht enthält.
Umgehen kann ich das wieder nur mit einem Dummy.

\version "2.19.54"

\paper {
 indent = 0.0\cm 
}


\score {
 
  <<
  \relative {   
     
    \time 4/4       
    e'4 e4 e4 e4 | e4 e4 e4 e4 \break   
     e4 e4 e4 e4 | e4 e4 e4 e4 \break
  }
  \addlyrics {
    \new version   { ---------- ---------- ---------- ---------- nicht-drüber ---------- ---------- ---------- }     
    \new standard  { ---------- ---------- ---------- ---------- über-Takt ---------- ---------- ---------- }
  }
>>

  \layout  {
   
    \context {
      \Lyrics
     
      \remove "Hyphen_engraver"
      \remove "Lyric_engraver"
     
      \accepts "version"
      \accepts "standard"       
    }


    \context {
      \name standard
      \type "Engraver_group"

      \consists "Lyric_engraver"
      \consists "Hyphen_engraver"

      \override LyricText.self-alignment-X = #0     
      \alias Lyrics 
    }
   
    \context {
      \name version
      \type "Engraver_group"

      \consists "Lyric_engraver"
      \consists "Hyphen_engraver"
      \consists "Bar_engraver"
     
      \override BarLine.bar-extent = #'(-2 . 2)
     
      \alias Lyrics
    }   
  }
}


Bei dem Bild sieht man, dass in der zweiten Zeile Taktstriche zwischen den Lyrics sind, die da nicht sein sollten. Und der Text "über-Takt" geht auch nicht mehr über den Taktstrich hinaus.
« Letzte Änderung: Dienstag, 10. Januar 2017, 14:07 von xr »

xr

  • Member
Re: self-alignment-x funktioniert nicht bei geänderten Kontexten
« Antwort #7 am: Freitag, 13. Januar 2017, 10:41 »
Ich habe nochmal bessere Beispiele erstellt.

Zum Code und was eigentlich gesetzt werden sollte:
- In beiden Kontexten sollte der Text rechtsbündig gesetzt werden (für bessere Sichtbarkeit der Effekte).
- Im Kontext STANDARD soll der Text über die Taktgrenzen hinausfliessen.
- Im Kontext VERSION wird \consists "Bar_engraver" gesetzt. Das soll den Text innerhalb der Taktgrenzen halten.


Folgende Fehler treten auf:

Lily 2.18.2
- Wird \consists "Bar_engraver" im ersten Kontext gesetzt, wird er in anderen Kontexten nicht wieder entfernt
- LyricText.self-alignment-X funktioniert nur im ersten verwendeten Kontext

Lily 2.19.54
- Wird \consists "Bar_engraver" im ersten Kontext gesetzt, wird er in anderen Kontexten nicht wieder entfernt


Außerdem weist der Text in 2.19.54 plötzlich größere Lücken auf. Sehr unschön. (Vgl. erste Zeile, 1 + 3, am Taktstrich)

Hier der Code:
\version "2.18.2"

\paper {
 indent = 0.0\cm 
}


\score {
 
  <<
  \relative {   
    \time 4/4       
     e'4 e4 e4 e4 | e4 e4 e4 e4
     e4 e4 e4 e4 | e4 e4 e4 e4
     e4 e4 e4 e4 | e4 e4 e4 e4
  }
  \addlyrics {
    % comment first line to see differences
    \new version   { VERSION xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx }     
    \new standard  { STANDARD xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx }
    \new version   { VERSION xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx }
    \new standard  { STANDARD xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxxxxx }
  }
>>

  \layout  {
   
    \context {
        \Lyrics           
        \remove "Lyric_engraver"
        \remove "Hyphen_engraver"
           
        \accepts "version"
        \accepts "standard"       
    }
   
    \context {
        \Staff     
        \remove "Clef_engraver"
        \remove "Time_signature_engraver"
    }

    \context {
        \name standard
        \type "Engraver_group"
       
        \consists "Lyric_engraver"
        \consists "Hyphen_engraver"
       
        \override LyricText.self-alignment-X = #1     
        \alias Lyrics 
    }
   
    \context {
        \name version
        \type "Engraver_group"
       
        \consists "Lyric_engraver"
        \consists "Hyphen_engraver"
        \consists "Bar_engraver"
       
        \override BarLine.bar-extent = #'(-2 . 2)
        \override LyricText.Y-offset = #2
        \override LyricText.self-alignment-X = #1   
        \alias Lyrics
    }     
  }
}



Vielleicht mal kurz zu meiner Motivation, mich mit Kontexten und Gesangstext so genau zu beschäftigen:
Ich setze rhythmisch notierte Sprache und habe daher etwas speziellere Anforderungen (siehe Bsp im Anhang). Lilypond funktioniert unter allen Lösungen, die ich probiert habe, am besten. Aber für einen wirklich guten Satz fehlt mir noch das letzte Quentchen.

Vielleicht weiß ja auch jemand einen besseren Ausweg als die Nutzung von Kontexten?

Gruß,
Xaver