Fxx - speed/tempo. Sets the speed when xx is between 00 - 1F, and tempo when xx is between 20 - FF.
FamiTracker and tempo
FamiTracker calculates actual tempo using the following formula (where 4 rows represent one beat):
BPM = Tempo * 6 ÷ Speed
Tempo = 2.5 * Clock speed (user-defined clock speed)
Native tempo: 150 (NTSC), 125 (PAL)
NES music audio drivers used in games was typically clocked by the video refresh rate, which is 60Hz (NTSC) or 50Hz (PAL). This determines the refresh rate of the music driver: changes can only be made to the audio every 60th (or 50th) of a second. Each such update is referred to as a "tick".
- Note: The calculations which follow assume the default NTSC clock speed (60Hz) is used.
When the tempo is set 150 bpm (native tempo), the "speed" values basically indicates how many "ticks" happen during one row. The "default" tempo is 150 bpm, because 60hz tick rate = 3600 ticks per minute, and (3600 ticks/min) / (6 f/row * 4 row/beat) = 150 beat/min. Other tempo values mean different ticks/row values.
Problems may begin to appear when using tempo values that correspond to a number of ticks per row in between two whole numbers of ticks per row (e.g. 6 and 7, as is the case when using a tempo between 128 bpm and 150 bpm), in which case you get alternating rows of 6 and 7 ticks (and it's difficult to predict which is going to be on any given row). The effect of this is that you hear slight unevenness in the tempo. This is especially noticeable when using single-row echo or fast arpeggios (using either instrument-defined arps or the 0xx effect).
Using tempo values outside the "integral" values
Ideally, the "tempo" value should always be 150, and tempo should be set using "speed" or the Fxx effect. However, this does result in a narrow selection of tempos. One way around this is to alternate between two adjacent values of Fxx every row, every 2 rows or even putting 2 spaces in between first and second occurrence of Fxx, then immediately going back to the first one. This way you can achieve a wider ranges of tempos while preserving evenness in the tempo.
A table of commonly used tempos achievable using alternating Fxxs can be found here.
Another option is to use a user-defined clock speed, but then you have to modify the calculations above to determine which tempos are acceptable under which clock speeds. One drawback of this method, though, is that few NSF players support custom clock speeds, so NSF export is compromised.
- 0.2.2 stable: Known as Axx, this effect always affects the speed instead of the tempo.
- 0.2.4 stable: Changes the tempo when xx is between 15 and FF.
- 0.3.7 stable: Changes the tempo when xx is between 21 and FF.
- 0.3.8 beta 0: Changes the tempo when xx is between 16 and FF.
- 0.3.8 beta 5: Changes the tempo when xx is between 15 and FF.
- 0.4.0 stable: Changes the tempo when xx is between 20 and FF. Moreover, to increase backward compatibility, the key combination Ctrl+Shift+S can be inputted to allow xx between 15 and 1F to also change the tempo instead of the speed. This split point is stored in the FTM header.