2 cbeam-engraver.cc -- implement Command_beam_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "cbeam-engraver.hh"
11 #include "musical-request.hh"
13 #include "grouping.hh"
16 #include "time-description.hh"
18 Command_beam_engraver::Command_beam_engraver ()
22 finished_grouping_p_
= 0;
24 reqs_drul_
[LEFT
] = reqs_drul_
[RIGHT
] =0;
28 Command_beam_engraver::do_try_music (Music
*m
)
30 if (Beam_req
* c
= dynamic_cast<Beam_req
*>(m
))
32 reqs_drul_
[c
->spantype_
] = c
;
40 Command_beam_engraver::do_process_requests ()
45 reqs_drul_
[STOP
]->warning (_("No beam to stop"));
46 finished_beam_p_
= beam_p_
;
47 finished_grouping_p_
= grouping_p_
;
53 if (reqs_drul_
[START
])
56 grouping_p_
= new Rhythmic_grouping
;
58 Scalar prop
= get_property ("beamslopedamping");
60 beam_p_
->damping_i_
= prop
;
62 prop
= get_property ("beamquantisation");
64 beam_p_
->quantisation_
= (Beam::Quantisation
)(int)prop
;
66 announce_element (Score_element_info (beam_p_
, reqs_drul_
[START
]));
71 Command_beam_engraver::typeset_beam ()
75 Rhythmic_grouping
const * rg_C
= get_staff_info().rhythmic_C_
;
76 rg_C
->extend (finished_grouping_p_
->interval());
77 finished_beam_p_
->set_grouping (*rg_C
, *finished_grouping_p_
);
78 typeset_element (finished_beam_p_
);
81 delete finished_grouping_p_
;
82 finished_grouping_p_
= 0;
89 Command_beam_engraver::do_post_move_processing ()
91 reqs_drul_
[START
] =0;
95 Command_beam_engraver::do_pre_move_processing ()
101 Command_beam_engraver::do_removal_processing ()
104 finished_beam_p_
= beam_p_
;
105 finished_grouping_p_
= grouping_p_
;
110 Command_beam_engraver::acknowledge_element (Score_element_info info
)
114 Stem
* stem_l
= dynamic_cast<Stem
*> (info
.elem_l_
);
119 Rhythmic_req
*rhythmic_req
= dynamic_cast <Rhythmic_req
*> (info
.req_l_
);
122 String s
=_("Stem must have Rhythmic structure.");
124 info
.req_l_
->warning(s
);
132 if (rhythmic_req
->duration_
.durlog_i_
<= 2)
134 rhythmic_req
->warning (_ ("stem doesn't fit in beam"));
139 TODO: do something sensible if it doesn't fit in the beam.
141 Moment start
= get_staff_info().time_C_
->whole_in_measure_
;
143 if (!grouping_p_
->child_fit_b (start
))
145 String
s (_("please fix me") + ": "
146 + _f ("stem at %s doesn't fit in beam", now_moment ().str ()));
149 info
.req_l_
->warning(s
);
155 grouping_p_
->add_child (start
, rhythmic_req
->duration ());
156 stem_l
->flag_i_
= rhythmic_req
->duration_
.durlog_i_
;
157 beam_p_
->add_stem (stem_l
);
164 ADD_THIS_TRANSLATOR(Command_beam_engraver
);