2 slur-engraver.cc -- implement Slur_engraver
4 (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "note-column.hh"
13 #include "engraver.hh"
17 It is possible that a slur starts and ends on the same note. At
18 least, it is for phrasing slurs: a note can be both beginning and
22 class Slur_engraver : public Engraver
24 Drul_array<Music *> events_;
25 Music * running_slur_start_;
31 void set_melisma (bool);
34 virtual bool try_music (Music*);
35 virtual void acknowledge_grob (Grob_info);
36 virtual void stop_translation_timestep ();
37 virtual void finalize ();
38 virtual void process_music ();
41 TRANSLATOR_DECLARATIONS (Slur_engraver);
44 Slur_engraver::Slur_engraver ()
46 events_[START] =events_[STOP] = 0;
47 end_slur_ = slur_ = 0;
48 last_start_ = Moment (-1);
52 Slur_engraver::try_music (Music *m)
54 if (m->is_mus_type ("slur-event"))
57 Let's not start more than one slur per moment.
59 Direction d = to_dir (m->get_property ("span-direction"));
81 Slur_engraver::set_melisma (bool m)
83 context ()->set_property ("slurMelismaBusy", m ? SCM_BOOL_T :SCM_BOOL_F);
87 Slur_engraver::acknowledge_grob (Grob_info info)
90 if (Note_column::has_interface (info.grob_))
93 New_slur::add_column (slur_, e);
95 New_slur::add_column (end_slur_, e);
100 New_slur::add_extra_encompass (slur_, e);
102 New_slur::add_extra_encompass (end_slur_, e);
107 Slur_engraver::finalize ()
110 slur_->warning (_("unterminated slur"));
114 Slur_engraver::process_music ()
122 if (events_[START] && !slur_)
124 Music *ev = events_[START];
125 slur_ = make_spanner ("Slur", events_[START]->self_scm ());
126 if (Direction updown = to_dir (ev->get_property ("direction")))
127 slur_->set_property ("direction", scm_int2num (updown));
134 Slur_engraver::stop_translation_timestep ()
137 events_[START] = events_[STOP] = 0;
140 ENTER_DESCRIPTION (Slur_engraver,
141 /* descr */ "Build slurs grobs from slur events",
143 /* accepts */ "slur-event",
144 /* acks */ "note-column-interface accidental-interface fingering-interface script-interface",
145 /* reads */ "slurMelismaBusy",