]> git.donarmstrong.com Git - lilypond.git/blob - lily/recording-group-engraver.cc
f546ee40152fcb021e43876f4eb5f97c06785642
[lilypond.git] / lily / recording-group-engraver.cc
1 /*
2   recording-group-engraver.cc -- implement Recording_group_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2003--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "recording-group-engraver.hh"
10 #include "context.hh"
11
12
13 void
14 Recording_group_engraver::derived_mark () const
15 {
16   Engraver_group_engraver::derived_mark ();
17   scm_gc_mark (now_events_);
18   scm_gc_mark (accumulator_);
19 }
20
21 Recording_group_engraver::Recording_group_engraver ()
22 {
23   accumulator_ = SCM_EOL;
24   now_events_ = SCM_EOL;
25 }
26
27 void
28 Recording_group_engraver::add_music (SCM music, SCM success)
29 {
30   now_events_ = scm_cons (scm_cons (music, success), now_events_);
31 }
32
33 void
34 Recording_group_engraver::stop_translation_timestep ()
35 {
36   accumulator_ = scm_acons (scm_cons (context ()->now_mom ().smobbed_copy (),
37                                       context ()->get_property ("instrumentTransposition")),
38                             now_events_,
39                             accumulator_);
40   now_events_ = SCM_EOL;
41 }
42
43 void
44 Recording_group_engraver::finalize ()
45 {
46   SCM proc = context()->get_property ("recordEventSequence");
47
48   if (ly_is_procedure (proc))
49     scm_call_2 (proc, context ()->self_scm (), scm_cdr (accumulator_));
50 }
51
52 bool
53 Recording_group_engraver::try_music (Music *m)
54 {
55   bool retval = Translator_group::try_music (m);
56
57   add_music (m->self_scm (), ly_bool2scm (retval));
58   return retval;
59 }
60
61 void
62 recording_engraver (Translator_group *tg)
63 {
64   Recording_group_engraver *rg = dynamic_cast<Recording_group_engraver*> (tg);
65   rg->stop_translation_timestep ();
66 }
67
68 void
69 Recording_group_engraver::fetch_precomputable_methods (Translator_group_void_method ptrs[])
70 {
71   ptrs[STOP_TRANSLATION_TIMESTEP] = &recording_engraver;
72 }
73
74 #include "translator.icc"
75
76 ADD_TRANSLATOR_GROUP (Recording_group_engraver,
77                 "Engraver_group_engraver that records all music events "
78                 "for this context. Calls the procedure "
79                 "in @code{recordEventSequence} when finished.",
80                 "",
81                 "",
82                 "",
83                 "recordEventSequence",
84                 "");