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
);
29 Time_signature_engraver::Time_signature_engraver ()
32 last_time_fraction_
= SCM_BOOL_F
;
36 Time_signature_engraver::process_music ()
39 not rigorously safe, since the value might get GC'd and
40 reallocated in the same spot */
41 SCM fr
= get_property ("timeSignatureFraction");
43 && last_time_fraction_
!= fr
46 int den
= scm_to_int (scm_cdr (fr
));
47 if (den
!= (1 << intlog2 (den
)))
50 Todo: should make typecheck?
52 OTOH, Tristan Keuris writes 8/20 in his Intermezzi.
54 warning (_f ("strange time signature found: %d/%d",
56 scm_to_int (scm_car (fr
))));
59 last_time_fraction_
= fr
;
60 time_signature_
= make_item ("TimeSignature", SCM_EOL
);
61 time_signature_
->set_property ("fraction", fr
);
66 Time_signature_engraver::stop_translation_timestep ()
71 ADD_TRANSLATOR (Time_signature_engraver
,
72 /* descr */ "Create a TimeSignature whenever @code{timeSignatureFraction} changes",
73 /* creats*/ "TimeSignature",