]> git.donarmstrong.com Git - lilypond.git/blob - lily/figured-bass-engraver.cc
* lily/include/translator.hh (ENTER_DESCRIPTION): add
[lilypond.git] / lily / figured-bass-engraver.cc
1 #include "engraver.hh"
2 #include "text-item.hh"
3 #include "musical-request.hh"
4 #include "item.hh"
5
6 class Figured_bass_engraver : public Engraver
7 {
8   
9   TRANSLATOR_DECLARATIONS(Figured_bass_engraver);
10 protected:
11   Link_array<Bass_figure_req> figures_;
12   Rest_req * rest_req_;
13
14   Grob * figure_;
15   
16   virtual bool try_music (Music*);
17   virtual void stop_translation_timestep ();
18   virtual void process_music ();
19 };
20
21
22 Figured_bass_engraver::Figured_bass_engraver()
23 {
24   figure_ = 0;
25   rest_req_ = 0;
26 }
27
28 void
29 Figured_bass_engraver::stop_translation_timestep ()
30 {
31   if (figure_)
32     {
33       typeset_grob (figure_);
34       figure_ = 0;
35     }
36
37   figures_.clear ();
38   rest_req_ = 0;
39 }
40
41 bool
42 Figured_bass_engraver::try_music (Music*m)
43 {
44   if (Bass_figure_req* bfr = dynamic_cast<Bass_figure_req*> (m))
45     {
46       figures_.push (bfr);
47       return true;
48     }
49   else if (Rest_req * r = dynamic_cast<Rest_req*> (m))
50     {
51       rest_req_ = r;
52       return true;
53     }
54   return false;
55 }
56
57 void
58 Figured_bass_engraver::process_music ()
59 {
60   if (rest_req_)
61     {
62       figure_ = new Item (get_property ("BassFigure"));
63       announce_grob(figure_, rest_req_->self_scm()); // todo
64       figure_->set_grob_property ("text" , scm_makfrom0str ("-"));
65     }
66   else if (figures_.size ())
67     {
68       figure_ = new Item (get_property ("BassFigure"));
69       SCM l = SCM_EOL;
70
71       for (int i = 0; i <figures_.size (); i++)
72         l = gh_cons (figures_[i]->self_scm(), l);
73       figure_->set_grob_property ("causes", l);
74       
75       announce_grob(figure_, figures_[0]->self_scm()); // todo
76     }
77 }
78
79   
80 ENTER_DESCRIPTION(Figured_bass_engraver,
81 /* descr */       "Make figured bass numbers.",
82 /* creats*/       "BassFigure",
83 /* accepts */     "general-music",
84 /* acks  */      "",
85 /* reads */       "",
86 /* write */       "");