//******************************************************************************************
//
//
//                        DIY     SYNTH     ARDUINO    BASED
//
//                                  :)   ENJOY!!!
//
//  Library developed by Noé Paniagua and Kiki Gómez, University Of Málaga (Electronica Creativita students).
//
//  Patron: DIY synth © 2024 by Noé Paniagua, Juan Carlos Gómez is licensed under CC BY-NC 4.0 
//
//******************************************************************************************
#include "FspTimer.h"
#include "Defines.h"
FspTimer audio_timer;

#include "Sound.h"
#include "Button.h"

#define keysSamplingPeriod 1

#define AtaquePin A1
#define DecayPin A2 
#define SustainPin A3
#define ReleasePin A4
#define VolumePin A5
#define FormaOndaPin 0
#define UpOctave 2
#define DownOctave 3

#define SALIDA1_TECLAS 12
#define SALIDA2_TECLAS 8
#define SELECTOR2 11
#define SELECTOR1 10
#define SELECTOR0 9

uint8_t octave = 1;
uint8_t waveForm=0;
bool semWave = false, semUP = false, semDOWN = false;

Button botonFormaOnda(FormaOndaPin);
Button botonUP(UpOctave);
Button botonDOWN(DownOctave);

bool nadaPulsado = true;

void setup() {
  Serial.begin(9600);
  delay(500);
              
  synthSetupDac();
  synthBeginTimer(40000);
  
  pinMode(SALIDA1_TECLAS, INPUT);
  pinMode(SALIDA2_TECLAS, INPUT);
  pinMode(SELECTOR2, OUTPUT);
  pinMode(SELECTOR1, OUTPUT);
  pinMode(SELECTOR0, OUTPUT);

  setNewFrecuency(octave);
}

void loop() {
  //
  // Set the level of volume 
  //
  synthSetVolume(analogRead(VolumePin));

  //
  // Set the level of any ADSR parameter
  //
  synthADSR(analogRead(AtaquePin),
            analogRead(DecayPin),  
            analogRead(SustainPin),
            analogRead(ReleasePin));

  //  
  // set the current waveform clicking the button
  //
  if (botonFormaOnda.isPressed()){
      if(!semWave){
       semWave = true;
       waveForm++;
        if(waveForm >= 3) waveForm = 0;
        synthSetWaveForm(waveForm); 
        setNewFrecuency(octave);
      }
  }   
  else semWave = false; 

  //  
  // increase one octave the keyboard
  //
  if (botonUP.isPressed()){
      if(!semUP){
       semUP = true;
        if(octave < 3){
          octave++;
          setNewFrecuency(octave); 
        }
      }
  }   
  else semUP = false; 

  //  
  // decrease one octave the keyboard
  //
  if (botonDOWN.isPressed()){
      if(!semDOWN){
       semDOWN = true;
        if(octave > 1){
          octave--;
          setNewFrecuency(octave); 
        }
      }
  }   
  else semDOWN = false;

  //
  //  Count the number of pressed keys
  //
  synthKeysCounter();

  //
  // Logic for logic gates keys
  //
  synthKeysLogic();
  
}//main
