2 recording-group-engraver.cc -- implement Recording_group_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2003--2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
11 #include "engraver-group-engraver.hh"
12 #include "protected-scm.hh"
14 class Recording_group_engraver : public Engraver_group_engraver
17 TRANSLATOR_DECLARATIONS(Recording_group_engraver);
18 virtual bool try_music (Music *m);
19 virtual void start_translation_timestep ();
20 virtual void stop_translation_timestep ();
21 virtual void finalize ();
22 virtual void initialize ();
23 Protected_scm accumulator_;
27 Recording_group_engraver::initialize ()
29 Engraver_group_engraver::initialize ();
30 accumulator_ = gh_cons (SCM_EOL, SCM_EOL);
33 Recording_group_engraver::Recording_group_engraver()
38 Recording_group_engraver::start_translation_timestep ()
40 Engraver_group_engraver::start_translation_timestep();
42 scm_set_car_x (accumulator_, gh_cons (now_mom ().smobbed_copy (), SCM_EOL));
46 Recording_group_engraver::stop_translation_timestep ()
48 Engraver_group_engraver::stop_translation_timestep();
49 scm_set_cdr_x (accumulator_, gh_cons (gh_car (accumulator_), gh_cdr (accumulator_)));
51 scm_set_car_x (accumulator_, SCM_EOL);
55 Recording_group_engraver::finalize ()
57 Engraver_group_engraver::finalize ();
58 SCM proc = get_property ("recordEventSequence");
60 if (gh_procedure_p (proc))
61 scm_call_2 (proc, daddy_context_->self_scm(), gh_cdr (accumulator_));
63 accumulator_ = SCM_EOL;
67 Recording_group_engraver::try_music (Music *m)
69 bool retval = Translator_group::try_music (m);
71 SCM seq = gh_cdar (accumulator_);
72 seq = gh_cons (gh_cons (m->self_scm(), gh_bool2scm (retval)),
75 scm_set_cdr_x (gh_car (accumulator_), seq);
81 ENTER_DESCRIPTION(Recording_group_engraver,
82 "Engraver_group_engraver that records all music events "
83 "for this context. Calls the procedure "
84 "in @code{recordEventSequence} when finished.",
88 "recordEventSequence",