/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1997--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
void
Timing_translator::initialize ()
{
- Context *timing = unsmob_context (scm_call_2 (ly_lily_module_constant ("ly:context-find"),
+ Context *timing = Context::unsmob (scm_call_2 (ly_lily_module_constant ("ly:context-find"),
context ()->self_scm (),
ly_symbol2scm ("Timing")));
if (timing != context ())
SCM measureLength = timing->get_property ("measureLength");
- if (!unsmob_moment (measureLength))
+ if (!Moment::unsmob (measureLength))
{
measureLength =
Moment (ly_scm2rational
context ()->set_property ("beamExceptions", beamExceptions);
SCM baseMoment = timing->get_property ("baseMoment");
- if (!unsmob_moment (baseMoment))
+ if (!Moment::unsmob (baseMoment))
{
baseMoment =
Moment (ly_scm2rational
{
beatStructure =
scm_call_3 (ly_lily_module_constant ("beat-structure"),
- ly_rational2scm (unsmob_moment (baseMoment)->main_part_),
+ ly_rational2scm (Moment::unsmob (baseMoment)->main_part_),
timeSignatureFraction,
timeSignatureSettings);
}
Timing_translator::measure_length () const
{
SCM l = get_property ("measureLength");
- if (unsmob_moment (l))
- return unsmob_moment (l)->main_part_;
+ if (Moment::unsmob (l))
+ return Moment::unsmob (l)->main_part_;
else
return Rational (1);
}
Moment measposp;
SCM s = get_property ("measurePosition");
- if (unsmob_moment (s))
- measposp = *unsmob_moment (s);
+ if (Moment::unsmob (s))
+ measposp = *Moment::unsmob (s);
else
{
measposp = now;
- context ()->set_property ("measurePosition",
- measposp.smobbed_copy ());
}
int current_barnumber = robust_scm2int (get_property ("currentBarNumber"), 0);
}
}
+
+ // Because "timing" can be switched on and off asynchronously with
+ // graces, measurePosition might get into strange settings of
+ // grace_part_. It does not actually make sense to have it diverge
+ // from the main timing. Updating the grace part outside of the
+ // actual check for "timing" looks strange and will lead to changes
+ // of grace_part_ even when timing is off. However, when timing is
+ // switched back on again, this will generally happen in an override
+ // that does _not_ in itself advance current_moment. So the whole
+ // timing advance logic will only get triggered while "timing" is
+ // still of. Maybe we should keep measurePosition.grace_part_
+ // constantly at zero anyway?
+
+ measposp.grace_part_ = now.grace_part_;
+
+
context ()->set_property ("currentBarNumber", scm_from_int (current_barnumber));
context ()->set_property ("internalBarNumber", scm_from_int (internal_barnumber));
context ()->set_property ("measurePosition", measposp.smobbed_copy ());