You can get extremely good sinewaves using polynomials. I use the following one for sin 2pi x, which I stole from Reaktor 6
polysin x = ((((-0.540347 x2) + 2.53566) x2 - 5.16651) x2 + 3.14159) x , assuming x is between
-0.25 and 0.25.
(notice the standard computationally efficient approach to evaluating polynomials). The fifth decimal is never off by more than one, and this is much better than what you need for an additive synth. For the full range
-0.5 <= x <= 0.5 you need to precede the above line with a folding function, e.g.
cos 2pi x = polysin(0.5 - 2*fabs(x))
A cheaper (I think) but not as precise approximation can be found in
http://forum.devmaster.net/t/fast-and-accurate-sine-cosine/9648
But if the frequency of your sine doesn't vary much, the most computationally efficient sinewaves are obtained by using the rotating vector method: keep applying the rotation matrix
| cos phi -sin phi |
| sin phi cos phi |
to a vector of length one, starting with say (1,0), where phi is (desired frequency / sampling rate).
The conventional wisdom in the plugin community is that polynomial approximations are faster than table lookups, because you 're almost certain of overwhelming the cache. But things might be different here, if we don't ask for gigantic tables. There is probably not that much happening between two audio buffer runs, and the lookup table might stay be in cache from run to run. I believe that the potential benefit of tables for Bela should be investigated, or maybe it already has.