/*
dynamic-reg.cc -- implement Dynamic_register
- source file of the LilyPond music typesetter
+ source file of the GNU LilyPond music typesetter
(c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
-
+#include "debug.hh"
+#include "crescendo.hh"
#include "dynamic-reg.hh"
#include "musical-request.hh"
#include "text-item.hh"
#include "lookup.hh"
#include "paper-def.hh"
+#include "score-column.hh"
+#include "staff-sym.hh"
+#include "note-column.hh"
Dynamic_register::Dynamic_register()
{
dir_i_ =0;
- post_move_processing();
+ do_post_move_processing();
dynamic_p_ =0;
+ to_end_cresc_p_ = cresc_p_ = 0;
+ cresc_req_l_ = 0;
}
void
-Dynamic_register::post_move_processing()
+Dynamic_register::do_post_move_processing()
{
- dynamic_req_l_ = 0;
+ dynamic_req_l_arr_.set_size(0);
}
bool
-Dynamic_register::try_request(Request * r)
+Dynamic_register::do_try_request(Request * r)
{
Musical_req * m = r->musical();
if (!m || !m->dynamic())
return false;
- assert(!dynamic_req_l_);
- dynamic_req_l_ = m->dynamic();
+ dynamic_req_l_arr_.push(m->dynamic());
return true;
}
void
-Dynamic_register::process_requests()
+Dynamic_register::do_process_requests()
{
- if(dynamic_req_l_){
- if (dynamic_req_l_->absdynamic()) {
+ Crescendo* new_cresc_p=0;
+ for (int i=0; i < dynamic_req_l_arr_.size(); i++) {
+ Dynamic_req *dreq_l = dynamic_req_l_arr_[i];
+ if (dreq_l->absdynamic()) {
Text_def * td_p = new Text_def;
td_p->align_i_ = 0;
String loud =Dynamic_req::loudness_str(
- dynamic_req_l_->absdynamic()->loudness_);
+ dreq_l->absdynamic()->loudness_);
td_p->text_str_ = paper()->lookup_l()->dynamic(loud).tex;
-
-
td_p->style_str_ = "dynamic";
-
- dynamic_p_ = new Text_item(td_p, 10 ); // TODO!
- announce_element(Staff_elem_info(dynamic_p_, dynamic_req_l_));
+
+ assert (!dynamic_p_) ; // TODO
+
+ dynamic_p_ = new Text_item(td_p);
+ announce_element(Score_elem_info(dynamic_p_, dreq_l));
+ } else if (dreq_l->span_dynamic()) {
+
+ Span_dynamic_req* span_l = dreq_l->span_dynamic();
+ if (span_l->spantype == Span_req::STOP) {
+ if (!cresc_p_) {
+ span_l->warning("Can't find cresc to end " );
+ } else {
+ assert(!to_end_cresc_p_);
+ to_end_cresc_p_ =cresc_p_;
+ cresc_p_ = 0;
+ }
+ } else if (span_l->spantype == Span_req::START) {
+ cresc_req_l_ = span_l;
+ assert(!new_cresc_p);
+ new_cresc_p = new Crescendo;
+ new_cresc_p->grow_dir_i_ = span_l->dynamic_dir_i_;
+ announce_element(Score_elem_info(new_cresc_p, span_l));
+ }
+ }
+ }
+
+ if ( new_cresc_p ) {
+ cresc_p_ = new_cresc_p;
+ cresc_p_->left_col_l_ = get_staff_info().musical_l()->pcol_l_;
+ if (dynamic_p_) {
+ cresc_p_->left_dyn_b_ = true;
}
}
}
void
-Dynamic_register::pre_move_processing()
+Dynamic_register::do_pre_move_processing()
{
+ Staff_symbol* s_l = get_staff_info().staff_sym_l_;
if (dynamic_p_) {
+ dynamic_p_->set_staffsym(s_l);
typeset_element(dynamic_p_);
dynamic_p_ = 0;
}
+ if ( to_end_cresc_p_) {
+ if (dynamic_p_)
+ to_end_cresc_p_->right_dyn_b_=true;
+
+ to_end_cresc_p_->right_col_l_ = get_staff_info().musical_l()->pcol_l_;
+ to_end_cresc_p_->set_staffsym(s_l);
+ typeset_element(to_end_cresc_p_);
+ to_end_cresc_p_ = 0;
+ }
}
-bool
-Dynamic_register::acceptable_request_b(Request*r)const
+void
+Dynamic_register::set_feature(Feature i)
{
- Musical_req * m = r->musical();
- return (m && m->dynamic());
+ if (i.type_ == "vdir")
+ dir_i_ = i.value_;
}
+IMPLEMENT_STATIC_NAME(Dynamic_register);
+IMPLEMENT_IS_TYPE_B1(Dynamic_register,Request_register);
+ADD_THIS_REGISTER(Dynamic_register);
+
+Dynamic_register::~Dynamic_register()
+{
+ delete dynamic_p_;
+ delete to_end_cresc_p_;
+ if (cresc_p_) {
+ cresc_req_l_->warning("unended crescendo");
+ }
+ delete cresc_p_;
+}
void
-Dynamic_register::set_feature(Features i)
+Dynamic_register::acknowledge_element(Score_elem_info i)
{
- dir_i_ = i.direction_i_;
+ if (i.elem_l_->name() == Note_column::static_name()) {
+ if (dynamic_p_) dynamic_p_->add_support(i.elem_l_);
+ if (to_end_cresc_p_)
+ to_end_cresc_p_->add_support(i.elem_l_);
+ if (cresc_p_)
+ cresc_p_->add_support(i.elem_l_);
+ }
}
-
-IMPLEMENT_STATIC_NAME(Dynamic_register);