#include <math.h>
#include <stdio.h>
#include <sys/soundcard.h>
#include "Osc.h"
#include "Click.h"
#include "miditabl.h"
#include "MIDIInpt.h"
#include "RTWvOut.h"

double data2freq(double d)
{
  const double fmin = log(1);
  const double fmax = log(1000);

  double out = exp(d*(fmax-fmin)/127 + fmin);

  out = SRATE/(int(SRATE/out));
  return out;
}

main(int argc, char** argv)
{
  int i, DELTA=1, j, oneOn=0;

  int N = 1, over = 1;
  double freq=400, temp, temp2, out;
  RTWvOut output;
  Osc *o;
  Click *clk;
  MIDIInpt controller;
  DataWindow *data;

  /*  
  if (argc>1) 
    N = atoi(argv[1]);
    */



  o = new Osc();
  clk = new Click();

  i=-1;

  data = new DataWindow(4, "Clicks and sines", 200, 200);
  data->SetName(0, "Click frequency");
  data->SetValue(0, &clk->f);
  data->SetName(1, "Sine frequency");
  data->SetValue(1, &o->f);
  data->SetName(2, "Click amplitude");
  data->SetValue(2, &clk->A);
  data->SetName(3, "Sine amplitude");
  data->SetValue(3, &o->A);
  data->Update();

  while(1)
  {
    if (controller.nextMessage() > 0) {
      temp2 = controller.getByteThree();
      temp = controller.getByteTwo();	
      /*
      if ((controller.getType()==MIDI_NOTEON) && (temp2>=1.0))
      {
	  j = (int) temp;
	  temp = __MIDI_To_Pitch[j];
	  //          printf("NoteOn    %4.2fHz %f\n",temp,temp2);
       	  oneOn += 1;
	  o->setFreq(temp);
  	  data->Update();
	  //	  printf("o->f0 is %f\n", float(o->f0));
      }
      else
      if (controller.getType()==MIDI_NOTEOFF)	{
	if (temp2 < 2.0) temp2 = 64.0;
	if (oneOn ==1) {
	  //	  printf("NoteOff         0.0 1 %f %f\n",temp,temp2);
	}
	oneOn -= 1;
      }
      else
      */
      if (controller.getType() == MIDI_CTL_CHANGE)
      {
	j = (int) temp;
	double freq = data2freq(temp2);
	if (j<5)
	{
	  if (j==0) {		// Simultaneous frequency
	    o->setFreq(freq);
	    clk->setFreq(freq);
	  }
	  else if (j==1) {
	    o->setFreq(data2freq(temp2));
	  }
	  else if (j==2) {
	    clk->setFreq(data2freq(temp2));
	  }
	  else if (j==3) {
	    o->setAmp(temp2/127);
	  }
	  else if (j==4) {
	    clk->setAmp(temp2/127);
	  }
	    	  data->Update();
	}
      }
    }

    output.tick((o->tick()+clk->tick())/2);
    
  }
}













