2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1996--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
5 Jan Nieuwenhuizen <janneke@gnu.org>
7 LilyPond is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 LilyPond is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
21 #ifndef BEAM_SCORING_PROBLEM_HH
22 #define BEAM_SCORING_PROBLEM_HH
24 #include "interval.hh"
25 #include "lily-proto.hh"
26 #include "lily-guile.hh"
27 #include "std-vector.hh"
28 #include "stem-info.hh"
29 #include "main.hh" // DEBUG_BEAM_SCORING
32 // Should be ordered by increasing expensiveness.
40 struct Beam_configuration
44 #if DEBUG_BEAM_SCORING
50 Beam_configuration ();
52 void add (Real demerit, const string &reason);
53 static Beam_configuration* new_config(Interval start,
57 // Comparator for a queue of Beam_configuration*.
58 class Beam_configuration_less
61 bool operator() (Beam_configuration* const& l, Beam_configuration* const& r)
64 return l->demerits > r->demerits;
69 struct Beam_quant_parameters
71 Real SECONDARY_BEAM_DEMERIT;
72 Real STEM_LENGTH_DEMERIT_FACTOR;
76 threshold to combat rounding errors.
80 // possibly ridiculous, but too short stems just won't do
81 Real STEM_LENGTH_LIMIT_PENALTY;
82 Real DAMPING_DIRECTION_PENALTY;
83 Real MUSICAL_DIRECTION_FACTOR;
84 Real HINT_DIRECTION_PENALTY;
85 Real IDEAL_SLOPE_FACTOR;
86 Real ROUND_TO_ZERO_SLOPE;
88 void fill (Grob *him);
94 Parameters for a single beam. Precomputed to save time in
95 scoring individual configurations.
97 TODO - use trailing _ on data members.
100 class Beam_scoring_problem
103 Beam_scoring_problem (Grob *me, Drul_array<Real> ys);
104 Drul_array<Real> solve() const;
109 Interval unquanted_y;
118 vector<Stem_info> stem_infos;
121 Do stem computations. These depend on YL and YR linearly, so we can
122 precompute for every stem 2 factors.
124 We store some info to quickly interpolate. The stemlengths are
125 affine linear in YL and YR. If YL == YR == 0, then we might have
126 stem_y != 0.0, when we're cross staff.
128 vector<Real> base_lengths;
129 vector<Real> stem_xpositions;
135 Beam_quant_parameters parameters;
138 Drul_array<int> edge_beam_counts;
139 Drul_array<Direction> edge_dirs;
140 Real beam_translation;
144 void one_scorer (Beam_configuration* config) const;
145 Beam_configuration *force_score (SCM inspect_quants,
146 const vector<Beam_configuration*> &configs) const;
148 // Scoring functions:
149 void score_forbidden_quants (Beam_configuration *config) const;
150 void score_slopes_dy (Beam_configuration *config) const;
151 void score_stem_lengths (Beam_configuration* config) const;
152 void generate_quants(vector<Beam_configuration*>* scores) const;
155 #endif /* BEAM_SCORING_PROBLEM_HH */