#include "Osc.h"
#include <stdio.h>

Osc :: Osc(double aF, double aA, double aPhase)
{
  double amplitudeCoefficient;
  
  f = aF;
  A = aA;
  phase = aPhase;
  // Initialize state
  tuningCoefficient = cos(f*TWO_PI_OVER_SRATE);
  amplitudeCoefficient = sqrt(((1-tuningCoefficient)/(1+tuningCoefficient)));
  z2 = A*cos(phase);
  z1 = -amplitudeCoefficient*A*sin(phase);

}

Osc :: ~Osc()
{
}

void Osc :: setFreq(double aF)
{
  f = aF;
  tuningCoefficient = cos(f*TWO_PI_OVER_SRATE);
  //  amplitudeCoefficient = sqrt(((1-tuningCoefficient)/(1+tuningCoefficient)));
}

void Osc :: setPhase(double aPhase)
{
  phase = aPhase;
}

void Osc :: setAmp(double aA)
{
  z1 *=aA/A;
  z2 *=aA/A;
  A = aA;
}


double Osc :: tick()
{
  double sum1, sum2;
  
  sum2 = (z1 + z2)*tuningCoefficient;
  sum1 = sum2 - z2;
  z2 = z1 + sum2;
  z1 = sum1;

  return z2;
}


