Autor Thema: Phrasierungsbögen an Text ausrichten / Custom TextSpannerEngraver  (Gelesen 4526 mal)

xr

  • Gast
Re: Phrasierungsbögen an Text ausrichten / Custom TextSpannerEngraver
« Antwort #30 am: Samstag, 4. März 2017, 08:06 »
Zitat
Zitat
Zitat von: xr

    Ich dachte, ich hätte mal eine Property gesehen, die mir anzeigt, in welcher Systemzeile ich mich befinde. Aber ich kann die nicht mehr finden.
    Gibts die oder habe ich das falsch in Erinnerung?

Kannst Du den Zusammenhang erläutern, d.h. wo brauchst Du das? In einer Funktion?

Um bei der Bestimmung der Nachbarn einer PaperColumn herauszufinden, ob der gefundene Nachbar noch in derselben Zeile sitzt oder doch eine Zeile davor/danach.

Mit folgender Funktion zähle ich alle PaperColumns, trage sie in eine hash map ein und annotiere sie:

#(define counterPC 0)
% hash table, holding PaperColumns
% key is the counter
#(define ht-pap-cols (make-hash-table))

% mit \consists \set_annotations_to_paper_columns_engraver
% in einen Staff Context eintragen
set_annotations_to_paper_columns_engraver =
#(make-engraver

    (acknowledgers
         ;; get all PaperColums, count them
         ;; set annotation of PCs to counter
         ((paper-column-interface engraver grob source-engraver)
             (let* (
                 (mom (ly:moment-main (t->m engraver)))
                 
                 (pap-col (if (equal? (grob-name grob) 'PaperColumn)
                     grob
                     #f))
                 (annotation (number->string counterPC))
                 )
                 
                 (if pap-col
                     (begin
                     (ly:grob-set-property! grob 'annotation annotation)
                     (hashv-set! ht-pap-cols counterPC (list grob mom))
                     (set! counterPC (1+ counterPC ))
                     )
                 )
             )
         )
     )
)

Danach kann in einer Funktion, die die Slurs durchläuft, von jedem Slur die PaperColumn gefunden werden, über deren annotation ihre Nummer ausgelesen werden, und über die hash map kann man dann den Nachbarn bestimmen.
Der könnte aber auch eine Zeile drüber/drunter sitzen.

EDIT: Parent eines Slurs kann allerdings auch eine NonMusicalPaperColumn sein, wenn er am Rand sitzt. Das macht die Sache etwas komplizierter. Aber das Prinzip bleibt wahrscheinlich gleich.
« Letzte Änderung: Samstag, 4. März 2017, 08:43 von xr »

xr

  • Gast
Re: Phrasierungsbögen an Text ausrichten / Custom TextSpannerEngraver
« Antwort #31 am: Freitag, 17. März 2017, 11:48 »
Die Lösung, die ich gefunden habe, hätte ich gern allgemeiner formuliert, aber dann hätte ich wohl bis Ostern daran gesessen. Nun ist sie erstmal speziell auf meine eigenen Bedürfnisse abgestimmt.

Ich weiß nicht, ob ich den gesamten Code hier einstellen soll. Ist doch ziemlich umfangreich geworden. Hier kann er eingesehen und runtergeladen werden:
https://github.com/XRoemer/Lilypond/tree/master/Custom_Slurs
Download als zip:
https://github.com/XRoemer/Lilypond

Ich habe den Code in mehrere Dateien unterteilt, damit man klarer sieht, wo sich welche Methoden befinden und (hoffentlich) eine schnellere Übersicht bekommt.

Gestartet wird das Beispiel von custom_slurs_example.ly.
Und der Einstiegspunkt für alle Methoden, die dort aufgerufen werden, ist in shape_slurs.ly . Von da aus verzweigen sich die weiteren Methoden.

Insgesamt ist es leider eine mehrschrittige und auch nicht besonders übersichtliche Programmierung geworden. Die Lilypond Datei wird 2 x gerendert.
Beim ersten Mal werden die Abstände ausgelesen und in einem Hash Table gespeichert.
Beim zweiten Durchlauf werden erst mittels Engraver Slurs, Noten und PaperColumns ausgelesen, annotiert und im Hash Table ht-columns gespeichert.
Dann werden die Phrasierungsbögen bearbeitet. Gleichzeitig läuft ein Zähler für die Zeilen mit.

Was mich noch ernsthaft stört, ist der verzweigte Code in der Startdatei. Ich hätte gern einen Befehl wie \use-custom-slurs an einer einzigen Stelle in custom_slurs_example.ly
Momentan muss ich aber an mehreren Stellen was einsetzen. Bis zum Sommer, wenn ich es wirklich brauchen werde, habe ich es bestimmt wieder vergessen.


Im Anhang sind zwei Bilder: Einmal mit unbearbeiteten Bögen, einmal mit bearbeiteten.
In Frescobaldi darf man übrigens nicht vergessen, die Pdf Ansicht umzuschalten. Es wird ja 2x gerendert, automatisch zeigt aber Frescobaldi die erste unbearbeitete Version.

Gruß,
Xaver


P.S. Die Bögen gewinnen wohl noch keinen Schönheitswettbewerb. Ihre Endpunkte sitzen jetzt zwar an den richtigen Stellen, aber die Handles könnten besser eingestellt werden. Naja, Ostern ...
« Letzte Änderung: Freitag, 17. März 2017, 15:10 von xr »

xr

  • Gast
Re: Phrasierungsbögen an Text ausrichten / Custom TextSpannerEngraver
« Antwort #32 am: Freitag, 17. März 2017, 15:15 »
Die Reduktion der zusätzlichen Einträge für die Custom Slurs geht teils auch.

Wo ich aber noch nicht weiter komme, ist bei der Umwandlung folgenden Codes in eine Scheme Funktion.

compile-book =
    \book {
      \my-score
    }

#(define start-second-pass #f)
\compile-book
#(set! start-second-pass #t)
#(set! annot-zaehler 0)
#(define output-suffix "second")
\compile-book

Ich würde diesen Code gerne so umwandeln, dass ich \compile-book mit einem Argument aufrufen kann. Aber ganz gleich wie ich \book \my-score auch klammere oder welche Funktion ich auch nehme, ich bekomme immer Fehlermeldungen. Weiß jemand, wie ich das anstellen muß?

Gruß,
Xaver