2 horizontal-bracket-engraver.cc -- implement
3 Horizontal_bracket_engraver
5 source file of the GNU LilyPond music typesetter
7 (c) 2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
11 #include "engraver.hh"
12 #include "side-position-interface.hh"
13 #include "note-column.hh"
14 #include "group-interface.hh"
16 class Horizontal_bracket_engraver : public Engraver
19 TRANSLATOR_DECLARATIONS(Horizontal_bracket_engraver);
20 Link_array<Spanner> bracket_stack_;
21 Link_array<Music> events_;
25 virtual bool try_music(Music*);
26 virtual void start_translation_timestep ();
27 virtual void stop_translation_timestep ();
28 virtual void process_music ();
29 virtual void acknowledge_grob (Grob_info);
32 ENTER_DESCRIPTION(Horizontal_bracket_engraver,
33 "Create horizontal brackets over notes for musical analysis purposes.",
35 "note-grouping-event",
36 "note-column-interface",
40 Horizontal_bracket_engraver::Horizontal_bracket_engraver()
47 Horizontal_bracket_engraver::start_translation_timestep()
54 Horizontal_bracket_engraver::try_music (Music *m)
56 if (m->is_mus_type ("note-grouping-event"))
58 Direction d = to_dir (m->get_mus_property ("span-direction"));
63 if (pop_count_ > bracket_stack_.size())
64 m->origin()->warning (_("Don't have that many brackets."));
72 if (pop_count_ && push_count_)
73 m->origin()->warning (_("Conflicting note group events."));
81 Horizontal_bracket_engraver::acknowledge_grob (Grob_info gi)
83 if (Note_column::has_interface (gi.grob_))
85 for (int i = 0; i < bracket_stack_.size(); i++)
87 Side_position_interface::add_support (bracket_stack_[i], gi.grob_);
88 Pointer_group_interface::add_grob (bracket_stack_[i],
89 ly_symbol2scm ("columns"), gi.grob_);
90 add_bound_item (bracket_stack_[i],
97 Horizontal_bracket_engraver::process_music ()
99 for (int k = 0; k < push_count_; k++)
101 Spanner * sp = new Spanner (get_property ("HorizontalBracket"));
103 announce_grob (sp, events_[k]->self_scm());
104 for (int i = 0; i < bracket_stack_.size(); i++)
107 sp is the smallest, it should be added to the bigger brackets.
109 Side_position_interface::add_support (bracket_stack_[i], sp);
111 bracket_stack_.push (sp);
117 Horizontal_bracket_engraver::stop_translation_timestep ()
119 for (int i = pop_count_; i--;)
121 if (bracket_stack_.size())
122 typeset_grob (bracket_stack_.pop());