On Mon, 4 Jan 2010, Arnold Krille wrote:
Last time I looked (two years back sadly), even
hydrogen did the bpm changes
wrong. On a new bpm it would recalculate the position from the beginning of
playtime with the new bpm. Which meant missing beats...
While Hydrogen's transport code is... erm... not good -- I
don't think I ever got a missed beat from a tempo change.
It would be pretty cool if jack had functions to do
the time<->beat
calculation but sadly most jack developers seem to think that tempo and tempo-
maps (not even live) do not belong into jack...
I'm still thinking about the whole "tempo map" proposal
(which doesn't make much sense for a "live" client)...
...but time<->beat calculations have proven to be so
error-prone, I think that some helper functions in Jack to
do the calculations would be a Good Thing. I have a C++
class that does this[1]. It's for Composite's internal
transport -- but it's largely inspired Jack's transport.
This class is intended to be used like a local variable.
TransportPosition pos = get_current_position();
jack_nframes_t end = pos.frame + nframes;
pos.ceil(TransportPosition::TICK);
while( pos.frame < end ) {
// Do operations on this tick.
++pos; // advance to next tick.
}
I imagine an equivalent C API would look like:
jack_position_t pos;
jack_transport_query(client, &pos);
jack_nframes_t end = pos.frame + nframes;
assert(pos.valid & JackPositionBBT);
jack_position_ceil(&pos, JackPositionTick);
while( pos.frame < end ) {
// Do operations on this tick.
jack_position_advance(&pos, JackPositionTick); // advance to next tick.
}
-gabriel
[1]
http://gitorious.org/composite/composite/blobs/9b5b20671ad187bd3f6733838447…