]> git.donarmstrong.com Git - lilypond.git/blob - lily/figured-bass-engraver.cc
* flower
[lilypond.git] / lily / figured-bass-engraver.cc
1 /*
2   figured-bass-engraver.cc -- implement Figured_bass_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2002--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "engraver.hh"
10 #include "text-item.hh"
11 #include "item.hh"
12 #include "context.hh"
13
14 class Figured_bass_engraver : public Engraver
15 {
16   TRANSLATOR_DECLARATIONS (Figured_bass_engraver);
17 protected:
18   Link_array<Music> figures_;
19   Music *rest_req_;
20
21   Grob *figure_;
22
23   virtual bool try_music (Music *);
24   virtual void stop_translation_timestep ();
25   virtual void process_music ();
26 };
27
28 Figured_bass_engraver::Figured_bass_engraver ()
29 {
30   figure_ = 0;
31   rest_req_ = 0;
32 }
33
34 void
35 Figured_bass_engraver::stop_translation_timestep ()
36 {
37   figure_ = 0;
38
39   figures_.clear ();
40   rest_req_ = 0;
41 }
42
43 bool
44 Figured_bass_engraver::try_music (Music *m)
45 {
46   if (m->is_mus_type ("bass-figure-event"))
47     {
48       figures_.push (m);
49       return true;
50     }
51   else if (m->is_mus_type ("rest-event"))
52     {
53       rest_req_ = m;
54       return true;
55     }
56   return false;
57 }
58
59 void
60 Figured_bass_engraver::process_music ()
61 {
62   if (rest_req_)
63     {
64       figure_ = make_item ("BassFigure", rest_req_->self_scm ());
65       figure_->set_property ("text", scm_makfrom0str ("-"));
66     }
67   else if (figures_.size ())
68     {
69       SCM proc = get_property ("bassFigureFormatFunction");
70       if (ly_c_procedure_p (proc))
71         {
72           SCM l = SCM_EOL;
73           SCM *t = &l;
74           for (int i = 0; i < figures_.size (); i++)
75             {
76               *t = scm_cons (figures_[i]->self_scm (), SCM_EOL);
77               t = SCM_CDRLOC (*t);
78             }
79           figure_ = make_item ("BassFigure", figures_[0]->self_scm ());
80           scm_call_3 (proc, l, context ()->self_scm (),
81                       figure_->self_scm ());
82         }
83     }
84 }
85
86 ADD_TRANSLATOR (Figured_bass_engraver,
87                 /* descr */ "Make figured bass numbers.",
88                 /* creats*/ "BassFigure",
89                 /* accepts */ "rest-event bass-figure-event",
90                 /* acks  */ "",
91                 /* reads */ "bassFigureFormatFunction",
92                 /* write */ "");