From: Chris C. <ca...@al...> - 2003-08-06 12:12:38
|
Chris Cannam wrote: > Why not just go from one end of the > composition to the other, filling in notes at all the right times? fyi, here's a function that will calculate those times. The depth argument is the level of subdivision (0 = bars only, 3 = bars, beats, beat divisions, subdivisions -- etc). Doesn't do anything except print them out, and note that they aren't in order as it's really a recursive process that's just flattened into a loop. This is a long way from the fastest way to do it, but it's simple enough and very generic (works for any time signatures). void calculateMetronomeTicks(Rosegarden::Composition &c, int depth) { Rosegarden::timeT t = 0; while (t < c.getEndMarker()) { Rosegarden::TimeSignature sig = c.getTimeSignatureAt(t); std::vector<int> divisions; if (depth > 0) divisions = sig.getDivisions(depth - 1); int ticks = 1; for (int i = -1; i < (int)divisions.size(); ++i) { if (i >= 0) ticks *= divisions[i]; for (int tick = 0; tick < ticks; ++tick) { if (i >= 0 && (tick % divisions[i] == 0)) continue; Rosegarden::timeT tickTime = t + (tick * sig.getBarDuration()) / ticks; std::cout << "Tick of depth " << i+1 << " at time " << tickTime << std::endl; } } t = c.getBarEndForTime(t); } } Chris |