The ear is highly sensitive to pitch, and I agree that something like
| DeltaPhase += DeltaDeltaPhase; // change in delta phase per step
Phase += DeltaPhase;
|
is not numerically stable enough to sound perfect (it might sound ok). What you want to do instead is make your DeltaPhase a function of time, so you can precisely compute it for every step if you wish:
| DeltaPhase = ComputeDeltaPhase(CurrentTime);
Phase += DeltaPhase;
|
Note that DeltaPhase is just another way to express frequency here.
Also note that linearly interpolating the frequency (and thereby the DeltaPhase) may give a result different from your expectations, since frequencies are not perceived linearly. What you may want to do instead is interpolate the pitch, and convert that to a frequency. This is relatively expensive to compute, so it's fine to only compute the pitch occasionally (e.g. 500 times a second), and linearly interpolate the frequency in between.