Unless the play routine does not return, it is virtually impossible to alter the tempo of a song smoothly; for example, in changing from 150 BPM to 180 BPM at standard rate, there would be more rows lasting for 6 ticks first, then the tempo becomes clpse to 163.6 BPM where rows with 6 and 5 ticks alternate, and then more and more rows last for 5 ticks until the tempo settles down. This becomes more complicated when there are already chains of Fxx effects controlling the speed periodically.

The best you could do is attempting to interpolate the two tempo end-values. For example, you could easily produce a linearly interpolated Fxx sequence in a

spreadsheet:

Code: Select all

` A B C D`

1

2 0 =F$5*15/(F$2+(F$3-F$2)*MIN(A2/F$4,1)) =B2+C1 =CEILING(C2,1)-CEILING(C1,1)

3 =A2+1 ... ... ...

4 ...

E F

2 START 150

3 END 180

4 LENGTH 16

5 RATE 60

The Fxx sequence can be read on column D. As shown here, if the tempo linearly increases from 150 BPM to 180 BPM in 16 rows, and the engine speed is 60 Hz, those 16 rows (plus one final row to fix the tempo at 180 BPM) would use:

which reduces to:

Code: Select all

`F06 ... ... ... ... F05 F06 ... F05 ... F06 F05 ... ... ... F06 F05`

When START is equal to END, the result is simply the Fxx sequence implied by that BPM value in FamiTracker. In practice, tempo changes may not be linear, but sequences like this can be used as a base for slight modifications. For slight tempo changes like from 144 BPM to 150 BPM across an entire frame, this method is preferred because only a decreasing portion of rows would contain 7 ticks and linear interpolation spreads these rows as evenly as possible.

Alternatively, if you already know how "grooves" work, you could just use a series of increasingly fast Fxx sequences. The tempo change then becomes less smooth, but has the advantage that those grooves can always be selected to match the row count:

Code: Select all

`(3.000, 300 BPM) F03 ... ... ... ... ... ... ...`

(2.875, 313 BPM) ... ... ... F02 F03 ... ... ...

(2.750, 327 BPM) ... ... ... F02 F03 ... ... F02

(2.625, 343 BPM) F03 F02 F03 F02 F03 ... ... F02

(2.500, 360 BPM) F03 F02 F03 F02 F03 F02 F03 F02

On the other hand, if you simply do not need control over the number of ticks on every row, and you do not use speed sequences, then just interpolate the two Fxx tempo values, as FamiTracker has a shortcut for that:

This is as smooth as you can get; indeed, for many specific tempo values this last method will not be significantly worse than manually doing multiple Fxx speed sequences.