You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.5KB

  1. #pragma once
  2. #include <assert.h>
  3. #include "AudioMath.h"
  4. #include "LookupTable.h"
  5. #include "ObjectCache.h"
  6. #include "SawOscillator.h"
  7. template<typename T> class SinOscillatorParams;
  8. template<typename T> class SinOscillatorState;
  9. /**
  10. * A simple sin oscillator based on lookup table.
  11. * Advantage:
  12. * fast.
  13. * frequency may be changed without phase discontinuity.
  14. * Optional quadrature output.
  15. * Disadvantage:
  16. * Not the best spectral purity (significant amount of phase jitter)
  17. */
  18. template<typename T, bool frequencyCanBeNegative>
  19. class SinOscillator
  20. {
  21. public:
  22. SinOscillator() = delete; // we are only static
  23. static void setFrequency(SinOscillatorParams<T>&, T frequency);
  24. static T run(SinOscillatorState<T>&, const SinOscillatorParams<T>&);
  25. static void runQuadrature(T& output, T& outputQuadrature, SinOscillatorState<T>&, const SinOscillatorParams<T>&);
  26. };
  27. template<typename T, bool frequencyCanBeNegative>
  28. inline void SinOscillator<T, frequencyCanBeNegative>::setFrequency(SinOscillatorParams<T>& params, T frequency)
  29. {
  30. assert(params.lookupParams->isValid());
  31. SawOscillator<T, frequencyCanBeNegative>::setFrequency(params.sawParams, frequency);
  32. }
  33. template<typename T, bool frequencyCanBeNegative>
  34. inline T SinOscillator<T, frequencyCanBeNegative>::run(
  35. SinOscillatorState<T>& state, const SinOscillatorParams<T>& params)
  36. {
  37. const T temp = SawOscillator<T, frequencyCanBeNegative>::runSaw(state.sawState, params.sawParams);
  38. const T ret = LookupTable<T>::lookup(*params.lookupParams, temp);
  39. return ret;
  40. }
  41. template<typename T, bool frequencyCanBeNegative>
  42. inline void SinOscillator<T, frequencyCanBeNegative>::runQuadrature(
  43. T& output, T& outputQuadrature, SinOscillatorState<T>& state, const SinOscillatorParams<T>& params)
  44. {
  45. T saw, quadratureSaw;
  46. SawOscillator<T, frequencyCanBeNegative>::runQuadrature(saw, quadratureSaw, state.sawState, params.sawParams);
  47. output = LookupTable<T>::lookup(*params.lookupParams, saw);
  48. outputQuadrature = LookupTable<T>::lookup(*params.lookupParams, quadratureSaw);
  49. };
  50. template<typename T>
  51. class SinOscillatorParams
  52. {
  53. public:
  54. SawOscillatorParams<T> sawParams;
  55. // LookupTableParams<T> lookupParams;
  56. std::shared_ptr<LookupTableParams<T>> lookupParams;
  57. SinOscillatorParams()
  58. {
  59. lookupParams = ObjectCache<T>::getSinLookup();
  60. }
  61. SinOscillatorParams(const SinOscillatorParams&) = delete;
  62. };
  63. template<typename T>
  64. class SinOscillatorState
  65. {
  66. public:
  67. SawOscillatorState<T> sawState;
  68. };