]> git.donarmstrong.com Git - lilypond.git/blob - lily/arpeggio-engraver.cc
* flower
[lilypond.git] / lily / arpeggio-engraver.cc
1 /*
2   arpeggio-engraver.cc -- implement Arpeggio_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2000--2005 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "engraver.hh"
10 #include "group-interface.hh"
11 #include "arpeggio.hh"
12 #include "stem.hh"
13 #include "rhythmic-head.hh"
14 #include "side-position-interface.hh"
15 #include "note-column.hh"
16
17 class Arpeggio_engraver : public Engraver
18 {
19 public:
20   TRANSLATOR_DECLARATIONS (Arpeggio_engraver);
21
22 protected:
23   virtual void acknowledge_grob (Grob_info);
24   virtual void process_music ();
25   virtual void stop_translation_timestep ();
26   virtual bool try_music (Music *);
27 private:
28   Item *arpeggio_;
29   Music *arpeggio_req_;
30 };
31
32 Arpeggio_engraver::Arpeggio_engraver ()
33 {
34   arpeggio_ = 0;
35   arpeggio_req_ = 0;
36 }
37
38 bool
39 Arpeggio_engraver::try_music (Music *m)
40 {
41   if (!arpeggio_req_)
42     {
43       arpeggio_req_ = m;
44     }
45   return true;
46 }
47
48 void
49 Arpeggio_engraver::acknowledge_grob (Grob_info info)
50 {
51   if (arpeggio_)
52     {
53       if (Stem::has_interface (info.grob_))
54         {
55           if (!arpeggio_->get_parent (Y_AXIS))
56             arpeggio_->set_parent (info.grob_, Y_AXIS);
57
58           Pointer_group_interface::add_grob (arpeggio_,
59                                              ly_symbol2scm ("stems"),
60                                              info.grob_);
61         }
62
63       /*
64         We can't catch local key items (accidentals) from Voice context,
65         see Local_key_engraver
66       */
67       else if (Rhythmic_head::has_interface (info.grob_))
68         {
69           Side_position_interface::add_support (arpeggio_, info.grob_);
70         }
71       else if (Note_column::has_interface (info.grob_))
72         {
73           info.grob_->set_property ("arpeggio", arpeggio_->self_scm ());
74         }
75     }
76 }
77
78 void
79 Arpeggio_engraver::process_music ()
80 {
81   if (arpeggio_req_)
82     {
83       arpeggio_ = make_item ("Arpeggio", arpeggio_req_->self_scm ());
84     }
85 }
86
87 void
88 Arpeggio_engraver::stop_translation_timestep ()
89 {
90   arpeggio_ = 0;
91   arpeggio_req_ = 0;
92 }
93
94 ADD_TRANSLATOR (Arpeggio_engraver,
95                 /* descr */ "Generate an Arpeggio from a Arpeggio_req",
96                 /* creats*/ "Arpeggio",
97                 /* accepts */ "arpeggio-event",
98                 /* acks  */ "stem-interface rhythmic-head-interface note-column-interface",
99                 /* reads */ "",
100                 /* write */ "");