2 new-chord-tremolo-engraver.cc -- implement Chord_tremolo_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #include "score-engraver.hh"
12 #include "bar-line.hh"
13 #include "global-context.hh"
14 #include "international.hh"
17 #include "percent-repeat-iterator.hh"
18 #include "repeated-music.hh"
19 #include "score-context.hh"
20 #include "side-position-interface.hh"
24 #include "translator.icc"
26 class Percent_repeat_engraver : public Engraver
30 TRANSLATOR_DECLARATIONS (Percent_repeat_engraver);
35 /// moment (global time) where beam started.
39 /// location within measure where beam started.
40 Moment beam_start_location_;
50 Repeat_sign_type repeat_sign_type_;
52 Item *double_percent_;
53 Item *double_percent_counter_;
56 Spanner *percent_counter_;
57 Spanner *finished_percent_;
58 Spanner *finished_percent_counter_;
63 virtual void finalize ();
64 virtual bool try_music (Music *);
66 void stop_translation_timestep ();
67 void start_translation_timestep ();
68 void process_music ();
71 Percent_repeat_engraver::Percent_repeat_engraver ()
76 finished_percent_ = 0;
77 finished_percent_counter_ = 0;
80 double_percent_counter_ = 0;
88 Percent_repeat_engraver::try_music (Music *m)
90 if (m->is_mus_type ("repeated-music")
91 && m->get_property ("iterator-ctor")
92 == Percent_repeat_iterator::constructor_proc
95 body_length_ = Repeated_music::body_get_length (m);
96 total_count_ = Repeated_music::repeat_count (m);
98 Moment now = now_mom ();
100 stop_mom_ = start_mom_ + Moment (total_count_) * body_length_;
101 next_moment_ = start_mom_;
102 next_moment_ += body_length_;
104 Moment meas_len (robust_scm2moment (get_property ("measureLength"),
107 if (meas_len == body_length_)
108 repeat_sign_type_ = MEASURE;
109 else if (Moment (2) * meas_len == body_length_)
110 repeat_sign_type_ = DOUBLE_MEASURE;
117 Global_context *global = get_global_context ();
118 for (int i = 1; i < total_count_; i++)
120 Moment m = next_moment_ + Moment (i) * body_length_;
121 global->add_moment_to_process (m);
123 /* bars between % too. */
124 if (repeat_sign_type_ == DOUBLE_MEASURE)
125 global->add_moment_to_process (m - meas_len);
128 if (repeat_sign_type_ == DOUBLE_MEASURE)
129 next_moment_ += meas_len;
139 Percent_repeat_engraver::process_music ()
141 if (repeat_ && now_mom ().main_part_ == next_moment_.main_part_)
144 if (repeat_sign_type_ == MEASURE)
146 finished_percent_ = percent_;
147 finished_percent_counter_ = percent_counter_;
150 percent_ = make_spanner ("PercentRepeat", repeat_->self_scm ());
152 Grob *col = unsmob_grob (get_property ("currentCommandColumn"));
153 percent_->set_bound (LEFT, col);
156 && to_boolean (get_property ("countPercentRepeats")))
159 = make_spanner ("PercentRepeatCounter", repeat_->self_scm ());
161 SCM text = scm_number_to_string (scm_from_int (count_),
163 percent_counter_->set_property ("text", text);
164 percent_counter_->set_bound (LEFT, col);
165 Side_position_interface::add_support (percent_counter_,
167 percent_counter_->set_parent (percent_, Y_AXIS);
170 else if (repeat_sign_type_ == DOUBLE_MEASURE)
172 double_percent_ = make_item ("DoublePercentRepeat", repeat_->self_scm ());
175 && to_boolean (get_property ("countPercentRepeats")))
177 double_percent_counter_
178 = make_item ("DoublePercentRepeatCounter",
179 repeat_->self_scm());
181 SCM text = scm_number_to_string (scm_from_int (count_),
183 double_percent_counter_->set_property ("text", text);
185 Side_position_interface::add_support (double_percent_counter_,
187 double_percent_counter_->set_parent (double_percent_, Y_AXIS);
188 double_percent_counter_->set_parent (double_percent_, X_AXIS);
191 /* forbid breaks on a % line. Should forbid all breaks, really. */
192 context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T);
194 next_moment_ = next_moment_ + body_length_;
195 next_moment_.grace_part_ = Rational (0);
200 Percent_repeat_engraver::finalize ()
205 repeat_->origin ()->warning (_ ("unterminated percent repeat"));
206 percent_->suicide ();
207 percent_counter_->suicide();
212 Percent_repeat_engraver::typeset_perc ()
214 if (finished_percent_)
216 Grob *col = unsmob_grob (get_property ("currentCommandColumn"));
218 finished_percent_->set_bound (RIGHT, col);
219 finished_percent_ = 0;
221 if (finished_percent_counter_)
222 finished_percent_counter_->set_bound (RIGHT, col);
224 finished_percent_counter_ = 0;
228 double_percent_counter_ = 0;
232 Percent_repeat_engraver::start_translation_timestep ()
234 if (stop_mom_.main_part_ == now_mom ().main_part_)
238 finished_percent_ = percent_;
239 finished_percent_counter_ = percent_counter_;
246 percent_counter_ = 0;
247 repeat_sign_type_ = UNKNOWN;
252 Percent_repeat_engraver::stop_translation_timestep ()
257 ADD_TRANSLATOR (Percent_repeat_engraver,
259 "Make whole bar and double bar repeats.",
263 "DoublePercentRepeat "
264 "PercentRepeatCounter "
265 "DoublePercentRepeatCounter",
272 "currentCommandColumn "
273 "countPercentRepeats",