Change tempo while playing


I’m wondering if it is possible to smoothly change tempo while playback is running. The StepSequencerDemo project has a tempo slider but it rewrites the tempo track:

edit.tempoSequence.getTempos()[0]->setBpm( ... )

This makes the playback position “jump” when changing the tempo. What I would like is a tempo slider that changes tempo from the current position (preferredly without rewriting the tempo track at all). Would that be possible?


This should work if you use TempoSetting::setBpm as it internally remaps everything with a EditTimecodeRemapperSnapshot.

Then when the new playback graph is created, the playhead should be adjusted to be in the same beat position. If you search EditPlaybackContext for hasTempoChanged, that should be true when you change tempo.

Is that not working for you?

Well, it sort of works: the tempo does change and the playhead stays more or less in the same position. But the change is not very smooth; for one thing it makes some notes play back twice (which I guess is because of some scheduling lookahead). That is not a big problem, just a tiny bit annoying. But worse, the “flow of the music” is abrupted.

This can easily be demonstrated in the StepSequencerDemo by commenting out the first line in sliderValueChanged so that the tempo changes while dragging the tempo slider (and not just when releasing the mouse button). Now while dragging the tempo slider, the effective tempo is lowered.

I realize that this may be an edge case but for my use case I would really like a “live” tempo slider in the application, like e.g. in Ableton Live. Do you think that would be possible using the Tracktion Engine?


Hmm, this might just be an issue with the note-handling in the internal plugins used in the StepSequencerDemo

If I do a similar test in Waveform e.g. add a MIDI clip, set an arp pattern, loop it over a few bars and add a synth then click the BPM and move the slider up and down, the tempo change is pretty smooth?

Thanks, I’ll do some more testing!