X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftiming-translator.cc;h=03cbfdd3d43700c3cb30cc8ab6836519df6661d5;hb=cfe204f50a73e31a4fa15091a1f812843ef6c245;hp=8d456b2d38d537169ee94faa9163e17addd74d33;hpb=08560a1b8076630c4fc6cb9b902614d8b74fd6fc;p=lilypond.git diff --git a/lily/timing-translator.cc b/lily/timing-translator.cc index 8d456b2d38..03cbfdd3d4 100644 --- a/lily/timing-translator.cc +++ b/lily/timing-translator.cc @@ -22,6 +22,7 @@ #include "warn.hh" #include "translator-group.hh" #include "global-context.hh" +#include "moment.hh" void Timing_translator::stop_translation_timestep () @@ -46,20 +47,100 @@ Timing_translator::stop_translation_timestep () void Timing_translator::initialize () { - context ()->add_alias (ly_symbol2scm ("Timing")); - context ()->set_property ("currentBarNumber", scm_from_int (1)); - context ()->set_property ("internalBarNumber", scm_from_int (1)); + Context *timing = unsmob_context (scm_call_2 (ly_lily_module_constant ("ly:context-find"), + context ()->self_scm (), + ly_symbol2scm ("Timing"))); + if (timing != context ()) + { + context ()->add_alias (ly_symbol2scm ("Timing")); + + if (!timing) + { + programming_error ("Can't find Timing context template"); + timing = context (); + } + } + + SCM barnumber = timing->get_property ("currentBarNumber"); + if (!scm_is_integer (barnumber)) + barnumber = scm_from_int (1); + context ()->set_property ("currentBarNumber", barnumber); + context ()->set_property ("internalBarNumber", barnumber); + + SCM timeSignatureFraction = timing->get_property ("timeSignatureFraction"); + + if (!scm_is_pair (timeSignatureFraction)) + { + programming_error ("missing timeSignatureFraction"); + timeSignatureFraction = scm_cons (scm_from_int (4), scm_from_int (4)); + } + context ()->set_property ("timeSignatureFraction", timeSignatureFraction); + + SCM measureLength = timing->get_property ("measureLength"); + + if (!unsmob_moment (measureLength)) + { + measureLength = + Moment (ly_scm2rational + (scm_divide (scm_car (timeSignatureFraction), + scm_cdr (timeSignatureFraction)))).smobbed_copy (); + } + context ()->set_property ("measureLength", measureLength); - context ()->set_property ("timeSignatureFraction", - scm_cons (scm_from_int (4), scm_from_int (4))); /* Do not init measurePosition; this should be done from global context. */ - context ()->set_property ("measureLength", - Moment (Rational (1)).smobbed_copy ()); - context ()->set_property ("baseMoment", - Moment (Rational (1, 4)).smobbed_copy ()); + + SCM timeSignatureSettings = timing->get_property ("timeSignatureSettings"); + if (!scm_is_pair (timeSignatureSettings)) + { + programming_error ("missing timeSignatureSettings"); + // A memoized constant is not the prettiest thing as a fallback + // since it does not track changes of the variable. However, + // this is still better than nothing, and we already complained + // via a programming_error + timeSignatureSettings = ly_lily_module_constant ("default-time-signature-settings"); + } + context ()->set_property ("timeSignatureSettings", timeSignatureSettings); + + SCM beamExceptions = timing->get_property ("beamExceptions"); + if (!scm_is_pair (beamExceptions)) + { + beamExceptions = + scm_call_2 (ly_lily_module_constant ("beam-exceptions"), + timeSignatureFraction, + timeSignatureSettings); + } + context ()->set_property ("beamExceptions", beamExceptions); + + SCM baseMoment = timing->get_property ("baseMoment"); + if (!unsmob_moment (baseMoment)) + { + baseMoment = + Moment (ly_scm2rational + (scm_call_2 (ly_lily_module_constant ("base-length"), + timeSignatureFraction, + timeSignatureSettings))).smobbed_copy (); + } + context ()->set_property ("baseMoment", baseMoment); + + SCM beatStructure = timing->get_property ("beatStructure"); + if (!scm_is_pair (beatStructure)) + { + beatStructure = + scm_call_3 (ly_lily_module_constant ("beat-structure"), + ly_rational2scm (unsmob_moment (baseMoment)->main_part_), + timeSignatureFraction, + timeSignatureSettings); + } + context ()->set_property ("beatStructure", beatStructure); + + context ()->set_property ("beamHalfMeasure", + timing->get_property ("beamHalfMeasure")); + + context ()->set_property ("autoBeaming", + timing->get_property ("autoBeaming")); } Rational @@ -144,10 +225,12 @@ ADD_TRANSLATOR (Timing_translator, "", /* read */ - "internalBarNumber " + "baseMoment " "currentBarNumber " + "internalBarNumber " "measureLength " - "measurePosition ", + "measurePosition " + "timeSignatureFraction ", /* write */ "baseMoment "