2 tuplet-engraver.cc -- implement Tuplet_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "tuplet-bracket.hh"
11 #include "note-column.hh"
13 #include "engraver.hh"
16 struct Tuplet_description
29 class Tuplet_engraver : public Engraver
32 TRANSLATOR_DECLARATIONS (Tuplet_engraver);
35 Array<Tuplet_description> tuplets_;
37 virtual void acknowledge_grob (Grob_info);
38 virtual bool try_music (Music*r);
39 virtual void start_translation_timestep ();
40 virtual void process_music ();
44 Tuplet_engraver::try_music (Music *music)
46 if (music->is_mus_type ("time-scaled-music"))
48 Music *el = unsmob_music (music->get_property ("element"));
49 if (el && !el->is_mus_type ("event-chord"))
53 d.stop_ = now_mom ().main_part_ + music->get_length ().main_part_;
54 d.span_stop_ = d.stop_;
56 SCM s = get_property ("tupletSpannerDuration");
57 if (unsmob_moment (s))
58 d.span_stop_ = d.span_stop_ <? (now_mom () + *unsmob_moment (s)).main_part_;
68 Tuplet_engraver::process_music ()
70 for (int i = 0; i < tuplets_.size (); i++)
72 if (tuplets_[i].spanner_)
75 Spanner* spanner = make_spanner ("TupletBracket",
76 tuplets_[i].music_->self_scm ());
77 tuplets_[i].spanner_ = spanner;
79 SCM proc = get_property ("tupletNumberFormatFunction");
80 if (ly_c_procedure_p (proc))
82 SCM t = scm_apply_0 (proc, scm_list_1 (tuplets_[i].music_->self_scm ()));
83 spanner->set_property ("text", t);
89 Tuplet_engraver::acknowledge_grob (Grob_info i)
91 if (Note_column::has_interface (i.grob_))
93 for (int j = 0; j < tuplets_.size (); j++)
94 if (tuplets_[j].spanner_)
95 Tuplet_bracket::add_column (tuplets_[j].spanner_,
96 dynamic_cast<Item*> (i.grob_));
101 Tuplet_engraver::start_translation_timestep ()
103 Moment now = now_mom ();
106 SCM s = get_property ("tupletSpannerDuration");
107 if (unsmob_moment (s))
108 tsd = unsmob_moment (s)->main_part_;
110 for (int i = tuplets_.size (); i--;)
112 if (now.main_part_ >= tuplets_[i].span_stop_)
114 if (Spanner *sp = tuplets_[i].spanner_)
116 if (!sp->get_bound (RIGHT))
117 sp->set_bound (RIGHT, sp->get_bound (LEFT));
119 tuplets_[i].spanner_ = 0;
123 tuplets_[i].span_stop_ += tsd.main_part_;
126 if (now.main_part_ >= tuplets_[i].stop_)
133 Tuplet_engraver::Tuplet_engraver ()
137 ADD_TRANSLATOR (Tuplet_engraver,
138 /* descr */ "Catch Time_scaled_music and generate appropriate bracket ",
139 /* creats*/ "TupletBracket",
140 /* accepts */ "time-scaled-music",
141 /* acks */ "note-column-interface",
142 /* reads */ "tupletNumberFormatFunction tupletSpannerDuration",