Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: thomas am Freitag, 17. März 2023, 14:20

Titel: Welcher Takt ist auf welcher Seite (gelöst)
Beitrag von: thomas am Freitag, 17. März 2023, 14:20
Hallo,

gibt es eine Möglichkeit automatisiert herauszufinden welcher Takt auf welcher Seite ist?

Bei diesem Beispiel sind die Takte 1-181 auf Seite 1, 182-363 auf Seite 2, usw.
\version "2.22.1"

{
  \repeat unfold 1000 { c'1 }
}

Wenn sich jetzt etwas ändert verschieben sich die Takte. Hier sind die Takte 1-174 auf Seite 1, 175-356 auf Seite 2, usw.
\version "2.22.1"

{
  \repeat unfold 32 {c'32}
  \repeat unfold 999 { c'1 }
}

Kann man die Takte mit der zugehörigen Seite, oder die jeweils ersten Takte auf der Seite, oder ... in ein log-File schreiben, dass man dann mit grep, sed, awk, ... rausfiltern kann?

Gruß Thomas
Titel: Antw:Welcher Takt ist auf welcher Seite
Beitrag von: Arnold am Freitag, 17. März 2023, 18:33
Hallo Thomas,

wenn man sich eine spezielle Taktzahlen-Formattier-Funktion baut, welche eine »im Postscript-Zwischencode gut zu findene Spur hinterläßt«, und die Taktzahlen an allen Taktstrichen anzeigen läßt, dann kann man das in der Postscript-Datei mit »grep -a« ausfindig machen - quasi jede herausgefilterte Zeile entweder die Kommentar-Markierung des Seitenanfangs, oder die (eigen erzeugte) Kommentar-Markierung der zu druckenden Taktzahl. Die Taktzahlen selbst werden dann voraussichtlich nicht in aufsteigender Reihenfolge gelistet.

Und die Postscriptdatei kann man auch im Nachgang mittels »gs« zum PDF konvertierten (wahlweise sogar in zwei PDFs, eines mit und eines ohne »point-and-click«), falls man nicht gleich LILYPOND mit der Erstellung beider Ausgabenformate (PDF und PS) beauftragt.

Ein Beispiel (unter Linux) könnte ich zusammenbauen.


Aber, ob das mit deinem Anwendungsszenario zusammenpaßt, kann ich jetzt nicht beurteilen.

Arnold
Titel: Antw:Welcher Takt ist auf welcher Seite
Beitrag von: Arnold am Freitag, 17. März 2023, 21:06
Das Beispiel ist schon fertig!

\version "2.22.0"
% auch version "2.25.1"

% tested on a Raspberry PI with:
%CMDLINEOPTS= --ps --pdf
%POSTPROCESS: grep -a '^%[B%][aP][ra][Ng][oe]: ' ${BASENAME}.ps

#(set-default-paper-size "a5")

#(define (barnumber-format-with-ps-infoline barnum measure-pos alt-number context)
  (let ((text (robust-bar-number-function barnum measure-pos alt-number context)))
   (make-combine-markup
    (make-simple-markup text)
    (make-postscript-markup (string-append "\n%BarNo: " text "\n")))))

\score {
  \new Staff {
    \override Score.BarNumber.break-visibility = #end-of-line-invisible
    \set Score.barNumberFormatter = #barnumber-format-with-ps-infoline
    \repeat unfold 1000 c''4
    \bar "|."
  }
}

Da die Strukturkommentar-Zeilenanfänge »%%Page:« und »%BarNo:« gleich lang sind, konnte ein gemeinsamer grep-Filter definiert werden, und erfreulicherweise gibt es keinen anderen Standardkommentar, der von dieser Filtermaske auch gefunden worden wäre.

Arnold
Titel: Antw:Welcher Takt ist auf welcher Seite
Beitrag von: harm6 am Samstag, 18. März 2023, 13:10
Hallo Thomas,

die angefragten Zahlen sind natürlich erst erhältlich, nachdem das ganze layout fest gekloppt ist.
Aber es gibt ja `page-post-process' in \paper den man dafür nutzen kann:

\version "2.19.32"

#(define* (get-pages-line-measures layout pages #:optional print-to-file)
  "If @var{print-to-file} is set #t the output is written to a file named like
current one, with attached `-pages-lines-measures.log', otherwise the output is
usually displayed in Terminal"
  (let* ((first-page-number (ly:prob-property (car pages) 'page-number))
         (port #t)
         (lines (map (lambda (page) (ly:prob-property page 'lines)) pages))
         ;; List of systems of each pages
         (page-systems
           (map
             (lambda (line)
               (append-map
                 (lambda (l) (list (ly:prob-property l 'system-grob #f)))
                 line))
             lines))
         ;; Get (NonMusical)PaperColumns per line and page
         (columns-locations
           (map
             (lambda (page-system)
               (map
                 (lambda (systems)
                   (and
                     systems
                     ;; Last column has the same rhythmic location as the first
                     ;; of the new line, we simply drop it.
                     (drop-right
                       (map
                         grob::rhythmic-location
                         ;; TODO safe to assume always a grob-array?
                         (ly:grob-array->list
                           (ly:grob-object systems 'columns)))
                       1)))
                 page-system))
             page-systems))
         ;; Get first/last rhythmic location of each relevant
         ;; (NonMusical)PaperColumn, keep only bar number, drop the moment.
         (line-measures
           (map
             (lambda (col-locs)
               (map
                 (lambda (x)
                   (if (pair? x)
                       (list (caar x) (car (last x)))
                       x))
                 col-locs))
             columns-locations)))

    ;; Write to a log-file if `print-to-file' is true
    (if print-to-file
        (let* ((output-name (ly:parser-output-name))
               (outfilename
                 (format #f "~a-pages-lines-measures.log" output-name)))
          (set! port (open-output-file outfilename))))
    (for-each
      (lambda (i measures)
        (format port "\nOn page ~a:\n" (+ i first-page-number))
          (if (any number-list? measures)
              (for-each
                (lambda (x)
                  (format port "~3tLine from ~a to ~a\n" (car x) (last x)))
                (filter number-list? measures))
              (format port "~3tno measures\n")))
       (iota (length pages) 0 1)
       line-measures)

    (if (output-port? port)
        (close-output-port port))))

\paper {
  %% first-page-number is taken into account
  %first-page-number = 3
  #(define (page-post-process layout pages)
    (get-pages-line-measures layout pages #f))
}

%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%%%%

{
  %\repeat unfold 1000 { c'1 }

  \repeat unfold 32 {c'32}
  \repeat unfold 999 { c'1 }
}

%% Advanced examples:
%{
\header { title = "TITLE" }

\pageBreak

\score {
    \new Staff {
        \repeat unfold 2 {
          \time 4/4 c''1
          \time 3/4 d''2.
          \time 3/8 e''8 8 8
        }
    }
}

\pageBreak

\markup "MARKUP"

\pageBreak

\score {
  \new Staff {
    \repeat unfold 2 {
      \time 4/4 c''1
      \time 3/4 d''2.
      \pageBreak
      \time 3/8 e''8 8 8
    }
  }
}

\score {
  \new Staff {
    \repeat unfold 2 {
      \time 4/4 c''1
      \time 3/4 d''2.
      \time 3/8 e''8 8 8
    }
  }
}
%}

Der Code ist auch angehängt.
Wenn Du in
    (get-pages-line-measures layout pages #f)
#f zu #t änderst bekommst Du `print-bar-numbers-on-page-01-pages-lines-measures.log'

HTH,
  Harm

EDIT: Kleine Code-Korrektur
EDIT: c/p Fehler eliminiert
print-bar-numbers-on-page-01.ly
Titel: Antw:Welcher Takt ist auf welcher Seite
Beitrag von: thomas am Montag, 20. März 2023, 16:48
Tut beides wie gewünscht.

Danke.
Titel: Antw:Welcher Takt ist auf welcher Seite (gelöst)
Beitrag von: Manuela am Dienstag, 21. März 2023, 10:47
Das ist echt spannend.

Zum Testen: mit #(set-default-paper-size "a7") kriegt man viel mehr Seiten  ;)