2 time-signature-engraver.cc -- implement Time_signature_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "time-signature.hh"
11 #include "engraver-group-engraver.hh"
15 generate time_signatures.
17 class Time_signature_engraver : public Engraver
19 Item *time_signature_;
20 SCM last_time_fraction_;
23 virtual void stop_translation_timestep ();
24 virtual void process_music ();
26 TRANSLATOR_DECLARATIONS (Time_signature_engraver);
30 Time_signature_engraver::Time_signature_engraver ()
33 last_time_fraction_ = SCM_BOOL_F;
37 Time_signature_engraver::process_music ()
40 not rigorously safe, since the value might get GC'd and
41 reallocated in the same spot */
42 SCM fr = get_property ("timeSignatureFraction");
44 && last_time_fraction_ != fr
47 int den = scm_to_int (scm_cdr (fr));
48 if (den != (1 << intlog2 (den)))
51 Todo: should make typecheck?
53 OTOH, Tristan Keuris writes 8/20 in his Intermezzi.
55 warning (_f ("Found strange time signature %d/%d.",
57 scm_to_int (scm_car (fr))
62 last_time_fraction_ = fr;
63 time_signature_ = make_item ("TimeSignature", SCM_EOL);
64 time_signature_->set_property ("fraction", fr);
69 Time_signature_engraver::stop_translation_timestep ()
75 ADD_TRANSLATOR (Time_signature_engraver,
76 /* descr */ "Create a TimeSignature whenever @code{timeSignatureFraction} changes",
77 /* creats*/ "TimeSignature",