]> git.donarmstrong.com Git - lilypond.git/blob - lily/figured-bass-engraver.cc
patch::: 1.5.14.jcn2
[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 }
39
40 bool
41 Figured_bass_engraver::try_music (Music*m)
42 {
43   if (Note_req* n = dynamic_cast<Note_req*> (m))
44     {
45       figures_.push (n);
46       return true;
47     }
48   else if (Rest_req * r = dynamic_cast<Rest_req*> (m))
49     {
50       rest_req_ = r;
51       return true;
52     }
53   return false;
54 }
55
56 void
57 Figured_bass_engraver::process_music ()
58 {
59   if (rest_req_)
60     {
61       figure_ = new Item (get_property ("BassFigure"));
62       announce_grob (figure_, rest_req_); // todo
63       figure_->set_grob_property ("text" , ly_str02scm ("-"));
64     }
65   else if (figures_.size ())
66     {
67       figure_ = new Item (get_property ("BassFigure"));
68       announce_grob (figure_, figures_[0]); // todo
69       SCM flist = SCM_EOL;
70       for (int i = 0; i < figures_.size (); i++)
71         {
72           Note_req * n = figures_[i];
73           Pitch *p = unsmob_pitch (n->get_mus_property ("pitch"));
74           
75           String fstr = to_str (p->steps ()+ 1);
76           
77           SCM one_fig = ly_str02scm(fstr.ch_C ());
78
79           if (p->alteration_i_ || to_boolean (n->get_mus_property ("force-accidental") ))
80             {
81               SCM alter = scm_assoc (gh_int2scm (p->alteration_i_),
82                                      figure_->get_grob_property ("accidental-alist"));
83               if (gh_pair_p (alter))
84                 {
85                   one_fig = scm_list_n (ly_symbol2scm ("columns"),
86                                      one_fig,
87                                      ly_cdr(alter),
88                                      SCM_UNDEFINED);
89                 }
90             }
91           
92           flist = gh_cons (one_fig, flist);
93         }
94
95       flist = gh_cons (ly_symbol2scm ("lines"), flist);
96
97       figure_-> set_grob_property ("text", flist);
98     }
99 }
100
101   
102 ENTER_DESCRIPTION(Figured_bass_engraver,
103 /* descr */       "Make volta brackets",
104 /* creats*/       "BassFigure",
105 /* acks  */       "",
106 /* reads */       "",
107 /* write */       "");