Autor Thema: new barlines - \bar "S" and \repeat volta  (Gelesen 3542 mal)

harm6

  • Member
new barlines - \bar "S" and \repeat volta
« am: Donnerstag, 21. Juni 2012, 11:34 »
War: Spacing zwischen Buchstaben in TextMarkup

Zitat von: Arnold
Wenn Du was für mich tun wilst, dann schau mal, wie man das »neue Segno« (\bar "S" und Co.) zur Kooperation mit \repeat volta bringt. Die Lösung könnte ein 'apply context' für »Segno bitte hier« sein, welches dann im gleichen Engraver ausgewertet wird, welcher letztlich die Wiederholungszeichen für \repeat & \alternative setzt. Der hat erst kürzlich zwei weitere Variablen bekommen, (jetzt drei gesamt) mit denen der Anwender seine Wiederholungszeichenwünsche angeben kann - mit dieser angedachten Erweiterung wären's halt dann sieben (für die mit-Segno-Zeichen-Varianten und das Segno-Zeichen ohne Wiederholungszeichen zusätzlich).

Hintergrund:
Gemeisam mit Marc Hohl beschäftige ich mich seit einiger Zeit damit nicht nur issue 1320 anzugehen sondern die barlines komplett neu in scheme zu definieren.
Der Code wurde erstmalig hier auf der devel-list vorgestellt. [1]
(Leider haben sich die anderen Entwickler auf ein absolut nebensächliches Thema gestürzt, so daß substantielle Kritik leider ausblieb)
Im Moment versucht Marc erstmal die C++->scheme-Portierung ohne jegliches zusätzliches feature durchzubringen.
http://codereview.appspot.com/6305115/

Die neuen context-properties: endRepeatType = "..." und startRepeatType = "..." entstammen  dieser Arbeit und bereiten das neue user-interface vor (das dann hoffentlich irgendwann funktionieren wird). -> http://codereview.appspot.com/6210049

Wir haben allerdings schon bemerkt, daß es ein Problem mit der volta-bracket gibt: Wenn man vom default-glyph für das Wiederholungszeichen abweicht, wird die Klammer nicht mehr geschlossen.
Arnold, ist das das Problem welches Du meinst? (->png)

\version "2.15.39"

\paper {
        indent = 30
}
             
\layout {
        \context {
        \Score
        startRepeatType = "S|:"
        endRepeatType = ":|S"
                doubleRepeatType = ":|S|:"

        }
}
\new Staff \with { instrumentName = \markup \center-column { "\\repeat" "and" "\\alternative" } }
\relative c' {
        \repeat volta 2 {
        c1
        }
        \repeat volta 2 {
        d
        e
        }
        \alternative {
                { f }
                {fis }
        }
        g
}

voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } }

\new Staff \with { instrumentName = \markup \center-column { "manual" "repeatCommands " } }
\relative c'' {
        a
        \set Score.repeatCommands = #'(end-repeat)
        b
        \set Score.repeatCommands = #'(start-repeat)
        c
        \set Score.repeatCommands = #'((volta "2, 5") end-repeat)
        b
        \set Score.repeatCommands = #'((volta #f))
        a
        c1
        \set Score.repeatCommands = #(list(list 'volta voltaAdLib) 'start-repeat)
        c4 b d e
        \set Score.repeatCommands = #'((volta #f) (volta "4.") end-repeat)
        f1
        \set Score.repeatCommands = #'((volta #f))
        g
}

Die Ursache liegt wohl in volta-bracket.cc
In Zeile 142 ff sind die glyphen aufgeführt, bei denen die erste volta-bracket geschlossen wird. (Denke ich zumindest. Mit C++ kenne ich mich nicht aus)
"S"-glyphen kommen dort nicht vor.

Lösungsmöglichkeiten:
(1) Einen Patch vorbereiten, der die "S"-Balines in volta-bracket.cc einfügt.
(2) Die entsprechende Definition nach scheme portieren.
(3) Einen BarLine-stencil-override kreieren, der das Segno-Zeichen via ly:stencil-add (o.ä.) hinzufügt.

ad (1)
Das kann ich nicht selber machen, da ich git nicht auf dem Rechner habe.
ad (2)
Hier fehlen mir die Kenntnisse in C++ um beurteilen zu können, was genau zu tun ist.
ad (3)
Das sollte möglich sein. Ich schau mal, ob es klappt.


Grüße,
  Harm

[1] Wer den Code dort ausprobieren will tut das auf eigenes Risiko. Es handelt sich um experimentelle Arbeit. Schließlich gibt es einen Grund warum die devel-list existiert.

Arnold

  • Member
Re: new barlines - \bar "S" and \repeat volta
« Antwort #1 am: Donnerstag, 21. Juni 2012, 16:18 »
Hallo,

mein Gedanke war, mit einem Scheme-Kommando 'segno-display in die Score.RepeatCommands-Liste hinzuzufügen.
Klappt das, ohne wieder durch einen Engraver überschrieben zu werden?
Dann sollte es eingentlich recht einfach sein, in repeat-acknowledge-engraver.cc außer nach 'start-repeat und 'end-repeat auch nach 'segno-display zu suchen. Da diese Flags voneinander unabhängig sind, ergäben sich dann acht statt vier Möglichkeiten - und da eine Möglichkeit davon das »nichtstun« ist, blieben dann sieben Möglichkeiten mit einem Standardsymbol (welches eigentlich eine Liste von drei Symbolen repräsentiert - middle-of-line-symbol, begin-of-line-symbol, end-of-line-symbol) und siebenmal einer Variablen zum Benutzer-Override.
Wahrscheinlich in repeat-acknowledge-engraver.cc:
  bool end = false;
+ bool segno = false;
  bool volta_found = false;
...
      if (command == ly_symbol2scm ("start-repeat"))
        start = true;
      else if (command == ly_symbol2scm ("end-repeat"))
        end = true;
+     else if (command == ly_symbol2scm ("segno-display"))
+       segno = true;
      else if (scm_is_pair (command) && scm_car (command) == ly_symbol2scm ("volta"))
        volta_found = true;
      cs = scm_cdr (cs);
...
-  if (start && end)
-    s = robust_scm2string (get_property ("doubleRepeatType"), ":|:");
-  else if (start)
-    s = robust_scm2string (get_property ("startRepeatType"), "|:");
-  else if (end)
-    s =  robust_scm2string (get_property ("endRepeatType"), ":|");
+  if (segno)
+    if (start)
+      if (end) // { segno, start, end }
+        s = robust_scm2string (get_property ("doubleRepeatSegnoType"), ":|S|:");
+       else    // { segno, start }
+        s = robust_scm2string (get_property ("startRepeatSegnoType"), "S|:");
+     else
+      if (end) // { segno, end }
+        s =  robust_scm2string (get_property ("endRepeatSegnoType"), ":|S");
+       else    // { segno }
+        s =  robust_scm2string (get_property ("segnoType"), "S");
+   else
+    if (start)
+      if (end) // { start, end }
+        s = robust_scm2string (get_property ("doubleRepeatType"), ":|:");
+       else    // { start }
+        s = robust_scm2string (get_property ("startRepeatType"), "|:");
+     else
+      if (end) // { end }
+       s =  robust_scm2string (get_property ("endRepeatType"), ":|");
Der Name »segnoType« ist vielleicht nicht glücklich gewählt.

Den Rest schau ich mir mal in Ruhe an.  Deine Vermutung ist auf jeden Fall plausibel.
Brainstorming:
Sollte man diese Listen als Scheme-Liste benutzerdefinierbar machen (damit »trial-and-error-debugfähig«)?
Sollte der Engraver statt dessen nach 'startRepeat und 'endRepeat suchen?
Sollte der repeat-acknowledge-engraver ein Property an das Barline-Glyph setzen, welches dann in volta-bracket.cc ausgewertet wird? - würde nur mit \repeat kooperieren, nicht mit manuell gesetzten \bar ":|"!
Und irgendwann kommen dann die Wiederholungszeichen mit optischer Verstärkung 'darüber und darunter'.


Leider hätte auch ich sehr gerne eine C-Compiler-Möglichkeit für Lilypond, aber ich habe nur zwei (!) 'handelsübliche' Windows-C-Compiler auf meinem Rechner. Vielleicht werden einmal alle Engraver in eine DLL gepackt, und der Compiler für diese DLL wird dann im Entwickler-UBUNTU gleich mitgelierfert.

Bis demnächst.
« Letzte Änderung: Freitag, 22. Juni 2012, 10:49 von Arnold »

Arnold

  • Member
Re: new barlines - \bar "S" and \repeat volta
« Antwort #2 am: Freitag, 22. Juni 2012, 13:09 »
In volta-bracket.cc wird MAKE_SCHEME_CALLBACK (Volta_bracket_interface, print, 1);
SCM
Volta_bracket_interface::print (SCM smob)
definiert.
Darin wird modify_edge_height (me) aufgerufen.
In der definition von void
 Volta_bracket_interface::modify_edge_height (Spanner *me)
wird nun offenbar erst einmal kontrolliert, ob wegen Zeilenubrüchen überhaupt die senkrechte Anfangs- oder Endlinie zu zeichnen ist.
Wenn nicht zu zeichnen, werden die booleans »no_vertical_start« bzw. »no_veritcal_end« auf TRUE gesetzt.
Es wird der Taktstrich am Ende gesucht, und davon das Attribut "glyph-name".
Wurde hierbei eine Zeichenkette gefunden, wird diese in der C-Variablen »str« gespeichert, ansonsten wird "|" in »str« gespeichert.
Jetzt wird im von euch verdächtigten Schritt
  no_vertical_end
  |= (str != ":|"
      && str != "|:"
      && str != "|."
      && str != ":|:"
      && str != ":|.|:"
      && str != ":|.:"
      && str != ".|");
überprüft, ob »str« in der Quasi-Liste { ":|", "|:", "|.", ":|:", ":|.|:", ".|" } enthalten ist, und wenn nicht wird no_vertical_end ebenfalls auf TRUE gesetzt.
Danach wird, wenn mindestens »no_vertical_end« oder »no_vertical_start« auf TRUE steht, das Attribub »edge-height« modifiziert (oder neu angelegt), worin der entspechende Wert auf 0.0 gesetzt wird.
Nun nehme ich an, daß diese Quasi-Liste nicht mehr im C-Programmtext, sondern als Scheme-Liste definiert werden soll.
voltaBracketEndlineAllowBartypes = #(list ":|" "|:" "|." ":|:" ":|.|:" ".|" ":|S" ":|S|:")
Nur falls diese nicht existiert, soll der alte C-Code herangezogen werden.
Mit
  SCM end_allow_list = get_property ("voltaBracketEndlineAllowBartypes");wird hoffentlich die global definierte Variable gesucht, dann ergibt sich:
  SCM vertical_end_allow_list = get_property ("voltaBracketEndlineAllowBartypes");
  if (ly_cheep_is_list(vertical_end_allow_list))
    { // new checks here ...
    } else { // old checks here
    }
Dann würde ich die Vergleichssuche in etwas so gestalten:
  bool match_not_found = true;
  while (scm_is_pair (vertical_end_allow_list) && match_not_found)
    {
      if (str == robust_scm2string (scm_car (vertical_end_allow_list), "*invalid*"))
        match_not_found = false;
      vertical_end_allow_list = scm_cdr (vertical_end_allow_list);
    }
  no_vertical_end != match_not_found;

Wie schön wäre es, wenn ich das ganze kompilieren und testen könnte. Vielleicht wird's ja noch.
Zusammengesetzt hiese das, die alte feste Liste im C-Code wäre zu ersetzten durch:
  SCM vertical_end_allow_list = get_property ("voltaBracketEndlineAllowBartypes");
  if (ly_cheep_is_list(vertical_end_allow_list))
    { // new checks based on Property 'voltaBracketEndlineAllowBartypes' here:
      bool match_not_found = true;
      while (scm_is_pair (vertical_end_allow_list) && match_not_found)
        {
          if (str == robust_scm2string (scm_car (vertical_end_allow_list), "*invalid*"))
            match_not_found = false;
          vertical_end_allow_list = scm_cdr (vertical_end_allow_list);
        }
      no_vertical_end != match_not_found;
    } else // TODO: remove this fallback once voltaBracketEndlineAllowBartypes is generally defined
      no_vertical_end
      |= (str != ":|"
          && str != "|:"
          && str != "|."
          && str != ":|:"
          && str != ":|.|:"
          && str != ":|.:"
          && str != ".|");
... und hoffentlich ohne Tippfehler


Arnold

P.S. Sind da auch noch die X-Positionen angängig vom Taktstrich-Typ zu variieren?
« Letzte Änderung: Freitag, 22. Juni 2012, 13:20 von Arnold »

harm6

  • Member
Re: new barlines - \bar "S" and \repeat volta
« Antwort #3 am: Montag, 25. Juni 2012, 16:33 »
Hallo Arnold,

Zitat
Wie schön wäre es, wenn ich das ganze kompilieren und testen könnte.

Ich habe am Wochenende LilyDev nach der Anleitung auf http://lilypond.org/doc/v2.15/Documentation/contributor/lilydev installiert.

Ich muß damit noch vertrauter werden, bevor ich Deine obigen Vorschläge zu testen wage.

Aber wäre das nicht auch etwas für Dich?
Oder gleich: http://lilypond.org/doc/v2.15/Documentation/contributor/working-with-source-code
(Da habe ich mich allerdings noch nicht rangetraut.)

Gruß,
  Harm

Arnold

  • Member
Re: new barlines - \bar "S" and \repeat volta
« Antwort #4 am: Dienstag, 26. Juni 2012, 12:02 »
Ja Harm,

diese VM werde ich in absehbarer Zeit sicherlich auch bei mir installieren. Allerdings ohne GIT-Direktverbindung, nur als isolierte VM, allenfalls noch Datenaustausch mit dem Hostrechner (denn der hängt auch nicht am Netz). Also die Methode Tarball aufspielen und kompilieren, Verzeichnisbaum kopieren, Versuche machen, Differenzen zwischen den beiden Verzeichnisbäumen suchen und auflisten.

Arnold

SteuLoh

  • Member
Re: new barlines - \bar "S" and \repeat volta
« Antwort #5 am: Donnerstag, 31. Juli 2014, 08:42 »
Hallo,

hat sich hier schon was getan?

Ich benötige ein Wiederholungszeichen nach dem Segno,

wer weiß Rat?


Arnold

  • Member
Re: new barlines - \bar "S" and \repeat volta
« Antwort #6 am: Donnerstag, 31. Juli 2014, 09:45 »
Hallo,

das Zauberwort nennt sich \inStaffSegno. (Siehe Dokumentation, z. Bsp. »notation.pdf«, soweit ich mit entsinne seit der Produktivversion 2.16.0 implementiert).
Außer startRpeatType, endRepeatType und doubleRepeatType gibt es da auch noch segnoType, startRepeatSegnoType, endRepeatSegnoType und doubleRepeatSegnoType.
Vorbelegt sind diese mit "hier-beginnen-Segno" und "keine doppelten Taktlinien wenn Wiederholungsbeginn auf Zeilenumbruch fällt".

Ich selbst bevorzuge die Schreibvariante, daß ein doppelter Taktstich am Zeilenende erscheint wenn in der Folgezeile dann die Wiederholung beginnt. Dazu noch folgendes Schnipsel:
\defineBarLine "S.|:-||" #'("||" "S.|:" " .|")
\allowVoltaHook "||"
\allowVoltaHook ".|:"
\allowVoltaHook ".|:-||"
\allowVoltaHook "S.|:"
\allowVoltaHook "S.|:-||"

\layout {
  \context { \Score
    startRepeatType = ".|:-||"
    startRepeatSegnoType = "S.|:-||"
  }
}

Arnold

SteuLoh

  • Member
Re: new barlines - \bar "S" and \repeat volta
« Antwort #7 am: Donnerstag, 31. Juli 2014, 10:56 »
Das ist es,
vielen Dank