]> git.donarmstrong.com Git - lilypond.git/blob - lily/glissando-engraver.cc
Merge with master
[lilypond.git] / lily / glissando-engraver.cc
1 /*
2   note-head-line-engraver.cc -- implement Note_head_line_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2000--2007 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "engraver.hh"
10
11 #include "international.hh"
12 #include "rhythmic-head.hh"
13 #include "spanner.hh"
14 #include "stream-event.hh"
15 #include "warn.hh"
16 #include "item.hh"
17
18 #include "translator.icc"
19
20 /**
21    Create line-spanner grobs for glissandi lines that connect note
22    heads.
23 */
24 class Glissando_engraver : public Engraver
25 {
26 public:
27   TRANSLATOR_DECLARATIONS (Glissando_engraver);
28
29 protected:
30   DECLARE_TRANSLATOR_LISTENER (glissando);
31   DECLARE_ACKNOWLEDGER (rhythmic_head);
32   virtual void finalize ();
33
34   void stop_translation_timestep ();
35   void process_music ();
36 private:
37   Spanner *line_;
38   Spanner *last_line_;
39   Stream_event *event_;
40 };
41
42 Glissando_engraver::Glissando_engraver ()
43 {
44   last_line_ = line_ = 0;
45   event_ = 0;
46 }
47
48 IMPLEMENT_TRANSLATOR_LISTENER (Glissando_engraver, glissando);
49 void
50 Glissando_engraver::listen_glissando (Stream_event *ev)
51 {
52   ASSIGN_EVENT_ONCE (event_, ev);
53 }
54
55 void
56 Glissando_engraver::process_music ()
57 {
58   if (event_)
59     line_ = make_spanner ("Glissando", event_->self_scm ());
60 }
61
62 void
63 Glissando_engraver::acknowledge_rhythmic_head (Grob_info info)
64 {
65   Grob *g = info.grob ();
66   if (line_)
67     line_->set_bound (LEFT, g);
68
69   if (last_line_)
70     {
71       last_line_->set_bound (RIGHT, g);
72       announce_end_grob (last_line_, g->self_scm ());
73     }      
74 }
75
76 void
77 Glissando_engraver::stop_translation_timestep ()
78 {
79   if (last_line_ && last_line_->get_bound (RIGHT))
80     {
81       last_line_ = 0;
82     }
83   if (line_)
84     {
85       if (last_line_)
86         programming_error ("overwriting glissando");
87       last_line_ = line_;
88     }
89   line_ = 0;
90   event_ = 0;
91 }
92
93 void
94 Glissando_engraver::finalize ()
95 {
96   if (line_)
97     {
98       string msg = _ ("unterminated glissando");
99
100       if (event_)
101         event_->origin ()->warning (msg);
102       else
103         warning (msg);
104
105       line_->suicide ();
106       line_ = 0;
107     }
108 }
109
110 ADD_ACKNOWLEDGER (Glissando_engraver, rhythmic_head);
111 ADD_TRANSLATOR (Glissando_engraver,
112                 /* doc */ "Engrave a glissandi",
113                 /* create */ "Glissando",
114                 /* read */ "followVoice",
115                 /* write */ "");