]> git.donarmstrong.com Git - lilypond.git/blob - lily/rest-engraver.cc
13f8d70a89c646137cc311486d8e96cfa38847bd
[lilypond.git] / lily / rest-engraver.cc
1 /*
2   rest-engraver.cc -- implement Rest_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "engraver.hh"
10
11 #include "dots.hh"
12 #include "duration.hh"
13 #include "item.hh"
14 #include "pitch.hh"
15 #include "rhythmic-head.hh"
16 #include "staff-symbol-referencer.hh"
17 #include "stream-event.hh"
18
19 #include "translator.icc"
20
21 class Rest_engraver : public Engraver
22 {
23   Stream_event *rest_event_;
24   Item *dot_;
25   Grob *rest_;
26 protected:
27   void start_translation_timestep ();
28   void process_music ();
29   DECLARE_TRANSLATOR_LISTENER (rest);
30 public:
31   TRANSLATOR_DECLARATIONS (Rest_engraver);
32 };
33
34 /*
35   Should merge with Note_head_engraver
36 */
37 Rest_engraver::Rest_engraver ()
38 {
39   rest_event_ = 0;
40   rest_ = 0;
41   dot_ = 0;
42 }
43
44 void
45 Rest_engraver::start_translation_timestep ()
46 {
47   rest_event_ = 0;
48   rest_ = 0;
49   dot_ = 0;
50 }
51
52 void
53 Rest_engraver::process_music ()
54 {
55   if (rest_event_ && !rest_)
56     {
57       rest_ = make_item ("Rest", rest_event_->self_scm ());
58       Pitch *p = unsmob_pitch (rest_event_->get_property ("pitch"));
59
60       if (p)
61         {
62           int pos = p->steps ();
63           SCM c0 = get_property ("middleCPosition");
64           if (scm_is_number (c0))
65             pos += scm_to_int (c0);
66
67           rest_->set_property ("staff-position", scm_from_int (pos));
68         }
69     }
70 }
71
72 IMPLEMENT_TRANSLATOR_LISTENER (Rest_engraver, rest);
73 void
74 Rest_engraver::listen_rest (Stream_event *ev)
75 {
76   ASSIGN_EVENT_ONCE (rest_event_, ev);
77 }
78
79 ADD_TRANSLATOR (Rest_engraver,
80                 /* doc */
81                 "Engrave rests.",
82
83                 /* create */
84                 "Rest ",
85
86                 /* read */
87                 "middleCPosition ",
88
89                 /* write */
90                 ""
91                 );