2 horizontal-bracket-engraver.cc -- implement
3 Horizontal_bracket_engraver
5 source file of the GNU LilyPond music typesetter
7 (c) 2002--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "engraver.hh"
11 #include "side-position-interface.hh"
12 #include "note-column.hh"
13 #include "group-interface.hh"
15 class Horizontal_bracket_engraver : public Engraver
18 TRANSLATOR_DECLARATIONS (Horizontal_bracket_engraver);
19 Link_array<Spanner> bracket_stack_;
20 Link_array<Music> events_;
24 virtual bool try_music (Music *);
25 virtual void stop_translation_timestep ();
26 virtual void process_music ();
27 virtual void acknowledge_grob (Grob_info);
30 ADD_TRANSLATOR (Horizontal_bracket_engraver,
31 "Create horizontal brackets over notes for musical analysis purposes.",
33 "note-grouping-event",
34 "note-column-interface",
38 Horizontal_bracket_engraver::Horizontal_bracket_engraver ()
45 Horizontal_bracket_engraver::try_music (Music *m)
47 if (m->is_mus_type ("note-grouping-event"))
49 Direction d = to_dir (m->get_property ("span-direction"));
54 if (pop_count_ > bracket_stack_.size ())
55 m->origin ()->warning (_ ("Don't have that many brackets."));
63 if (pop_count_ && push_count_)
64 m->origin ()->warning (_ ("Conflicting note group events."));
72 Horizontal_bracket_engraver::acknowledge_grob (Grob_info gi)
74 if (Note_column::has_interface (gi.grob_))
76 for (int i = 0; i < bracket_stack_.size (); i++)
78 Side_position_interface::add_support (bracket_stack_[i], gi.grob_);
79 Pointer_group_interface::add_grob (bracket_stack_[i],
80 ly_symbol2scm ("columns"), gi.grob_);
81 add_bound_item (bracket_stack_[i],
88 Horizontal_bracket_engraver::process_music ()
90 for (int k = 0; k < push_count_; k++)
92 Spanner *sp = make_spanner ("HorizontalBracket", events_[k]->self_scm ());
94 for (int i = 0; i < bracket_stack_.size (); i++)
97 sp is the smallest, it should be added to the bigger brackets.
99 Side_position_interface::add_support (bracket_stack_[i], sp);
101 bracket_stack_.push (sp);
106 Horizontal_bracket_engraver::stop_translation_timestep ()
108 for (int i = pop_count_; i--;)
110 if (bracket_stack_.size ())
111 bracket_stack_.pop ();