Welcher Takt ist auf welcher Seite (gelöst)

Begonnen von thomas, Freitag, 17. März 2023, 14:20

« vorheriges - nächstes »

thomas

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

Arnold

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

Arnold

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

harm6

#3
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
Du darfst diesen Dateianhang nicht ansehen.

thomas


Manuela

Das ist echt spannend.

Zum Testen: mit #(set-default-paper-size "a7") kriegt man viel mehr Seiten  ;)
Danke für eure Hilfe
viele Grüße
-- Manuela