]> git.donarmstrong.com Git - lilypond.git/blob - lily/figured-bass-engraver.cc
release: 1.5.33
[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<Note_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_ =00;
35     }
36
37   figures_.clear ();
38   rest_req_ = 0;
39 }
40
41 bool
42 Figured_bass_engraver::try_music (Music*m)
43 {
44   if (Note_req* n = dynamic_cast<Note_req*> (m))
45     {
46       figures_.push (n);
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" , ly_str02scm ("-"));
65     }
66   else if (figures_.size ())
67     {
68       figure_ = new Item (get_property ("BassFigure"));
69       announce_grob(figure_, figures_[0]->self_scm()); // todo
70       SCM flist = SCM_EOL;
71       for (int i = 0; i < figures_.size (); i++)
72         {
73           Note_req * n = figures_[i];
74           Pitch *p = unsmob_pitch (n->get_mus_property ("pitch"));
75           
76           String fstr = to_str (p->steps ()+ 1);
77           
78           SCM one_fig = ly_str02scm(fstr.ch_C ());
79
80           if (p->alteration_i_ || to_boolean (n->get_mus_property ("force-accidental") ))
81             {
82               SCM alter = scm_assoc (gh_int2scm (p->alteration_i_),
83                                      figure_->get_grob_property ("accidental-alist"));
84               if (gh_pair_p (alter))
85                 {
86                   one_fig = scm_list_n (ly_symbol2scm ("columns"),
87                                      one_fig,
88                                      ly_cdr(alter),
89                                      SCM_UNDEFINED);
90                 }
91             }
92           
93           flist = gh_cons (one_fig, flist);
94         }
95
96       flist = gh_cons (ly_symbol2scm ("lines"), flist);
97
98       figure_-> set_grob_property ("text", flist);
99     }
100 }
101
102   
103 ENTER_DESCRIPTION(Figured_bass_engraver,
104 /* descr */       "Make volta brackets",
105 /* creats*/       "BassFigure",
106 /* acks  */       "",
107 /* reads */       "",
108 /* write */       "");