]> 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--2004 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 (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
54 void
55 Recording_group_engraver::stop_translation_timestep ()
56 {
57   Engraver_group_engraver::stop_translation_timestep ();
58
59   accumulator_ = scm_acons (scm_cons (now_mom ().smobbed_copy (),
60                                      get_property ("instrumentTransposition")),
61                             now_events_,
62                             accumulator_);
63   now_events_ = SCM_EOL;
64 }
65
66 void
67 Recording_group_engraver::finalize ()
68 {
69   Engraver_group_engraver::finalize ();
70   SCM proc = get_property ("recordEventSequence");
71
72   if (ly_c_procedure_p (proc))
73     scm_call_2  (proc, context ()->self_scm (), scm_cdr (accumulator_));
74 }
75
76 bool
77 Recording_group_engraver::try_music (Music  *m)
78 {
79   bool retval = Translator_group::try_music (m);
80
81   add_music (m->self_scm (), ly_bool2scm (retval));
82   return retval;
83 }
84
85
86 ENTER_DESCRIPTION (Recording_group_engraver,
87                   "Engraver_group_engraver that records all music events "
88                   "for this context. Calls the procedure "
89                   "in @code{recordEventSequence} when finished.",
90                   "",
91                   "",
92                   "",
93                   "recordEventSequence",
94                   "");