]> git.donarmstrong.com Git - lilypond.git/blob - lily/recording-group-engraver.cc
* lily/include/lily-guile.hh: rename ly_c_X_p -> ly_is_X
[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 "context.hh"
10 #include "engraver-group-engraver.hh"
11 #include "protected-scm.hh"
12
13 class Recording_group_engraver : public Engraver_group_engraver
14 {
15 public:
16   TRANSLATOR_DECLARATIONS (Recording_group_engraver);
17   virtual bool try_music (Music *m);
18   void add_music (SCM, SCM);
19   virtual void stop_translation_timestep ();
20   virtual void finalize ();
21   virtual void initialize ();
22   virtual void derived_mark () const;
23   SCM now_events_;
24   SCM accumulator_;
25 };
26
27 void
28 Recording_group_engraver::derived_mark () const
29 {
30   Engraver_group_engraver::derived_mark ();
31   scm_gc_mark (now_events_);
32   scm_gc_mark (accumulator_);
33 }
34
35 void
36 Recording_group_engraver::initialize ()
37 {
38   Engraver_group_engraver::initialize ();
39 }
40
41 Recording_group_engraver::Recording_group_engraver ()
42 {
43   accumulator_ = SCM_EOL;
44   now_events_ = SCM_EOL;
45 }
46
47 void
48 Recording_group_engraver::add_music (SCM music, SCM success)
49 {
50   now_events_ = scm_cons (scm_cons (music, success), now_events_);
51 }
52
53 void
54 Recording_group_engraver::stop_translation_timestep ()
55 {
56   Engraver_group_engraver::stop_translation_timestep ();
57
58   accumulator_ = scm_acons (scm_cons (now_mom ().smobbed_copy (),
59                                       get_property ("instrumentTransposition")),
60                             now_events_,
61                             accumulator_);
62   now_events_ = SCM_EOL;
63 }
64
65 void
66 Recording_group_engraver::finalize ()
67 {
68   Engraver_group_engraver::finalize ();
69   SCM proc = get_property ("recordEventSequence");
70
71   if (ly_is_procedure (proc))
72     scm_call_2 (proc, context ()->self_scm (), scm_cdr (accumulator_));
73 }
74
75 bool
76 Recording_group_engraver::try_music (Music *m)
77 {
78   bool retval = Translator_group::try_music (m);
79
80   add_music (m->self_scm (), ly_bool2scm (retval));
81   return retval;
82 }
83
84 ADD_TRANSLATOR (Recording_group_engraver,
85                 "Engraver_group_engraver that records all music events "
86                 "for this context. Calls the procedure "
87                 "in @code{recordEventSequence} when finished.",
88                 "",
89                 "",
90                 "",
91                 "recordEventSequence",
92                 "");