2 beam-engraver.cc -- implement Beam_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "engraver-group-engraver.hh"
10 #include "beam-engraver.hh"
11 #include "musical-request.hh"
16 #include "score-engraver.hh"
18 Beam_engraver::Beam_engraver ()
22 finished_beam_info_p_=0;
24 reqs_drul_[LEFT] = reqs_drul_[RIGHT] =0;
29 Beam_engraver::do_try_music (Music *m)
31 if (Span_req * c = dynamic_cast<Span_req*>(m))
33 if (c->span_type_str_ != "beam")
36 Direction d =c->span_dir_;
38 if (d == STOP && !beam_p_)
40 m->warning (_ ("can't find start of beam"));
51 Beam_engraver::do_process_music ()
56 reqs_drul_[STOP]->warning (_("can't find start of beam"));
58 finished_beam_p_ = beam_p_;
59 finished_beam_info_p_ = beam_info_p_;
68 Score_engraver * e = 0;
69 Translator * t = daddy_grav_l ();
70 for (; !e && t; t = t->daddy_trans_l_)
72 e = dynamic_cast<Score_engraver*> (t);
76 programming_error ("No score engraver!");
81 if (reqs_drul_[START])
85 reqs_drul_[START]->warning (_ ("already have a beam"));
89 prev_start_req_ = reqs_drul_[START];
92 SCM smp = get_property ("measurePosition");
93 Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0);
95 beam_start_location_ = mp;
96 beam_start_mom_ = now_mom();
97 beam_info_p_ = new Beaming_info_list;
100 /* urg, must copy to Auto_beam_engraver too */
102 announce_element (Score_element_info (beam_p_, reqs_drul_[START]));
107 Beam_engraver::typeset_beam ()
109 if (finished_beam_p_)
111 finished_beam_info_p_->beamify ();
113 finished_beam_p_->set_beaming (finished_beam_info_p_);
114 typeset_element (finished_beam_p_);
115 delete finished_beam_info_p_;
116 finished_beam_info_p_ =0;
117 finished_beam_p_ = 0;
119 reqs_drul_[STOP] = 0;
124 Beam_engraver::do_post_move_processing ()
126 reqs_drul_ [START] =0;
130 Beam_engraver::do_pre_move_processing ()
136 Beam_engraver::do_removal_processing ()
141 prev_start_req_->warning (_ ("unterminated beam"));
142 finished_beam_p_ = beam_p_;
143 finished_beam_info_p_ = beam_info_p_;
149 Beam_engraver::acknowledge_element (Score_element_info info)
153 Stem* stem_l = dynamic_cast<Stem *> (info.elem_l_);
154 if (!stem_l || stem_l->beam_l ())
158 bool stem_grace = stem_l->get_elt_property ("grace") == SCM_BOOL_T;
160 SCM wg =get_property ("weAreGraceContext");
161 bool wgb= to_boolean (wg);
163 if (wgb!= stem_grace)
166 Rhythmic_req *rhythmic_req = dynamic_cast <Rhythmic_req *> (info.req_l_);
169 String s = _ ("stem must have Rhythmic structure");
171 info.req_l_->warning (s);
178 if (rhythmic_req->duration_.durlog_i_<= 2)
180 rhythmic_req->warning (_ ("stem doesn't fit in beam"));
181 prev_start_req_->warning (_ ("beam was started here"));
185 [r4 c8] can just as well be modern notation.
189 stem_l->set_elt_property ("duration-log",
190 gh_int2scm (rhythmic_req->duration_.durlog_i_));
191 Moment stem_location = now_mom () - beam_start_mom_ + beam_start_location_;
192 beam_info_p_->add_stem (stem_location,
193 (rhythmic_req->duration_.durlog_i_ - 2) >? 1);
194 beam_p_->add_stem (stem_l);
200 ADD_THIS_TRANSLATOR(Beam_engraver);