380 Commits

Author SHA1 Message Date
Paul Davis
e7b2b4fc5e NO-OP: rename goto label with clearer terminology 2026-01-09 20:07:06 -07:00
Paul Davis
1401c6e45a temporal: handle a special condition where the got added in 6bc2261575 should not be used 2026-01-09 20:06:41 -07:00
Paul Davis
3890eb7f0e remove some compiler warnings caused by debug/runtime error output 2026-01-09 18:00:47 -07:00
Paul Davis
4232983809 temporal: write down things that I have learned 2026-01-09 11:03:18 -07:00
Paul Davis
c8ec52e707 temporal: improve/extend debugging for DEBUG::Grid 2026-01-09 10:53:18 -07:00
Paul Davis
6bc2261575 temporal: fix incorrect logic in TempoMap::fill_grid_by_walking()
If walking the grid by bar, but points are closer than that, we could end up
with the wrong TempoMetric being used to compute various time domain
conversions (which tends to leads to abort()).

This small change makes sure that we keep looking for more points if we have
not yet reached the next grid point (e.g. bar).
2026-01-09 10:53:18 -07:00
Paul Davis
a144d3e80d temporal: when resetting the tempo map, stop at BBT markers
This was always the intended behavior, but not implemented even
close to that intention.
2026-01-01 20:11:12 -07:00
Paul Davis
bbf5bd6043 temporal: provide a map to get the BBT reference point before a superclock time 2026-01-01 20:11:12 -07:00
Paul Davis
52c7d6ab77 temporal: customize the implementation of get_tempo_and_meter for BBT_Time
We must not walk past a MusicTimePoint if the reftime is a BBT_Argument.

May try to fold this back into the fully-templated version in a subsequent commit.
2026-01-01 20:11:12 -07:00
Paul Davis
8f815e21ea temporal: rename Point::sample() to Point::sample_is_dangerous()
It is risky to take the sample value returned by this method and then convert it back
to either superclocks or beats, mostly because tempo & meter times are generally in
music time, and converting from superclocks to samples loses precision.

This rename is there to serve as a reminder to developers to be careful when using
this method
2025-12-29 09:14:02 -07:00
Paul Davis
369fc2c15c temporal: fix a major thinko when removing/replacing map points
Despite comments already in the code, the logic used to remove a
{Tempo,Meter,BarTime} point from the _points list was incorrect. While it is
true that we can use a duple of (type,time) to find a given point,
::remove_point() was not doing that and instead assumed just the time value
could be used.

This meant that if you placed a tempo and meter at the same point in time, then
changed one of them, ::remove_point() could remove the wrong point from the
_points list.

In #10063 this manifests as the wrong grid being drawn after a tempo point
edit.

This commit alters the ::core_remove_xxx() methods to return a pointer to the
actual Point object that was removed from {_tempos,_meters,_bartimes} and then
we pass that to ::remove_point() for lookup and removal by address.

It also "fixes" a couple of instances of ::core_remove_xxx() without any
removal from the _points list (since ::core_remove_tempo() and
::core_remove_meter() do not do this; ::core_remove_bartime() does,
however). It is not immediately obvious what bad behavior would arise from the
existing code in these cases, but it seems clearly incorrect that the _points
list would contain points no longer present in _tempos or _meters.
2025-12-27 12:14:49 -07:00
Paul Davis
f1b80cdbe1 temporal: add & use a couple of TempMap methods for unit testing 2025-12-27 12:14:49 -07:00
Paul Davis
e50032ecb5 for debug builds, show stacktrace for TempoMap::fetch_condition() failure 2025-11-11 14:35:55 -07:00
Paul Davis
e975fc5b7d slightly more debug information when starting local tempo scope 2025-10-20 14:58:16 -06:00
Paul Davis
901e32f17f temporal: add stacktraces to DEBUG_TRACE output for start/end local tempo map 2025-09-01 11:17:24 -06:00
Paul Davis
f6ec3828ed temporal: fix local tempo map depth mgmt when starting a local tempo map 2025-09-01 11:17:24 -06:00
Paul Davis
27ffd1628d temporal: remove iterative bbt_delta() since unit test shows breakage 2025-08-22 10:51:16 -06:00
Paul Davis
fd53cf87ed temporal: new non-iterative implementation of Meter::bbt_delta() 2025-08-22 10:45:12 -06:00
Paul Davis
e9460bb372 temporal: fix unused variable warning in TempoMap::paste() 2025-08-20 17:43:45 -06:00
Paul Davis
de843db102 temporal: lots more DEBUG_TRACE statements for grid debugging 2025-08-20 17:43:34 -06:00
Paul Davis
607f3577bd temporal: in the event of the most common logic failure, provide more info
TEMPORAL_MAP_ASSERT() doesn't give us any actual values or context.
2025-08-20 17:43:24 -06:00
Paul Davis
a8168f826d remove incorrect bbt_delta() in BBT_Time, provide Meter::bbt_delta
There are two implementations here, the more efficient one (commented out) does
not work correctly yet.
2025-08-20 17:43:05 -06:00
Paul Davis
1312e8f992 temporal: implement TempoMap::bbt_distance() but do not use it
This was implemented to try to fix paste() but was not needed. It might be
useful in the future, or just as an expression of the logic of this. Note that
the BBT_Offset it returns only has the beats field set, which is ... odd. So
this is likely not quite finished.
2025-08-19 10:53:06 -06:00
Paul Davis
29be601cce temporal: undefine macro after use 2025-08-19 10:53:06 -06:00
Paul Davis
7c9b9ceb7e temporal: show BBT marker point names in operator<< 2025-08-19 10:53:06 -06:00
Paul Davis
2aad1ac5f5 temporal: fix TempoMap::paste() to pass unit test
the BBT times of the newly inserted points during paste() are meaningless until
we recompute them using ::reset_starting_at(). So don't try to compute some
sort of likely value, just use the value from the cut buffer, and call
reset_starting_at() after every point inserted.
2025-08-19 10:53:06 -06:00
Paul Davis
f0111bcea5 temporal: BBT_Time cannot have any round_to_*() or round_up_to_*() methods
A meter (time signature) is required to do the math correctly for any operation that may
cross or reach the next bar boundary, which round_to_*() and round_up_to_*() may do.
2025-08-19 10:53:06 -06:00
Paul Davis
f010133c5f slightly improve a DEBUG_TRACE message for DEBUG::Grid 2025-08-13 10:51:44 -06:00
Paul Davis
46f2dba306 temporal: fix Meter::to_quarters (BBT_Offset)
Because Paul can't do math
2025-08-13 10:51:44 -06:00
Paul Davis
20b984384d NO-OP: move TempoMap destructor in code to be after constructors 2025-08-12 21:44:50 -06:00
Paul Davis
b205c0bc4b scoped tempo maps: logic fixes and some comment-documentation 2025-08-12 07:53:30 -06:00
Paul Davis
2fc669964e Revert "A new class ('ScopedTempoMapOwner') exposes functions which need to be visible outside of libtemporal"
This reverts commit d3a15b11ba.

This arrived at an awkward time as ScopedTempoMapOwner was being rearranged at
the source level. It will be reapplied in a subsequent commit.
2025-08-12 07:15:17 -06:00
John Emmas
d3a15b11ba A new class ('ScopedTempoMapOwner') exposes functions which need to be visible outside of libtemporal
(and since there's no 'scope.cc', libtemporal itself needs to #include scope.h for those symbols to get exported)
2025-08-12 13:19:24 +01:00
Paul Davis
dd41fddcad temporal: fix up some logic relating to scoped tempo maps 2025-08-11 15:41:34 -06:00
Paul Davis
1ecbdf164d moved scoped tempo map from GUI to libtemporal 2025-08-11 15:41:34 -06:00
Paul Davis
b80b4b7869 remove debugging output 2025-08-05 11:42:23 -06:00
Paul Davis
b65adb59cd temporal: fix some subtle misbehavior in TempoMap::cut_copy() 2025-08-05 11:37:35 -06:00
Paul Davis
0f1c5a9d7d temporal: add new smf_*() API for building a tempo map from SMF info 2025-08-05 11:37:35 -06:00
Paul Davis
ba00dc0920 temporal: add TempoMap::duration() method 2025-08-05 11:37:35 -06:00
Paul Davis
b6f1ff336e when adding a tempo/meter at end of map, no reset necessary
Also, the reset would malfunction which really ought to be fixed
2025-07-30 22:18:12 -06:00
Paul Davis
0e42868d35 fix arithmetic error in Meter::to_quarters 2025-04-11 11:23:36 -06:00
Paul Davis
9f3a41b96b manually revert fa376b709d and debef6ab
Quantizing superclocks to samples in libtemporal negates the whole purpose of superclocks,
and breaks a variety of things, not limited to moving forward to markers and the grid
2025-02-28 13:39:45 -07:00
Paul Davis
debef6ab25 lighter, simpler math for sample-aligned superclocks 2025-01-30 11:26:41 -07:00
Paul Davis
fa376b709d add new sample_aligned_superclock() method and use it when converting Beats to superclock
There can never be fractional audio time, and since superclock_t is used to represent audio time, when we
convert from Beat time, we should never, ever return a superclock value that does not correspond to
an integer number of samples.

This fixes a number of bugs, including any use of ARDOUR::Filter which writes a new (audio) file
to disk that must be an integer number of samples long, but may be derived from and later used
by a region that had an audio-time duration that is slightly longer (less than one sample)
than the audio file
2025-01-29 17:40:57 -07:00
Paul Davis
baef68b1e6 clean up/improve API used in 5ebf8152e 2025-01-10 09:25:03 -07:00
Paul Davis
5ebf8152ec temporal: tempo changes must be on meter-provided grid, not quarter notes 2025-01-09 22:30:17 -07:00
Paul Davis
5f943295fc copying a tempo map should not bail out just because there is only 1 tempo & meter 2024-12-18 16:46:07 -07:00
Paul Davis
364598e94f temporal: add round_up_to_bar() methods to Meter, Metric and TempoMap 2024-10-31 12:22:35 -06:00
Robin Gareus
2d7cce44f1 Replace PBD::Signals (1/2) 2024-10-18 20:41:08 +02:00
Robin Gareus
e75ad3399e Fix BBT marker calculation when removing time 2024-05-14 03:20:04 +02:00