Autor Thema: center NoteColumn  (Gelesen 2831 mal)

harm6

  • Member
center NoteColumn
« am: Dienstag, 29. November 2011, 23:33 »
Hallo zusammen,

ich hab' mir ein paar Gedanken gemacht wie man eine NoteColumn im Takt zentrieren kann. (Es handelt sich eigentlich um die Fortführung des Threads Noten unter Ganztaktpause zentrieren, aber ich dachte ich fange einen neuen an mit einem, so hoffe ich, leichter wiederfindbaren Titel)

Es werden drei Befehle definiert:
centerNoteColumnOn
centerNoteColumnOff
onceCenterNoteColumn


Diese Befehle sollten hinreichen um alle Möglichkeiten abzudecken.

Ich habe mich bemüht die Funktion möglichst allgemeingültig zu machen:
stemUp, stemDown, Vorzeichen oder nicht, Arpeggio oder nicht, Notenköpfe zu beiden Seiten des Halses oder nicht (BTW wie nennt man das eigentlich?), Punktierung oder nicht, Noten oder Pausen, Takt-, Tonart, Schlüsselwechsel, Zeilenumbruch - all das soll die Funktion verarbeiten können und tut sie auch, von ein paar Problemen noch abgesehen (s.u.). Wer Beispiele findet, bei denen es nicht oder schlecht funktioniert: Bitte posten!
(Wer es genauer wissen möchte kann die Zeilen 145 – 151 einkommentieren. Die Einfärbung der Grobs zwischen denen zentriert wird ist aber nur dann sinnvoll, wenn \onceCenterNoteColumn benutzt wird, denn sonst überschreibt der eine Funktionsaufruf die Farbe des anderen.)

Probleme:
  • Wenn man zu viele Engraver abstellt, gibt’s für die Befehle keine Grobs mehr zwischen denen zentriert werden könnte. Dann geht’s krachen.
  • Ich habe nicht herausfinden können, wie ich ein Arpeggio innerhalb der Funktion ansprechen soll, welches mit \set Score.connectArpeggios = ##t erzeugt wurde. Falls ein solches vorkommt, muß man es zusätzlich manuell verschieben.
  • Beim Wechsel zu a-moll/C-Dur werden natürlich nur die Vorzeichen der vorangegangenen Tonart aufgelöst und keine neuen gesetzt. Die Funktion sollte dann das Grob KeyCancellation ansprechen. Das geschieht aber nicht. Stattdessen erscheint als log-Meldung: Programmierfehler: Infinity or NaN encountered
    Ich habe keine Ahnung warum.
    Wer es überprüfen möchte:
    In Zeile 331/332 \voice auskommentieren und stattdessen \testVoice reinnehmen (dann hat man meine Teststimme). Und dann in dieser Stimme (Zeile 261/262) a\minor wählen.

Wie kann man diese Fehlermeldung erklären und die Funktion so verbessern, daß sie auch diesen Fall abdeckt?

Getestet habe ich mit "2.14.2" und "2.15.20" (in "2.12.3" wird es ohne Umbau nicht funktionieren)-

Gruß,
  Harm

harm6

  • Member
Re: center NoteColumn
« Antwort #1 am: Freitag, 9. Dezember 2011, 00:03 »
Halo,

Zitat
Beim Wechsel zu a-moll/C-Dur werden natürlich nur die Vorzeichen der vorangegangenen Tonart aufgelöst und keine neuen gesetzt. Die Funktion sollte dann das Grob KeyCancellation ansprechen. Das geschieht aber nicht. Stattdessen erscheint als log-Meldung: Programmierfehler: Infinity or NaN encountered

Wie kann man diese Fehlermeldung erklären und die Funktion so verbessern, daß sie auch diesen Fall abdeckt?

Beim Tonartwechsel zu einer Tonart ohne Vorzeichen wird doch eine KeySignature gesetzt! Da allerdings keine Vorzeichen drin sind hat sie die Länge null. Dieses Verhalten hat das Problem verursacht. Mit Hilfe von David Nalesnik war die Lösung eine solche KeySignature eben auszuschließen.

Allerdings  sind neue Probleme aufgetaucht:
Zum einen gibt es Fälle in denen meine Funktion absolut richtig d.h. zentriert berechnet, die MultiMeasureRest aber von LilyPond nicht absolut zentriert gesetzt wird. Um hier eingreifen zu können habe ich \onceCenterNoteColumn als Funktion gesetzt, mir einer Variablen, die ein manuelles Verschieben möglich macht.

Zum anderen gibt es ein Problem mit "2.15.20":
Es scheint so, daß ein mögliches arpeggio nun zur NoteColumn gehört, obwohl die IR nur von Stem und NoteHead spricht. Ob es sich hierbei um einen Bug handelt oder dieses Verhalten beabsichtigt ist weiß ich noch nicht, habe dazu aber eine Frage gestellt.

Insofern ist der angehängte Code im Moment das Beste, was mir einfällt. Er wird in "2.14.2" funktionieren. In "2.15.20" allerdings nur dort, wo es kein arpeggio gibt. Sollte das Verhalten in "2.15.20" beabsichtigt sein, muß man eine Reihe von Bedingungen ändern, um volle Funktionalität zu gewährleisten. Der neuen Funktionalität von #{ ... #} wegen, muß man in der onceCenterNoteColumn-Funktion das $-Zeichen entfernen, sonst klappt es nicht mit "2.15.20"

Gruß,
  Harm