#include "text-item.hh"
#include "warn.hh"
+#include "performance.hh"
+#include "paper-score.hh"
+
#include "ly-smobs.icc"
Book::Book ()
SCM
Book::mark_smob (SCM s)
{
- Book *book = (Book*) SCM_CELL_WORD_1 (s);
+ Book *book = (Book *) SCM_CELL_WORD_1 (s);
#if 0
if (book->key_)
- scm_gc_mark (book->key_->self_scm());
+ scm_gc_mark (book->key_->self_scm ());
#endif
if (book->paper_)
Paper_book *paper_book = new Paper_book ();
Real scale = scm_to_double (paper_->c_variable ("outputscale"));
- Output_def * scaled_bookdef = scale_output_def (paper_, scale);
+ Output_def *scaled_bookdef = scale_output_def (paper_, scale);
- Object_key * key = new Lilypond_general_key (0, user_key_, 0);
- SCM scm_key = key->self_scm();
+ Object_key *key = new Lilypond_general_key (0, user_key_, 0);
+ SCM scm_key = key->self_scm ();
scm_gc_unprotect_object (scm_key);
-
+
paper_book->paper_ = scaled_bookdef;
- scm_gc_unprotect_object (scaled_bookdef->self_scm());
-
+ scm_gc_unprotect_object (scaled_bookdef->self_scm ());
+
paper_book->header_ = header_;
/* Render in order of parsing. */
+ int midi_count = 0;
for (SCM s = scm_reverse (scores_); s != SCM_EOL; s = scm_cdr (s))
{
if (Score *score = unsmob_score (scm_car (s)))
{
- SCM systems = score
- ->book_rendering (outname, paper_book->paper_, default_def, key);
-
- /* If the score is empty, generate no output. Should we do
- titling? */
- if (scm_is_vector (systems))
+ SCM outputs = score
+ ->book_rendering (paper_book->paper_, default_def, key);
+
+ while (scm_is_pair (outputs))
{
- if (ly_c_module_p (header_))
- paper_book->add_score (header_);
- paper_book->add_score (systems);
+ Music_output *output = unsmob_music_output (scm_car (outputs));
+
+ if (Performance *perf = dynamic_cast<Performance *> (output))
+ {
+ String fn = outname;
+ if (midi_count)
+ fn += "-" + to_string (midi_count);
+
+ midi_count ++;
+ perf->write_output (fn);
+ }
+ else if (Paper_score *pscore = dynamic_cast<Paper_score *> (output))
+ {
+ SCM systems = pscore->get_paper_systems ();
+ if (ly_c_module_p (score->header_))
+ paper_book->add_score (score->header_);
+ paper_book->add_score (systems);
+ }
+
+ outputs = scm_cdr (outputs);
}
}
else if (Text_interface::markup_p (scm_car (s)))