6 Rhythmic_grouping::init()
13 Rhythmic_grouping::OK()const
16 assert(bool(children.size()) != bool(interval_));
18 for (int i= 0; i < children.size(); i++) {
21 assert(children[i-1]->interval().right ==
22 children[i]->interval().left);
28 Rhythmic_grouping::length() const
30 return interval().length();
34 Rhythmic_grouping::interval()const
40 MInterval(children[0]->interval().left,
41 children.last()->interval().right);
45 Rhythmic_grouping::split(Rhythmic_grouping r)
50 r.intersect(interval());
53 for (int i= 0; i < children.size(); i++) {
54 if (!children[i]->interval_) {
55 Rhythmic_grouping here(r);
56 children[i]->split(here);
63 Rhythmic_grouping::intervals()
66 if (interval_ || children.size() == 1) {
67 MInterval i(interval());
68 MInterval r1(i), r2(i);
69 r1.right = r2.left = i.center();
70 r.push(r1); r.push(r2);
72 for (int i=0; i < children.size(); i++)
73 r.push(children[i]->interval());
78 Rhythmic_grouping::intersect(MInterval t)
81 interval_->intersect(t);
85 for (int i=0; i < children.size(); i++) {
86 MInterval inter = intersection(t, children[i]->interval());
87 if (inter.empty() || inter.length() <= 0) {
91 children[i]->intersect(t);
94 for (int i=0; i < children.size(); ) {
103 /* I really should be documenting what is happening here, but I find
104 that difficult, since I don't really understand what's going on here.
108 Rhythmic_grouping::split(Array<MInterval> splitpoints)
110 //check on splitpoints..
111 int j = 0, i = 0, starti = 0, startj = 0;
113 Array<Rhythmic_grouping*> ch;
115 if ( i >= children.size() || j >= splitpoints.size())
119 children[starti]->interval().left== splitpoints[startj].left);
120 if (children[i]->interval().right < splitpoints[j].right) {
122 } else if (children[i]->interval().right > splitpoints[j].right ) {
127 ch.push(children[i]);
129 Rhythmic_grouping *newchild=new Rhythmic_grouping(
130 children.subvec(starti, i+1));
147 Rhythmic_grouping::Rhythmic_grouping(MInterval t, int n)
151 interval_ = new MInterval(t);
154 Moment dt = t.length()/n;
155 MInterval basic = MInterval(t.left, t.left+dt);
156 for (int i= 0; i < n; i++)
157 children.push(new Rhythmic_grouping( dt*i + basic ));
161 Rhythmic_grouping::Rhythmic_grouping(Array<Rhythmic_grouping*> r)
167 Rhythmic_grouping::~Rhythmic_grouping()
173 Rhythmic_grouping::copy(Rhythmic_grouping const&s)
175 interval_ = (s.interval_)? new MInterval(*s.interval_) : 0;
176 for (int i=0; i < s.children.size(); i++)
177 children.push(new Rhythmic_grouping(*s.children[i]));
181 Rhythmic_grouping::operator=(Rhythmic_grouping const &s)
187 Rhythmic_grouping::Rhythmic_grouping(Rhythmic_grouping const&s)
194 Rhythmic_grouping::junk()
197 for (int i=0; i < children.size(); i++)
203 Rhythmic_grouping::print()const
208 mtor<<" Interval "<< interval_->str();
209 for (int i=0; i < children.size(); i++) {
210 children[i]->print();
217 Rhythmic_grouping::child_fit_query(Moment start)
220 return ( children.last()->interval().right== start);
226 Rhythmic_grouping::add_child(Moment start, Moment len)
228 Moment stop = start+len;
230 assert(child_fit_query(start));
231 children.push(new Rhythmic_grouping(MInterval(start, stop)));
234 Rhythmic_grouping::Rhythmic_grouping()
240 min_elt(Array<int> v)
243 for (int j = 0 ; j < v.size(); j++)
249 Rhythmic_grouping::generate_beams(Array<int> flags, int &flagidx)
252 assert (!interval_) ;
254 Array< Array<int> > children_beams;
255 for (int i=0; i < children.size(); i++) {
256 Array<int> child_beams;
257 if (children[i]->interval_) {
258 int f = flags[flagidx++];
261 child_beams = children[i]->
262 generate_beams(flags, flagidx);
264 children_beams.push(child_beams);
268 for (int i=0; i < children_beams.size(); i++) {
269 bool add_left = (i >0);
270 bool add_right = (i < children_beams.size() -1);
273 m = min_elt(children_beams[i]);
275 nextm = min_elt(children_beams[i+1]);
277 if (children_beams[i].size() == 1) {
284 beams.push(lastm <? m);
285 beams.concat(children_beams[i]);
287 beams.push(m <? nextm);
292 assert(!(beams.size()%2));
297 Rhythmic_grouping::translate(Moment m)
302 for (int i=0; i < children.size(); i++)
303 children[i]->translate(m);
307 Rhythmic_grouping::extend(MInterval m)
309 assert(m.left >= interval().left);
310 while (m.right >interval().right ) {
311 Array<Rhythmic_grouping*> a(children);
312 for (int i=0; i < a.size(); i++) {
313 a[i] =new Rhythmic_grouping(*children[i]);
314 a[i]->translate(children.last()->interval().right);
318 assert(m.right <= interval().right);