2 time-signature-engraver.cc -- implement Time_signature_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "time-signature.hh"
12 #include "engraver.hh"
13 #include "engraver-group-engraver.hh"
17 generate time_signatures.
19 class Time_signature_engraver
: public Engraver
21 Item
* time_signature_
;
22 SCM last_time_fraction_
;
25 virtual void stop_translation_timestep ();
26 virtual void process_music ();
28 TRANSLATOR_DECLARATIONS(Time_signature_engraver
);
32 Time_signature_engraver::Time_signature_engraver ()
35 last_time_fraction_
= SCM_BOOL_F
;
39 Time_signature_engraver::process_music ()
42 not rigorously safe, since the value might get GC'd and
43 reallocated in the same spot */
44 SCM fr
= get_property ("timeSignatureFraction");
46 && last_time_fraction_
!= fr
49 int den
= gh_scm2int (gh_cdr (fr
));
50 if (den
!= (1 << intlog2 (den
)))
53 Todo: should make typecheck?
55 OTOH, Tristan Keuris writes 8/20 in his Intermezzi.
57 warning (_f("Found strange time signature %d/%d.",
59 gh_scm2int (gh_car (fr
))
64 last_time_fraction_
= fr
;
65 time_signature_
= new Item (get_property ("TimeSignature"));
66 time_signature_
->set_grob_property ("fraction",fr
);
69 announce_grob(time_signature_
, SCM_EOL
);
74 Time_signature_engraver::stop_translation_timestep ()
78 typeset_grob (time_signature_
);
84 ENTER_DESCRIPTION(Time_signature_engraver
,
85 /* descr */ "Create a TimeSignature whenever @code{timeSignatureFraction} changes",
86 /* creats*/ "TimeSignature",