/**
 * \Buzzer_08_sintetizzatore_midi
 *
 * Sintetizzatore MIDI. Questo programma permette di suonare una nota MIDI 
 * seleziondola tra 24 possibili note. La nota viene
 * selezionata tramite un numero digitato sulla seriale.
 *
 * la frequenza di una nota MIDI è calcolata come:
 * 440 * 2 ^ ((nota - 69) / 12)
 * dove nota è un numero da 0 a 127.
 *
 * https://wokwi.com/projects/425933317096044545
 * https://github.com/filippo-bilardo/ROBOTICA/blob/main/Buzzer/README.md
 * 
 * @author Fippo Bilardo
 * @version 1.0  20/03/25 - Versione iniziale
 */
const int BUZZER_PIN = 8;
// Note MIDI (frequenze in Hz)
const int notes[] = {
  262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494, 
  523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988
};
// Nomi delle note
const String noteNames[] = {
  "C4", "C#4", "D4", "D#4", "E4", "F4", "F#4", "G4", "G#4", "A4", "A#4", "B4",
  "C5", "C#5", "D5", "D#5", "E5", "F5", "F#5", "G5", "G#5", "A5", "A#5", "B5"
};
void setup() {
  pinMode(BUZZER_PIN, OUTPUT);
  Serial.begin(9600);
  Serial.println("Sintetizzatore MIDI attivo");
  Serial.println("Inserisci un numero da 1 a 24 per suonare una nota:");
  printNoteTable();
}
void loop() {
  if (Serial.available() > 0) {
    int noteIndex = Serial.parseInt();
    
    if (noteIndex >= 1 && noteIndex <= 24) {
      // Indice valido (1-24)
      noteIndex--;  // Converti in indice array (0-23)
      
      Serial.print("Riproduzione nota: ");
      Serial.print(noteNames[noteIndex]);
      Serial.print(" (");
      Serial.print(notes[noteIndex]);
      Serial.println(" Hz)");
      
      // Suona la nota
      tone(BUZZER_PIN, notes[noteIndex]);
      delay(500);
      noTone(BUZZER_PIN);
    } else {
      Serial.println("Nota non valida. Inserisci un numero da 1 a 24.");
      printNoteTable();
    }
    
    // Svuota il buffer seriale
    while (Serial.available() > 0) {
      Serial.read();
    }
  }
}
void printNoteTable() {
  Serial.println("\nTabella delle note disponibili:");
  for (int i = 0; i < 24; i++) {
    Serial.print(i + 1);
    Serial.print(": ");
    Serial.print(noteNames[i]);
    Serial.print(" (");
    Serial.print(notes[i]);
    Serial.println(" Hz)");
  }
  Serial.println();
}