X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscore.cc;h=6935d9f606c045b4ea02fb1d64346802926fa266;hb=237583408aaf3b2192c388c3183d9c57fb051bd0;hp=b6a3f2cd839e2e54da79668ca8ddf5957a02cea2;hpb=a41a7fb966e8552cc8da7c4eab1b60eb7b8eff3a;p=lilypond.git diff --git a/lily/score.cc b/lily/score.cc index b6a3f2cd83..6935d9f606 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -1,287 +1,177 @@ /* score.cc -- implement Score - source file of the LilyPond music typesetter + source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ -#include "tex-stream.hh" + +#include + +#include "ly-smobs.icc" + #include "score.hh" -#include "score-column.hh" -#include "p-score.hh" -#include "staff.hh" -#include "debug.hh" -#include "paper-def.hh" +#include "warn.hh" +#include "music-output-def.hh" +#include "music-output.hh" +#include "music-iterator.hh" +#include "music.hh" +#include "global-translator.hh" +#include "scm-hash.hh" +#include "cpu-timer.hh" #include "main.hh" -#include "source.hh" -#include "source-file.hh" -#include "score-walker.hh" -#include "midi-output.hh" -#include "midi-def.hh" +#include "paper-def.hh" +#include "ly-modules.hh" -extern String default_out_fn; -void -Score::setup_music() + +/* + TODO: junkme. + */ +Score::Score () + : Input () { - *mlog << "\nSetting up music ..." << flush; - if (last() == Moment(0)) { - errorlevel_i_ |= 1; - error("Need to have music in a score.", defined_ch_C_); - } + input_file_ = 0; + header_ = SCM_EOL; + music_ = SCM_EOL; + errorlevel_ = 0; - for (iter_top(staffs_,i); i.ok(); i++) { - i->setup_staffcols(); - } + smobify_self (); } -void -Score::process_music() -{ - *mlog << "Processing music ..." << flush; - for (Score_walker w(this); w.ok(); w++) { - w.process(); - } -} +/* + store point & click locations. + Global to save some time. (Sue us!) + */ +bool store_locations_global_b; -void -Score::process() +Score::Score (Score const &s) + : Input (s) { - setup_music(); + music_ = SCM_EOL; + header_ = 0; + smobify_self (); - paper(); - midi(); -} + Music * m =unsmob_music (s.music_); + music_ = m?m->clone ()->self_scm () : SCM_EOL; + scm_gc_unprotect_object (music_); + + for (int i=0; i < s.defs_.size (); i++) + defs_.push (s.defs_[i]->clone ()); + errorlevel_ = s.errorlevel_; -void -Score::paper() -{ - if (!paper_p_) - return; - - pscore_p_ = new PScore(paper_p_); - - find_col(0, false)->set_breakable(); // ugh - find_col(last(), false)->set_breakable(); - do_cols(); - - for (iter_top(staffs_,i); i.ok(); i++) - i->set_output(pscore_p_); - - - process_music(); - clean_cols(); // can't move clean_cols() farther up. - print(); - calc_idealspacing(); - - // debugging - OK(); - *mlog << endl; - pscore_p_->process(); - - // output - paper_output(); - + header_ = ly_make_anonymous_module (); + if (ly_module_p (s.header_)) + ly_copy_module_variables (header_, s.header_); } -/** - Remove empty cols, preprocess other columns. - */ -void -Score::clean_cols() +Score::~Score () { - for (iter_top(staffs_,i); i.ok(); i++) - i->clean_cols(); - - for (iter_top(cols_,c); c.ok(); ) { - if (!c->pcol_l_->used_b()) { - delete c.remove_p(); - } else { - c->preprocess(); - c++; - } - } + } -/** Create columns at time #w#. This sux. We should have - Score_column create the appropriate PCol. Unfortunately, PCols - don't know about their position. - @return cursor pointing to the nonmusical (first) column */ -PCursor -Score::create_cols(Moment w, PCursor &i) -{ - Score_column* c1 = new Score_column(w); - Score_column* c2 = new Score_column(w); - - c1->musical_b_ = false; - c2->musical_b_ = true; - - if (i.ok()) { - i --; - } - if ( !i.ok() ) { - i = cols_.top(); + +void +Score::run_translator (Music_output_def *odef) +{ + Cpu_timer timer; + Global_translator * trans = odef->get_global_translator (); + if (!trans) + { + programming_error ("no toplevel translator"); + return ; } - for (; i.ok(); i++) { - if (i->when() > w) - break; + progress_indication (_ ("Interpreting music...")); + Music * music = unsmob_music (music_); + + trans->final_mom_ = music->get_length (); + SCM protected_iter = Music_iterator::get_static_get_iterator (music); + Music_iterator * iter = unsmob_iterator (protected_iter); + iter->init_translator (music, trans); + + iter->construct_children (); + + if (! iter->ok ()) + { + warning (_ ("Need music in a score")); + errorlevel_ =1; + return ; } - if (!i.ok()) { - cols_.bottom().add(c1); - cols_.bottom().add(c2); - i = cols_.bottom(); - i --; - } else { - i.insert(c1); - i.insert(c2); - i -= 2; - } - return i; -} + trans->start (); + trans->run_iterator_on_me (iter); + iter->quit(); + scm_remember_upto_here_1 (protected_iter); + trans->finish (); -PCursor -Score::find_col(Moment w, bool mus) -{ - iter_top( cols_,i); - - for (; i.ok(); i++) { - if (i->when() == w && i->musical_b_ == mus) - return i; - if (i->when() > w) - break; + if (errorlevel_) + { + // should we? hampers debugging. + warning (_ ("errors found.")); } - i = create_cols(w,i); - if (mus) - i++; - return i; -} -void -Score::do_cols() -{ - iter_top(cols_,i); - for (; i.ok(); i++) { - pscore_p_->add(i->pcol_l_); - } -} + Music_output * output = trans->get_output (); + scm_gc_unprotect_object (trans->self_scm ()); + + if (verbose_global_b) + progress_indication (_f ("elapsed time: %.2f seconds", timer.read ())); -Moment -Score::last() const -{ - Moment l = 0; - for (iter_top(staffs_,i); i.ok(); i++) { - l = l>? i->last(); - } - return l; -} + if (!header_) + header_ = ly_make_anonymous_module(); // ug.h -void -Score::set(Paper_def *pap_p) -{ - delete paper_p_; - paper_p_ = pap_p; -} + output->header_ = header_; + output->origin_string_ = location_string (); -void -Score::set(Midi_def* midi_p) -{ - delete midi_p_; - midi_p_ = midi_p; + progress_indication ("\n"); + output->process (); + + delete output ; } void -Score::OK() const +Score::process () { -#ifndef NDEBUG - for (iter_top(staffs_,i); i.ok(); i++) { - i->OK(); - assert(i->score_l_ == this); - } - staffs_.OK(); - cols_.OK(); - for (iter_top(cols_,cc); cc.ok() && (cc+1).ok(); cc++) { - assert(cc->when() <= (cc+1)->when()); + if (!unsmob_music (music_)) + return; + + for (int i=0; i < defs_.size (); i++) + { + if (no_paper_global_b + && dynamic_cast (defs_[i])) + continue; + run_translator (defs_[i]); } -#endif } void -Score::print() const +Score::add_output (Music_output_def *pap) { -#ifndef NPRINT - mtor << "score {\n"; - for (iter_top(staffs_,i); i.ok(); i++) { - i->print(); - } - for (iter_top(cols_,i); i.ok(); i++) { - i->print(); - } - if (pscore_p_) - pscore_p_->print(); - if (midi_p_) - midi_p_->print(); - - mtor << "}\n"; -#endif + defs_.push (pap); } -Score::Score() -{ - pscore_p_=0; - paper_p_ = 0; - midi_p_ = 0; - errorlevel_i_ = 0; - defined_ch_C_ = 0; -} +IMPLEMENT_SMOBS (Score); +IMPLEMENT_DEFAULT_EQUAL_P (Score); -Score::~Score() -{ - delete pscore_p_; - delete paper_p_; - delete midi_p_; -} -void -Score::paper_output() +SCM +Score::mark_smob (SCM s) { - if (paper_p_->outfile=="") - paper_p_->outfile = default_out_fn + ".out"; + Score * sc = (Score*) SCM_CELL_WORD_1 (s); - if ( errorlevel_i_ ) { - *mlog << "lilypond: warning: no output to: " << paper_p_->outfile - << " (errorlevel=" << errorlevel_i_ << ")" << endl; - return; - } - - *mlog << "TeX output to " << paper_p_->outfile << " ...\n"; - - Tex_stream the_output(paper_p_->outfile); - - the_output << "% outputting Score, defined at: " << - source_l_g-> - sourcefile_l (defined_ch_C_)->file_line_no_str(defined_ch_C_) << "\n"; - pscore_p_->output(the_output); + if (sc->header_) + scm_gc_mark (sc->header_); + for (int i = sc->defs_.size (); i--;) + scm_gc_mark (sc->defs_[i]->self_scm ()); + + return sc->music_; } -void -Score::midi() +int +Score::print_smob (SCM , SCM p, scm_print_state*) { - if (!midi_p_) - return; - - if (midi_p_->outfile_str_ == "") - midi_p_->outfile_str_ = default_out_fn + ".midi"; - - *mlog << "midi output to " << midi_p_->outfile_str_ << " ...\n"; - Midi_output(this, midi_p_); -} + scm_puts ("#", p); -void -Score::add(Staff*s) -{ - s->score_l_ = this; - staffs_.bottom().add(s); + return 1; }