From: Han-Wen Nienhuys Date: Tue, 2 Jan 2007 18:05:05 +0000 (+0100) Subject: Rewire lilypond-book output. X-Git-Tag: release/2.11.8-1~37 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=b213e71b6a003307d2112d014e4a14d6158a4964;p=lilypond.git Rewire lilypond-book output. For lilypond-book, toplevel elements (markup, score, music) are now collected in a single \book, which is then output system for system. This has several consequences - toplevel markups are now output without taking up a complete page - multiple scores in a .ly file all end up in the output - naming of output files has been changed. Multiple scores don't result in base-1-1, base-2-1, .. naming. - In LP-book output toplevel \layout{} and \paper {} settings influences appearance of preceding scores. --- diff --git a/lily/book-scheme.cc b/lily/book-scheme.cc index 750917187f..23d728edf2 100644 --- a/lily/book-scheme.cc +++ b/lily/book-scheme.cc @@ -64,3 +64,33 @@ LY_DEFINE (ly_parser_print_book, "ly:book-process", return SCM_UNSPECIFIED; } + +LY_DEFINE (ly_parser_print_book_to_systems, "ly:book-process-to-systems", + 4, 0, 0, (SCM book_smob, + SCM default_paper, + SCM default_layout, + SCM output), + "Print book. @var{output} is passed to the backend unchanged. " + "Eg. it may be " + "a string (for file based outputs) or a socket (for network based " + "output).") +{ + Book *book = unsmob_book (book_smob); + + SCM_ASSERT_TYPE (book, book_smob, SCM_ARG1, __FUNCTION__, "Book"); + SCM_ASSERT_TYPE (unsmob_output_def (default_paper), + default_layout, SCM_ARG2, __FUNCTION__, "\\paper block"); + SCM_ASSERT_TYPE (unsmob_output_def (default_layout), + default_layout, SCM_ARG3, __FUNCTION__, "\\layout block"); + + Paper_book *pb = book->process (unsmob_output_def (default_paper), + unsmob_output_def (default_layout)); + if (pb) + { + pb->classic_output (output); + pb->unprotect (); + } + + return SCM_UNSPECIFIED; +} + diff --git a/lily/score-scheme.cc b/lily/score-scheme.cc index b48219ad44..3b256b01f4 100644 --- a/lily/score-scheme.cc +++ b/lily/score-scheme.cc @@ -114,67 +114,3 @@ LY_DEFINE (ly_score_embedded_format, "ly:score-embedded-format", scm_remember_upto_here_1 (prot); return output; } - -LY_DEFINE (ly_score_process, "ly:render-music-as-systems", - 5, 0, 0, (SCM music, - SCM outdef, - SCM book_outputdef, - SCM header, - SCM outname), - "Create output using a default \\book block. ") -{ - SCM_ASSERT_TYPE(unsmob_music(music), music, - SCM_ARG1, __FUNCTION__, "music"); - SCM_ASSERT_TYPE(unsmob_output_def (outdef), outdef, - SCM_ARG2, __FUNCTION__, "output def"); - SCM_ASSERT_TYPE(unsmob_output_def (book_outputdef), book_outputdef, - SCM_ARG3, __FUNCTION__, "output def"); - SCM_ASSERT_TYPE(scm_is_string (outname), outname, - SCM_ARG5, __FUNCTION__, "string"); - - - SCM scaled_def = outdef; - SCM scaled_bookdef = book_outputdef; - - Output_def *bpd = unsmob_output_def (book_outputdef); - - /* ugh . */ - assert (bpd->c_variable ("is-paper") == SCM_BOOL_T); - - Real scale = scm_to_double (bpd->c_variable ("output-scale")); - - Output_def *def = scale_output_def (unsmob_output_def (outdef), scale); - Output_def *bdef = scale_output_def (bpd, scale); - def->parent_ = bdef; - - scaled_def = def->self_scm (); - scaled_bookdef = bdef->self_scm (); - - def->unprotect (); - bdef->unprotect (); - - SCM context = ly_run_translator (music, scaled_def, SCM_BOOL_F); - SCM output_as_scm = ly_format_output (context); - Music_output *output = unsmob_music_output (output_as_scm); - - Paper_score *pscore = dynamic_cast (output); - assert (pscore); - - /* ugh, this is strange, Paper_book without a Book object. */ - Paper_book *paper_book = new Paper_book (); - paper_book->header_ = header; - paper_book->paper_ = unsmob_output_def (scaled_bookdef); - - if (ly_is_module (header)) - paper_book->add_score (header); - - paper_book->add_score (pscore->self_scm ()); - paper_book->classic_output (outname); - paper_book->unprotect (); - - scm_remember_upto_here_1 (scaled_def); - scm_remember_upto_here_1 (scaled_bookdef); - - return SCM_UNSPECIFIED; -} - diff --git a/ly/init.ly b/ly/init.ly index eab90ef3d5..062ca06cbd 100644 --- a/ly/init.ly +++ b/ly/init.ly @@ -39,6 +39,8 @@ (version-not-seen-message input-file-name)) #(if (pair? toplevel-scores) - (toplevel-book-handler + ((if (defined? 'default-toplevel-book-handler) + default-toplevel-book-handler + toplevel-book-handler) parser (apply ly:make-book $defaultpaper $defaultheader toplevel-scores))) diff --git a/ly/lilypond-book-preamble.ly b/ly/lilypond-book-preamble.ly index aa82b7330c..91fde7c84b 100644 --- a/ly/lilypond-book-preamble.ly +++ b/ly/lilypond-book-preamble.ly @@ -1,12 +1,10 @@ \version "2.10.0" -#(set! toplevel-score-handler print-score-with-defaults) -#(set! toplevel-music-handler - (lambda (p m) - (if (not (eq? (ly:music-property m 'void) #t)) - (print-score-with-defaults - p (scorify-music m p))))) +%% toplevel \book gets output per page, +%% everything else gets output per system/title +#(define default-toplevel-book-handler + print-book-with-defaults-as-systems ) #(ly:set-option (quote no-point-and-click)) #(define inside-lilypond-book #t) diff --git a/scm/lily-library.scm b/scm/lily-library.scm index 1e8fe97e47..52331aa04c 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -89,7 +89,6 @@ (cons score (ly:parser-lookup parser 'toplevel-scores)))) (define-public (scorify-music music parser) - (for-each (lambda (func) (set! music (func music parser))) toplevel-music-functions) @@ -103,7 +102,7 @@ (collect-scores-for-book parser (scorify-music music parser))))) -(define-public (print-book-with-defaults parser book) +(define (print-book-with parser book process-procedure) (let* ((paper (ly:parser-lookup parser '$defaultpaper)) (layout (ly:parser-lookup parser '$defaultlayout)) @@ -117,52 +116,14 @@ (set! base (format #f "~a-~a" base count))) (ly:parser-define! parser 'output-count (1+ count)) - (ly:book-process book paper layout base) + (process-procedure book paper layout base) )) -(define-public (print-score-with-defaults parser score) - (let* - ((paper (ly:parser-lookup parser '$defaultpaper)) - (count (ly:parser-lookup parser 'output-count)) - (base (ly:parser-output-name parser))) - - (if (not (integer? count)) - (set! count 0)) - - (if (> count 0) - (set! base (format #f "~a-~a" base count))) - - (ly:parser-define! parser 'output-count (1+ count)) - - (if (not (ly:score-error? score)) - (let* - ((header (ly:score-header score)) - (output-defs (ly:score-output-defs score)) - (layout-defs (filter (lambda (d) (eq? #t (ly:output-def-lookup d 'is-layout))) - output-defs)) - (midi-defs (filter (lambda (d) (eq? #t (ly:output-def-lookup d 'is-midi))) - output-defs)) - (music (ly:score-music score)) - (layout-def (if (null? layout-defs) - (ly:parser-lookup parser '$defaultlayout) - (car layout-defs)))) - - (if (not (module? header)) - (set! header (ly:parser-lookup parser '$defaultheader))) - - (ly:render-music-as-systems - music layout-def paper header base) - - (if (pair? midi-defs) - (ly:performance-write (ly:format-output (ly:run-translator music (car midi-defs))) - (format #f "~a.midi" base) - )) - - )))) - - - +(define-public (print-book-with-defaults parser book) + (print-book-with parser book ly:book-process)) +(define-public (print-book-with-defaults-as-systems parser book) + (print-book-with parser book ly:book-process-to-systems)) ;;;;;;;;;;;;;;;; ;; alist