Autor Thema: \score-Block mittels Scheme ausgeben  (Gelesen 1511 mal)

iugin

  • Member
\score-Block mittels Scheme ausgeben
« am: Sonntag, 23. November 2014, 16:12 »
Hallo miteinander

gibt es eine Möglichkeit, ein \score-Block mit Scheme auszugeben?
Etwa so (funktioniert aber nicht):
\version "2.18.2"
out = #(define-music-function (parser location fileName)
        (string?)
        #{
          \score {
            \new Staff { \include $fileName }
          }
        #}
        )

\out #"file.ly"
Ich habe nämlich eine grosse Partitur, die ungefähr so aussieht:
\version "2.18.2"

\score { \new Staff { \include "01.ly" }}
\score { \new Staff { \include "02.ly" }}
\score { \new Staff { \include "03.ly" }}
\score { \new Staff { \include "04.ly" }} %% etc....
und habe mich gefragt, ob ich mit Scheme und eine Schleife alles automatisieren kann.

Liebe Grüsse und danke

Eugenio

fugenkomponist

  • Member
Re: \score-Block mittels Scheme ausgeben
« Antwort #1 am: Sonntag, 23. November 2014, 23:54 »
Ohne es getestet zu haben: Probier mal \new Score statt \score, manchmal gibts da kleine Unterschiede ;)

harm6

  • Member
Re: \score-Block mittels Scheme ausgeben
« Antwort #2 am: Mittwoch, 26. November 2014, 16:52 »
Hallo Eugenio,

hier ein Ansatz, ist aber noch nicht das gelbe vom Ei ...

\version "2.18.2"

%% See the following links:
%% http://lists.gnu.org/archive/html/lilypond-user/2012-02/msg00766.html
%% continued:
%% http://lists.gnu.org/archive/html/lilypond-user/2012-03/msg00010.html
%%
%% lalily in openlilylib by Jens-Peter Vogt
%% https://github.com/openlilylib/openlilylib/tree/19db8f4851b04cdaceafd8851b17e6a21e0191f0/templates/lalily

%% paper- and layout-settings for testing only
\paper { indent = 0 }
\layout { \override Staff.BarLine.color = #red }

#(define-public (set-book-headers! book header)
   (let ((bookhead (ly:book-header book)))
     (if (or (not bookhead)(list? bookhead))
         (begin
          (set! bookhead (make-module))
          (ly:book-set-header! book bookhead)
          ))
     ;; 'get-music-folder-options' isn't defined here
     ;; look in lalily for more info, link above
     ;;
     ;;(if (not (list? header))
     ;;    (set! header
     ;;          (assoc-get 'header
     ;;                     (get-music-folder-options
     ;;                       (if (ly:input-location? header)
     ;;                           header
     ;;                           #f))
     ;;                      '())))
     (for-each (lambda (p)
                 (if (pair? p)
                     (let ((key (car p))
                           (val (cdr p)))
                       (module-define! bookhead key val)))) header)
     ))
     
#(define-public (set-score-headers! score header)
   (let ((scorehead (ly:score-header score)))
     (if (or (not scorehead)(list? scorehead))
         (let ((mod (make-module)))
           (set! scorehead mod)
           (ly:score-set-header! score scorehead)))
     ;; see comment in 'set-book-headers!'
     ;;
     ;;(if (not (list? header))
     ;;    (set! header (assoc-get 'header
     ;;                            (get-music-folder-options
     ;;                              (if (ly:input-location? header)
     ;;                                  header
     ;;                                  #f))
     ;;                             '())))
     (for-each (lambda (p)
                 (if (pair? p)
                     (let ((key (car p))
                           (val (cdr p)))
                       (module-define! scorehead key val)))) header)
     ))

out =
#(define-void-function (parser location file-name-list header) (list? list?)
   (let* ((scores
             (map
               (lambda (file-name)
                 #{ \score { \new Staff { \include $file-name } } #})
               file-name-list))
          (myname (ly:parser-output-name parser))
          (book-part (ly:make-book-part (reverse scores))))

       (set-book-headers! book-part header)
         
       (ly:book-process
          book-part
          $defaultpaper
          $defaultlayout
          myname)))
 
%% Drawback: No other input is accepted!!
%%           The book-header has to be built.
%% TODO: 'piece' from header will appear in every score.
%%       Go for 'set-score-headers!' ...
\out #'(
        "test-include-01.ly"
        "test-include-02.ly"
        "test-include-03.ly"
       )
     %% book-header-settings:
     #'(
        (title . "title")
        (subtitle . "subtitle")
        (composer . "composer")
        (piece . "piece")
       )

Gruß,
  Harm

iugin

  • Member
Re: \score-Block mittels Scheme ausgeben
« Antwort #3 am: Mittwoch, 26. November 2014, 21:36 »
Lieber fugenkomponist
lieber Harm

danke vielmals für eure Antworte. Ich habe die Antworte nicht mehr kontrolliert, deswegen meine späte Reaktion (sorry, fugenkomponist).
Harm, sobald ich eine Minute habe werde ich dein Code ausprobieren. Ich bin aber schon sicher, dass es funktioniert. Ich werde selbstverständlich auch versuchen, ihn zu verstehen :-)
Ich dachte aber nicht, dass es so kompliziert sein wird.

Ich wünsche euch und den ganzen Forum einen schönen Abend

Liebe Grüsse

Eugenio