X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftiming-translator.cc;h=fc9ddc83a8c0d0a993d61b61e4865349cb92bead;hb=b7f005cbf2757c8c1d3383a0ccc935cf5e3c2e38;hp=79b741034c2c16876ca6354bbbe56766322a0d26;hpb=94375d04f45b415ad705fd444fdb344416f116d9;p=lilypond.git diff --git a/lily/timing-translator.cc b/lily/timing-translator.cc index 79b741034c..fc9ddc83a8 100644 --- a/lily/timing-translator.cc +++ b/lily/timing-translator.cc @@ -4,58 +4,20 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2001 Han-Wen Nienhuys + (c) 1997--2005 Han-Wen Nienhuys */ -#include "debug.hh" #include "timing-translator.hh" -#include "command-request.hh" + +#include "warn.hh" #include "translator-group.hh" -#include "global-translator.hh" +#include "global-context.hh" #include "multi-measure-rest.hh" -/* - TODO: change the rest of lily, so communication with - Timing_translator is only done through properties. This means the - class declaration can go here. */ -bool -Timing_translator::try_music (Music*r) -{ - if (dynamic_cast (r)) - { - check_ = r; - return true; - } - return false; -} - -void -Timing_translator::process_music () -{ - if (check_ && measure_position ().main_part_) - { - check_->origin ()->warning (_f ("barcheck failed at: %s", - measure_position ().str ())); - Moment zero; - - if (!to_boolean (get_property ("barCheckNoSynchronize"))) - daddy_trans_l_->set_property ("measurePosition", zero.smobbed_copy ()); - } -} - void Timing_translator::stop_translation_timestep () { - check_ = 0; - - Translator *t = this; - Global_translator *global_l =0; - do - { - t = t->daddy_trans_l_ ; - global_l = dynamic_cast (t); - } - while (!global_l); + Global_context *global = get_global_context (); /* allbars == ! skipbars */ SCM sb = get_property ("skipBars"); @@ -73,24 +35,31 @@ Timing_translator::stop_translation_timestep () /* Hmm. We insert the bar moment every time we process a moment. A waste of cpu? - */ + */ && !now.grace_part_) - global_l->add_moment_to_process (now + barleft); + global->add_moment_to_process (now + barleft); } } - void Timing_translator::initialize () { - daddy_trans_l_->set_property ("timing" , SCM_BOOL_T); - daddy_trans_l_->set_property ("currentBarNumber" , gh_int2scm (1)); - - daddy_trans_l_->set_property ("timeSignatureFraction", - gh_cons (gh_int2scm (4), gh_int2scm (4))); - daddy_trans_l_->set_property ("measurePosition", Moment (Rational (0)).smobbed_copy ()); - daddy_trans_l_->set_property ("measureLength", Moment (Rational (1)).smobbed_copy ()); - daddy_trans_l_->set_property ("beatLength", Moment (Rational (1,4)).smobbed_copy ()); + + /* + move this to engraver-init.ly? + */ + context ()->add_alias (ly_symbol2scm ("Timing")); + context ()->set_property ("timing", SCM_BOOL_T); + context ()->set_property ("currentBarNumber", scm_int2num (1)); + + context ()->set_property ("timeSignatureFraction", + scm_cons (scm_int2num (4), scm_int2num (4))); + /* + Do not init measurePosition; this should be done from global + context. + */ + context ()->set_property ("measureLength", Moment (Rational (1)).smobbed_copy ()); + context ()->set_property ("beatLength", Moment (Rational (1, 4)).smobbed_copy ()); } Rational @@ -105,46 +74,42 @@ Timing_translator::measure_length () const Timing_translator::Timing_translator () { - } Moment Timing_translator::measure_position () const { SCM sm = get_property ("measurePosition"); - - Moment m =0; + + Moment m = 0; if (unsmob_moment (sm)) { m = *unsmob_moment (sm); while (m.main_part_ < Rational (0)) m.main_part_ += measure_length (); } - + return m; } void Timing_translator::start_translation_timestep () { - check_ = 0; - Translator *t = this; - Global_translator *global_l =0; - do - { - t = t->daddy_trans_l_ ; - global_l = dynamic_cast (t); - } - while (!global_l); + Global_context *global = get_global_context (); - Moment now = global_l->now_mom_; - Moment dt = now - global_l -> prev_mom_; + Moment now = global->now_mom (); + Moment dt = now - global->previous_moment (); if (dt < Moment (0)) { - programming_error ("Moving backwards in time"); + programming_error ("moving backwards in time"); dt = 0; } - + else if (dt.main_part_.is_infinity ()) + { + programming_error ("moving infinitely to future"); + dt = 0; + } + if (!dt.to_bool ()) return; @@ -158,29 +123,35 @@ Timing_translator::start_translation_timestep () else { measposp = now; - daddy_trans_l_->set_property ("measurePosition", measposp.smobbed_copy ()); + context ()->set_property ("measurePosition", + measposp.smobbed_copy ()); } - + measposp += dt; - + SCM barn = get_property ("currentBarNumber"); int b = 0; - if (gh_number_p (barn)) + if (scm_is_number (barn)) { - b = gh_scm2int (barn); + b = scm_to_int (barn); } SCM cad = get_property ("timing"); - bool c= to_boolean (cad); + bool c = to_boolean (cad); Rational len = measure_length (); while (c && measposp.main_part_ >= len) { measposp.main_part_ -= len; - b ++; + b++; } - daddy_trans_l_->set_property ("currentBarNumber", gh_int2scm (b)); - daddy_trans_l_->set_property ("measurePosition", measposp.smobbed_copy ()); + context ()->set_property ("currentBarNumber", scm_int2num (b)); + context ()->set_property ("measurePosition", measposp.smobbed_copy ()); } +ADD_TRANSLATOR (Timing_translator, + "This engraver adds the alias " + "@code{Timing} to its containing context.", + + "", "", "", "", "");