Autor Thema: Fortschrittanzeige, welcher Score-Block wird gerade interpretiert  (Gelesen 1270 mal)

Arnold

  • Member
Hallo,

In einer längeren Partitur (quasi zu einem Sammelband Tanzmusik für kleine Orchesterbesetzung mit 24 Stücken aus der Zeit von 1895 bis 1920 - immer noch nicht vollständig abgeschrieben und trotzdem schon 200 Seiten DIN A4 lang bei set-global-staff-size 13.0) möchte ich während der Übersetzung anzeigen, welcher der Sätze nun gerade von den Engravern bearbeitet wird.
Einen einfachen Zähler kann ich als Engraver (der nichts zu gravieren hat) global definieren.
Eine Zeichenkette dazu kann ich dann übergeben, wenn ich diese \consists Definition jeweils »lokal« im \layout-Block des \score-Abschnitts mit angebe.
\version 2.18.0
#(define-public ScoreZaehler 0)

#(define (count-score-engraving ctx)
   (if (defined? 'ScoreZaehler)
    (set! ScoreZaehler (1+ ScoreZaehler)))
   (ly:message (format #f
     "~s. Score-Block ..." ScoreZaehler))
   `((finalize . ,(lambda (trans)
       (ly:message (format #f
         "~s. Score-Block wurde interpretiert."
         ScoreZaehler))))))


#(define ((tell-name-engraver title) ctx)
   (ly:message (format #f "Score-Block »~a« ..." title))
   `((finalize . ,(lambda (trans)
       (if (defined? 'ScoreZaehler)
        (set! ScoreZaehler (1+ ScoreZaehler)))
       (ly:message (format #f
         "~s. Score-Block »~a« wurde interpretiert."
         ScoreZaehler title))))))


\layout {
 \context {
   \Score
   \consists #count-score-engraving
 }
}

%%% TEST %%%

\score {
  \new Staff {
    c'1  % Even this without success: _\markup \fromproperty #'header:piece
  }
  \layout {
    \context { \Score
      % den ohne Namen wieder rausschmeißen
      \remove #count-score-engraving
      % und stattt dessen den mit Namen verwenden
      \consists #(tell-name-engraver "Die Nummer Eins")
    }
  }
  \header {
    piece = "Nr. 1"
  }
}

\score {
  \new Staff {
    c'1
  }
  \header {
    piece = "Nr. 2"
  }
}

\score {
  \new Staff {
    c'1
  }
  \header {
    piece = \markup \bold "Nr. 3"
  }
}

Eigentlich möchte ich aber einen Paramter aus dem \score-\header-Block lesen und anzeigen.
Hat da noch jemand einen Tipp, wie ich da vom Scheme-Engraver aus rankomme?


Arnold

martinmagtenor

  • Member
Re: Fortschrittanzeige, welcher Score-Block wird gerade interpretiert
« Antwort #1 am: Samstag, 14. Juni 2014, 22:40 »
Hallo Arnold,

ich fürchte, dass das, was Du beschreibst, eng mit diesem Problem verwandt ist. Ich beschäftige mich schon länger mehr oder weniger intensiv damit.

Dort geht es darum, in den Kopf- oder Fußzeilen der Seiten auf Teile des Score-Headers (vor allem header:piece) zugreifen zu können. Nach meinem bisherigen Verständnis entzieht sich die Lösung dem durch Scheme zugänglichen Teil von Lilypond. Demnach ist der Lilypond-Kern die treibende Kraft und ruft den Scheme-Teil regelmäßig auf. Im Log ist ja deutlich zu erkennen, dass der Übersetzungsvorgang im Wesentlichen aus zwei Phasen besteht: im ersten Schritt die Analyse, da wird die Lilypond-Syntax auf die .ly-Datei(en) angewendet und die musikalischen Ausdrücke gebildet und danach die Auswertung. Beide Phasen steuert der Lilypond-Kern.

Leider bin ich hinsichtlich der Erforschung des Zusammenspiels zwischen dem in C++ geschriebenen Kern von Lilypond und dem Scheme-Mantel noch nicht substantiell weiter gekommen.

Nach meinem Verständnis funktioniert die Idee mit dem _\markup und \fromproperty deswegen nicht, weil dieser Befehl für die Evaluierung "außen" bestimmt ist. Er wird also außerhalb der Scores, beim Aufbau der Seiten ausgewertet. Dort gibt es kein Score-Header-Objekt.

Was den Zugriff auf die Score-Header-Elemente betrifft, ist dieser LSR-Beitrag eine Betrachtung wert.

Falls noch "späte Evaluierung" ins Spiel kommen sollte, ist dieser  Forum-Beitrag eine Beachtung wert.

Leider ist das kein Tipp, aber vielleicht ein Denkanstoß. Ich bin auch an jedem Fortschritt interessiert, der einen Weg aufzeigt an die Score-Header-Informationen heranzukommen.

Grüße
  Martin

Arnold

  • Member
Re: Fortschrittanzeige, welcher Score-Block wird gerade interpretiert
« Antwort #2 am: Montag, 16. Juni 2014, 10:00 »
Hallo martinmagtenor,
danke für die Informationen.

Man bräuchte halt den Score-Header-Block als »Scheme association list« gespeichert und als ein Context property im Score-Context verlinkt.
Vielleicht finde ich da eine Möglichkeit, wenn ich mir den Quelltext genauer ansehe. Nur leider kann ich das dann allenfalls in der Ubuntu-VM testen und nicht auf der von mir üblicherweise genutzten Windows-Architektur, da ich (noch?) keine Kompiliermöglichkeit für habe.

Arnold