Ok so I've got everything set up properly now (I think).
while (Bass.BASS_ChannelIsActive(streamFX) == BASSActive.BASS_ACTIVE_PLAYING)
evaluates false at the initial iteration. My code prior to your sample is as follows:
Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero);
int stream = Bass.BASS_StreamCreateFile(track.location, 0L, 0L, BASSFlag.BASS_STREAM_DECODE);
int streamFX = BassFx.BASS_FX_TempoCreate(stream, BASSFlag.BASS_FX_FREESOURCE);
Bass.BASS_ChannelSetAttribute(streamFX, BASSAttribute.BASS_ATTRIB_TEMPO, 0.2f);
I'm assuming that I need to do something to make the channel "play" or make it active so the conditional while returns true, but there's a lot I don't understand here.
If the code you supplied iterates through the channel and writes data to file, then I'm guessing that
advances the current position in stream, which causes the encoder to write stuff? Is that at all correct?