2 spacing-spanner.cc -- implement Spacing_spanner
4 source file of the GNU LilyPond music typesetter
6 (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "spacing-spanner.hh"
11 #include "score-column.hh"
12 #include "dimensions.hh"
13 #include "paper-def.hh"
16 #include "line-of-score.hh"
18 Spacing_spanner::Spacing_spanner ()
20 set_elt_property (break_helper_only_scm_sym, SCM_BOOL_T);
21 set_elt_property (transparent_scm_sym, SCM_BOOL_T);
25 Spacing_spanner::col_count () const
27 return pscore_l_->line_l_->cols_.size ();
31 Spacing_spanner::scol (int i)const
33 return dynamic_cast<Score_column*> (pscore_l_->line_l_->cols_[i]);
37 cut 'n paste from spring-spacer.cc
40 Spacing_spanner::do_measure (int col1, int col2) const
42 for (int i =col1; i < col2; i++)
44 scol (i)->preprocess ();
49 shortest.set_infinite (1);
50 for (int i =col1; i < col2; i++)
52 if (scol(i)->musical_b ())
54 shortest = shortest <? scol(i)->shortest_starter_mom_;
58 Array<Spring> meas_springs;
60 for (int i= col1; i < col2; i++)
62 if (!scol (i)->musical_b() && i+1 < col_count())
64 Real symbol_distance = scol (i)->extent (X_AXIS)[RIGHT] ;
65 Real durational_distance = 0;
66 Moment delta_t = scol (i+1)->when_mom () - scol (i)->when_mom () ;
68 ugh should use shortest_playing distance
72 Real k= paper_l()->arithmetic_constant (shortest);
73 durational_distance = paper_l()->length_mom_to_dist (delta_t,k);
75 symbol_distance += -scol (i+1)->extent(X_AXIS)[LEFT];
78 s.item_l_drul_[LEFT] = scol (i);
79 s.item_l_drul_[RIGHT] = scol (i+1);
80 s.distance_f_ = symbol_distance >? durational_distance;
81 meas_springs.push (s);
83 Item *l = s.item_l_drul_[LEFT]->find_prebroken_piece (RIGHT);
84 Item *r = s.item_l_drul_[RIGHT]->find_prebroken_piece (LEFT);
90 s.item_l_drul_[LEFT] =l ;
91 meas_springs.push (s);
97 s.item_l_drul_[RIGHT] = r;
98 s.item_l_drul_[LEFT] = l;
99 meas_springs.push (s);
105 for (int i=col1; i < col2; i++)
107 if (scol (i)->musical_b())
109 Moment shortest_playing_len = scol(i)->shortest_playing_mom_;
110 if (! shortest_playing_len)
112 warning (_f ("can't find a ruling note at %s",
113 scol (i)->when_mom ().str ()));
114 shortest_playing_len = 1;
118 warning (_f ("no minimum in measure at %s",
119 scol (i)->when_mom ().str ()));
122 Moment delta_t = scol (i+1)->when_mom () - scol (i)->when_mom ();
123 Real k= paper_l()->arithmetic_constant(shortest);
124 Real dist = paper_l()->length_mom_to_dist (shortest_playing_len, k);
125 dist *= (double)(delta_t / shortest_playing_len);
129 sp.distance_f_ = dist;
130 sp.item_l_drul_[LEFT] = scol (i);
131 sp.item_l_drul_[RIGHT] = scol (i+1);
133 meas_springs.push (sp);
137 advanced spacing here.
141 Item *r = sp.item_l_drul_[RIGHT]->find_prebroken_piece (LEFT);
146 sp.item_l_drul_[RIGHT] =r ;
147 meas_springs.push (sp);
155 Spacing_spanner::get_springs () const
157 Array<Spring> springs;
159 for (int i=1; i < col_count (); i++)
161 if (scol (i)->breakable_b ())
163 springs.concat (do_measure (last_break, i));