From 5922935352b05afc92bf2f8dbbd9ed63203512f3 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 1 May 2006 14:57:03 +0000 Subject: [PATCH] (class Tie_configuration): add column_ranks_ to specification and configuration, to distinguish between ties for different heads in arpegiated chords. --- ChangeLog | 4 ++ lily/include/tie-configuration.hh | 4 +- lily/include/tie-formatting-problem.hh | 38 ++++++++++++- lily/tie-configuration.cc | 1 + lily/tie-formatting-problem.cc | 76 +++++++++++++++++++------- 5 files changed, 99 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 598c548caa..ba69b42e8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2006-05-01 Han-Wen Nienhuys + * lily/include/tie-configuration.hh (class Tie_configuration): add + column_ranks_ to specification and configuration, to distinguish + between ties for different heads in arpegiated chords. + * lily/relocate.cc (framework_relocation): use INSTALLER_PREFIX. * *.py: more 4 space indents. diff --git a/lily/include/tie-configuration.hh b/lily/include/tie-configuration.hh index 1e48922d68..0594de6eaf 100644 --- a/lily/include/tie-configuration.hh +++ b/lily/include/tie-configuration.hh @@ -25,6 +25,7 @@ class Tie_configuration Real score_; bool scored_; friend class Tie_formatting_problem; + public: Real score () const { return score_; } string card () const { return score_card_; } @@ -32,7 +33,8 @@ public: int position_; Direction dir_; Real delta_y_; - + Drul_array column_ranks_; + /* computed. */ Interval attachment_x_; diff --git a/lily/include/tie-formatting-problem.hh b/lily/include/tie-formatting-problem.hh index befb430c5d..fd7a373b52 100644 --- a/lily/include/tie-formatting-problem.hh +++ b/lily/include/tie-formatting-problem.hh @@ -20,12 +20,41 @@ #include #include -typedef map< pair, Tie_configuration *> Tie_configuration_map; +template +struct Tuple +{ + T t_array[N]; + Tuple (T const *src) + { + for (int i = 0; i < N; i++) + t_array[i] = src[i]; + } +}; + +template +inline bool +operator<(Tuple const &t1, + Tuple const &t2) +{ + for (int i = 0; i < N ; i++) + { + if (t1.t_array[i] > t2.t_array[i]) + return false; + if (t1.t_array[i] < t2.t_array[i]) + return true; + } + + return false; +} + + +typedef map< Tuple, Tie_configuration *> Tie_configuration_map; struct Tie_specification { int position_; Drul_array note_head_drul_; + Drul_array column_ranks_; bool has_manual_position_; bool has_manual_dir_; @@ -34,6 +63,7 @@ struct Tie_specification Direction manual_dir_; Tie_specification (); + int column_span () const; }; struct Tie_configuration_variation @@ -57,8 +87,8 @@ class Tie_formatting_problem Grob *x_refpoint_; - Tie_configuration *get_configuration (int position, Direction dir) const; - Tie_configuration *generate_configuration (int position, Direction dir) const; + Tie_configuration *get_configuration (int position, Direction dir, Drul_array cols) const; + Tie_configuration *generate_configuration (int position, Direction dir, Drul_array cols) const; vector generate_collision_variations (Ties_configuration const &ties) const; vector generate_extremal_tie_variations (Ties_configuration const &ties) const; @@ -77,6 +107,7 @@ class Tie_formatting_problem public: Tie_details details_; void print_ties_configuration (Ties_configuration const *); + public: Tie_formatting_problem (); ~Tie_formatting_problem (); @@ -85,6 +116,7 @@ public: Ties_configuration generate_optimal_chord_configuration (); Ties_configuration generate_ties_configuration (Ties_configuration const &); Tie_configuration find_optimal_tie_configuration (Tie_specification const &) const; + void from_ties (vector const &ties); void from_tie (Grob *tie); void from_semi_ties (vector const &, Direction head_dir); diff --git a/lily/tie-configuration.cc b/lily/tie-configuration.cc index c8f9da20de..438d22e2c7 100644 --- a/lily/tie-configuration.cc +++ b/lily/tie-configuration.cc @@ -29,6 +29,7 @@ Tie_configuration::Tie_configuration () delta_y_ = 0.0; score_ = 0.0; scored_ = false; + column_ranks_ = Drul_array (0, 0); } diff --git a/lily/tie-formatting-problem.cc b/lily/tie-formatting-problem.cc index 439e76cf50..aca4338730 100644 --- a/lily/tie-formatting-problem.cc +++ b/lily/tie-formatting-problem.cc @@ -9,6 +9,7 @@ #include "tie-formatting-problem.hh" +#include "paper-column.hh" #include "bezier.hh" #include "directional-element-interface.hh" #include "item.hh" @@ -252,9 +253,10 @@ Tie_formatting_problem::from_ties (vector const &ties) do { spec.note_head_drul_[d] = Tie::head (ties[i], d); + spec.column_ranks_[d] = + dynamic_cast (ties[i])->get_bound (d)->get_column ()->get_rank (); } while (flip (&d) != LEFT); - specifications_.push_back (spec); } } @@ -317,32 +319,41 @@ Tie_formatting_problem::get_tie_specification (int i) const } +/* + Return configuration, create it if necessary. +*/ Tie_configuration* -Tie_formatting_problem::get_configuration (int pos, Direction dir) const +Tie_formatting_problem::get_configuration (int pos, Direction dir, Drul_array columns) const { - pair key (pos, dir); + int key_components[] = { + pos, dir, columns[LEFT], columns[RIGHT] + }; + Tuple key (key_components); + Tie_configuration_map::const_iterator f = possibilities_.find (key); - if (f != possibilities_.end ()) { return (*f).second; } - Tie_configuration *conf = generate_configuration (pos, dir); + Tie_configuration *conf = generate_configuration (pos, dir, columns); ((Tie_formatting_problem*) this)->possibilities_[key] = conf; return conf; } Tie_configuration* -Tie_formatting_problem::generate_configuration (int pos, Direction dir) const +Tie_formatting_problem::generate_configuration (int pos, Direction dir, + Drul_array columns) const { Tie_configuration *conf = new Tie_configuration; conf->position_ = pos; conf->dir_ = dir; + + conf->column_ranks_ = columns; + Real y = conf->position_ * 0.5 * details_.staff_space_; - bool y_tune = true; if (dot_positions_.find (pos) != dot_positions_.end ()) { @@ -571,7 +582,8 @@ Tie_formatting_problem::find_optimal_tie_configuration (Tie_specification const for (int i = 0; i < details_.single_tie_region_size_; i ++) { - confs.push_back (generate_configuration (pos + i * dir, dir)); + confs.push_back (generate_configuration (pos + i * dir, dir, + spec.column_ranks_)); if (spec.has_manual_position_) { @@ -616,8 +628,15 @@ Tie_specification::Tie_specification () manual_dir_ = CENTER; note_head_drul_[LEFT] = note_head_drul_[RIGHT] = 0; + column_ranks_[RIGHT] = + column_ranks_[LEFT] = 0; } +int +Tie_specification::column_span () const +{ + return column_ranks_[RIGHT] - column_ranks_[LEFT]; +} void Tie_formatting_problem::score_ties_aptitude (Ties_configuration *ties) const @@ -709,7 +728,8 @@ Tie_formatting_problem::generate_ties_configuration (Ties_configuration const &t Ties_configuration copy; for (vsize i = 0; i < ties_config.size (); i++) { - Tie_configuration * ptr = get_configuration (ties_config[i].position_, ties_config[i].dir_); + Tie_configuration * ptr = get_configuration (ties_config[i].position_, ties_config[i].dir_, + ties_config[i].column_ranks_); if (specifications_[i].has_manual_position_) { ptr->delta_y_ @@ -814,10 +834,19 @@ Tie_formatting_problem::set_ties_config_standard_directions (Ties_configuration */ for (vsize i = 1; i < tie_configs->size (); i++) { - Real diff = (tie_configs->at (i-1).position_ - - tie_configs->at (i).position_); - - if (fabs (diff) <= 1) + Real diff = (tie_configs->at (i).position_ + -tie_configs->at (i-1).position_); + + Real span_diff + = specifications_[i].column_span () - specifications_[i-1].column_span (); + if (span_diff && fabs (diff) <= 2) + { + if (span_diff > 0) + tie_configs->at (i).dir_ = UP; + else if (span_diff < 0) + tie_configs->at (i-1).dir_ = DOWN; + } + else if (fabs (diff) <= 1) { if (!tie_configs->at (i-1).dir_) tie_configs->at (i-1).dir_ = DOWN; @@ -861,7 +890,8 @@ Tie_formatting_problem::generate_extremal_tie_variations (Ties_configuration con Tie_configuration_variation var; var.index_ = (d == DOWN) ? 0 : ties.size () - 1; var.suggestion_ = get_configuration (boundary (ties, d, 0).position_ - + d * i, d); + + d * i, d, + boundary (ties, d, 0).column_ranks_); vars.push_back (var); } } @@ -894,7 +924,10 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const var.index_ = i; var.suggestion_ = get_configuration (specifications_[i].position_ - ties[i].dir_, - -ties[i].dir_); + - ties[i].dir_, + + ties[i].column_ranks_ + ); vars.push_back (var); } @@ -905,7 +938,8 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const var.index_ = i-1; var.suggestion_ = get_configuration (specifications_[i-1].position_ - ties[i-1].dir_, - - ties[i-1].dir_); + - ties[i-1].dir_, + specifications_[i-1].column_ranks_); vars.push_back (var); } @@ -915,8 +949,8 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const { Tie_configuration_variation var; var.index_ = i-1; - var.suggestion_ = get_configuration (specifications_[i-1].position_ - - 1, DOWN); + var.suggestion_ = get_configuration (specifications_[i-1].position_ - 1, DOWN, + specifications_[i-1].column_ranks_); vars.push_back (var); } if (i == ties.size() && !specifications_[i].has_manual_position_ @@ -925,7 +959,8 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const Tie_configuration_variation var; var.index_ = i; var.suggestion_ = get_configuration (specifications_[i].position_ - + 1, UP); + + 1, UP, + specifications_[i].column_ranks_); vars.push_back (var); } } @@ -935,7 +970,8 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const Tie_configuration_variation var; var.index_ = i; var.suggestion_ = get_configuration (ties[i].position_ + ties[i].dir_, - ties[i].dir_); + ties[i].dir_, + ties[i].column_ranks_); vars.push_back (var); } -- 2.39.2