X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftie.cc;h=5aa2d11446b627b306e170b4a596231ffe709f0c;hb=f3467e6b78be6d8497cf4d0a43ffd01656a33300;hp=eff99f4600a175ecf349c880e06402010d9c8308;hpb=56126108b2610f82bc7cafaac8741d1aeba1d34f;p=lilypond.git diff --git a/lily/tie.cc b/lily/tie.cc index eff99f4600..5aa2d11446 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -1,63 +1,173 @@ /* tie.cc -- implement Tie - source file of the LilyPond music typesetter + source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ +#include "paper-def.hh" #include "tie.hh" -#include "notehead.hh" +#include "note-head.hh" #include "p-col.hh" +#include "debug.hh" + -Spanner* -Tie::do_break_at(PCol*l, PCol*r) const -{ - Tie * tie_p = new Tie; - Line_of_score const *line_C=l->line_l_; - if (left_head_l_->line_l()== line_C) - tie_p->left_head_l_ = left_head_l_; - if (right_head_l_->line_l() == line_C) - tie_p->right_head_l_ = right_head_l_; - - return tie_p; -} void -Tie::set_head(int x_pos, Notehead * head_l) -{ - if (x_pos >0) { - assert(!right_head_l_); - right_head_l_ = head_l; - } else { - assert(!left_head_l_); - left_head_l_ = head_l; - } - add_dependency(head_l); +Tie::set_head (Direction d, Note_head * head_l) +{ + assert (!head_l_drul_[d]); + head_l_drul_[d] = head_l; + set_bounds (d, head_l); + + add_dependency (head_l); } Tie::Tie() { - right_head_l_ =0; - left_head_l_ =0; + head_l_drul_[RIGHT] =0; + head_l_drul_[LEFT] =0; + same_pitch_b_ =false; +} + + +/* + ugh: direction of the Tie is more complicated. See [Ross] p136 and further + */ +void +Tie::set_default_dir() +{ + int m= (head_l_drul_[LEFT]->position_i_ + + head_l_drul_[RIGHT]->position_i_) /2; + dir_ = (m < 0)? DOWN : UP; } void Tie::do_add_processing() { - assert(left_head_l_ && right_head_l_); - left_col_l_ = left_head_l_ -> pcol_l_; - right_col_l_ = right_head_l_ -> pcol_l_; + if (!(head_l_drul_[LEFT] && head_l_drul_[RIGHT])) + warning (_ ("lonely tie")); + + Direction d = LEFT; + Drul_array new_head_drul = head_l_drul_; + do { + if (!head_l_drul_[d]) + new_head_drul[d] = head_l_drul_[(Direction)-d]; + } while (flip(&d) != LEFT); + head_l_drul_ = new_head_drul; } void Tie::do_post_processing() { - assert(left_head_l_ || right_head_l_); - left_pos_i_ = (left_head_l_)? - left_head_l_->position_i_ : right_head_l_->position_i_; - right_pos_i_ = (right_head_l_) ? - right_head_l_->position_i_ : left_head_l_->position_i_; + // URG: share code with slur! + assert (head_l_drul_[LEFT] || head_l_drul_[RIGHT]); + + // URG + Real notewidth = paper ()->note_width () * 0.8; + Real interline_f = paper ()->interline_f (); + + /* + [OSU]: slur and tie placement + + ties: + * x = inner raakpunt - d * gap + + * y = length < 5ss : horizontal raakpunt + y = length >= 5ss : y next interline - d * 0.25 ss + --> height <= 5 length ?? we use <= 3 length, now... + */ + + Real gap_f = paper ()->get_var ("slur_x_gap"); + + Direction d = LEFT; + do + { + dy_f_drul_[d] = .5 * interline_f * (head_l_drul_[d] + ? head_l_drul_[d]->position_i_ + : head_l_drul_[(Direction)-d]->position_i_); + } + while (flip(&d) != LEFT); + + do + { + // tie attached to outer notehead + if (head_l_drul_[d] && head_l_drul_[d]->extremal_i_) + { + if (d == LEFT) + dx_f_drul_[d] += notewidth; + dx_f_drul_[d] += -d * gap_f; + /* attach to outer 3/4 end of head */ + dy_f_drul_[d] += dir_ * 0.25 * interline_f; + } + // tie attached to inner notehead + else if (head_l_drul_[d] && d == LEFT) + { + dx_f_drul_[d] += -d * notewidth; + } + // uhm? loose end of tie // tie attached to stem + else + { + dx_f_drul_[d] = -d * (spanned_drul_[d]->extent (X_AXIS).length () + -0.5 * notewidth); + } + } + while (flip(&d) != LEFT); + + // now that both are set, do dependent + do + { + // tie attached to outer notehead + if (!head_l_drul_[d]) + { + dy_f_drul_[d] = dy_f_drul_[(Direction) -d]; + } + } + while (flip(&d) != LEFT); + + /* + Avoid too steep ties + * slur from notehead to stemend: c''()b'' + */ + Real damp_f = paper ()->get_var ("tie_slope_damping"); + Offset d_off = Offset (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT], + dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]); + d_off.x () += extent (X_AXIS).length (); + + Real ratio_f = abs (d_off.y () / d_off.x ()); + if (ratio_f > damp_f) + dy_f_drul_[(Direction)(- dir_ * sign (d_off.y ()))] += + dir_ * (ratio_f - damp_f) * d_off.x (); +} + +void +Tie::do_substitute_element_pointer (Score_element*o, Score_element*n) +{ + Note_head *new_l =n?dynamic_cast (n):0; + if (dynamic_cast (o) == head_l_drul_[LEFT]) + head_l_drul_[LEFT] = new_l; + else if (dynamic_cast (o) == head_l_drul_[RIGHT]) + head_l_drul_[RIGHT] = new_l; } +#if 0 +Interval +Tie::do_width () const +{ + Real min_f = + Interval width_int = Bow::do_width (); + return width_int.length () < min_f ? Interval (0, min_f) : width_int; +} +#endif +Array +Tie::get_rods () const +{ + Array a; + Rod r; + r.item_l_drul_ = spanned_drul_; + r.distance_f_ = paper ()->get_var ("tie_x_minimum"); + a.push (r); + return a; +}