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>
9 #include "tuplet-bracket.hh"
10 #include "note-column.hh"
12 #include "engraver.hh"
15 struct Tuplet_description
28 class Tuplet_engraver : public Engraver
31 TRANSLATOR_DECLARATIONS (Tuplet_engraver);
34 Array<Tuplet_description> tuplets_;
36 virtual void acknowledge_grob (Grob_info);
37 virtual bool try_music (Music *r);
38 virtual void start_translation_timestep ();
39 virtual void process_music ();
43 Tuplet_engraver::try_music (Music *music)
45 if (music->is_mus_type ("time-scaled-music"))
47 Music *el = unsmob_music (music->get_property ("element"));
48 if (el && !el->is_mus_type ("event-chord"))
52 d.stop_ = now_mom ().main_part_ + music->get_length ().main_part_;
53 d.span_stop_ = d.stop_;
55 SCM s = get_property ("tupletSpannerDuration");
56 if (unsmob_moment (s))
57 d.span_stop_ = min (d.span_stop_, (now_mom () + *unsmob_moment (s)).main_part_);
67 Tuplet_engraver::process_music ()
69 for (int i = 0; i < tuplets_.size (); i++)
71 if (tuplets_[i].spanner_)
74 Spanner *spanner = make_spanner ("TupletBracket",
75 tuplets_[i].music_->self_scm ());
76 tuplets_[i].spanner_ = spanner;
78 SCM proc = get_property ("tupletNumberFormatFunction");
79 if (ly_c_procedure_p (proc))
81 SCM t = scm_apply_0 (proc, scm_list_1 (tuplets_[i].music_->self_scm ()));
82 spanner->set_property ("text", t);
88 Tuplet_engraver::acknowledge_grob (Grob_info i)
90 if (Note_column::has_interface (i.grob_))
92 for (int j = 0; j < tuplets_.size (); j++)
93 if (tuplets_[j].spanner_)
94 Tuplet_bracket::add_column (tuplets_[j].spanner_,
95 dynamic_cast<Item *> (i.grob_));
100 Tuplet_engraver::start_translation_timestep ()
102 Moment now = now_mom ();
105 SCM s = get_property ("tupletSpannerDuration");
106 if (unsmob_moment (s))
107 tsd = unsmob_moment (s)->main_part_;
109 for (int i = tuplets_.size (); i--;)
111 if (now.main_part_ >= tuplets_[i].span_stop_)
113 if (Spanner *sp = tuplets_[i].spanner_)
115 if (!sp->get_bound (RIGHT))
116 sp->set_bound (RIGHT, sp->get_bound (LEFT));
118 tuplets_[i].spanner_ = 0;
122 tuplets_[i].span_stop_ += tsd.main_part_;
125 if (now.main_part_ >= tuplets_[i].stop_)
132 Tuplet_engraver::Tuplet_engraver ()
136 ADD_TRANSLATOR (Tuplet_engraver,
137 /* descr */ "Catch Time_scaled_music and generate appropriate bracket ",
138 /* creats*/ "TupletBracket",
139 /* accepts */ "time-scaled-music",
140 /* acks */ "note-column-interface",
141 /* reads */ "tupletNumberFormatFunction tupletSpannerDuration",