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