Obligatory code post after a month:
https://git.sr.ht/~namark/libsimple_motion/tree/2dbc37866b1547e3c3c13041002de863b022ee97/source/simple/motion/movement.hpp
It's not exactly a timer, but can use empty structs to to turn it into one, like this:
https://git.sr.ht/~namark/truwo/tree/00a3cc97797220dd0e2ac42e0c0bcf5b99e7a731/source/main.cpp#L20
I will separate it from the interpolation eventually, maybe in another year or so, though at that point the class would become so small it might just disintegrate into a bunch of free functions.
Example of inconvenience caused by disallowing 0 duration:
https://git.sr.ht/~namark/sketchbook/commit/97ea12df328582ed2e69ee23a76590c547716a53
Very painful, but not hopeless, there is room for improvement.