inserito selezione della forma d'onda sinusoidale o quadra inserito genrazione dello spartito alla selezione '6' inserito doppio array note e durata inserito accento sulle note

Dependencies:   mbed

Fork of amplificatore_bomboni_rev1 by Amaldi

Revision:
6:be1561f8c63c
Parent:
5:413f85118dd5
diff -r 413f85118dd5 -r be1561f8c63c Sound-Generation.cpp
--- a/Sound-Generation.cpp	Thu May 31 15:24:22 2018 +0000
+++ b/Sound-Generation.cpp	Thu May 31 22:29:23 2018 +0000
@@ -9,25 +9,36 @@
 DigitalOut led2(LED2);
 DigitalOut led3(LED3);
 
+
+// definizione durata note
+#define SEMIBREVE 1000 // durata della semibreve in microsecondi
+#define MINIMA SEMIBREVE/2
+#define SEMIMINIMA MINIMA/2
+#define CROMA SEMIMINIMA/2
+#define SEMICROMA CROMA/2
+#define BISCROMA SEMICROMA/2
+#define SEMIBISCROMA BISCROMA/2
+
+
 // definizione della frequenza delle note ottava centrale del pianoforte
 #define m 0
-#define C 261.63
-#define Cd 277.18
-#define Db 277.18
-#define D 293.66
-#define Dd 311.13
-#define Eb 311.13
-#define E 329.63
-#define F 349.23
-#define Fd 369.99
-#define Gb 369.99
-#define G 392.9
-#define Gd 415.3
-#define Ab 415.3
-#define A 440.0
-#define Ad 466.16
-#define Bb 466.16
-#define B 493.18
+#define C1 261.63
+#define C1d 277.18
+#define D1b 277.18
+#define D1 293.66
+#define D1d 311.13
+#define E1b 311.13
+#define E1 329.63
+#define F1 349.23
+#define F1d 369.99
+#define G1b 369.99
+#define G1 392.9
+#define G1d 415.3
+#define A1b 415.3
+#define A1 440.0
+#define A1d 466.16
+#define B1b 466.16
+#define B1 493.18
 
 
 
@@ -78,8 +89,14 @@
 double fPeriod;
 double dDiatonic[NUMTONE];
 
+// tipo di suono da generare: 0=Sine, 1= Square
+char cSoundWave;
+// tipo di spartito selezionato
+char cScore;
+
 //****************************
 // Create the sinewave buffer
+// // ATTENZIONE ----- SAREBBE MEGLIO CAMBIARE IL NOME DELLA FUNZIONE in CalculateWave[] !!!!! ----
 //****************************
 void CalculateSinewave(int nOffset, int nAmplitude, double fPhase)
 {
@@ -92,56 +109,32 @@
     // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
     double fAngle;
     
-    fDeltaF = 360.0/SAMPLESINENUM;
-    for (nIndex = 0; nIndex < SAMPLESINENUM; nIndex++) 
+    // a seconda della selezione, genera una diversa forma d'onda
+    // ATTENZIONE ----- SAREBBE MEGLIO CAMBIARE IL NOME DELL'ARRAY in usaWave[] !!!!! ----
+    if(cSoundWave=='0')
     {
-        fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide
-        fRads = (PI * fAngle)/180.0; // Convert degree in radian
-        //usaSine[nIndex] = AMPLITUDE * cos(fRads + PHASE) + OFFSET;
-        usaSine[nIndex] = nAmplitude * cos(fRads + fPhase) + nOffset;
-    }
-}
-
-
-//**********************************************
-// Crea le frequenze delle note del pianoforte
-//**********************************************
-void CreateDiatonic()
-{
-    int nTono;
-    int nOttava;
-    
-    // ottava centrale = ottava 4
-    dDiatonic[4*12+0]=261.63;   // C
-    dDiatonic[4*12+1]=277.18;   // C#/Db
-    dDiatonic[4*12+2]=293.66;   // D
-    dDiatonic[4*12+3]=311.13;   // D#/Eb
-    dDiatonic[4*12+4]=329.63;   // E
-    dDiatonic[4*12+5]=349.23;   // F
-    dDiatonic[4*12+6]=369.99;   // F#/Gb
-    dDiatonic[4*12+7]=392.00;   // G
-    dDiatonic[4*12+8]=415.30;   // G#/Ab
-    dDiatonic[4*12+9]=440.00;   // A
-    dDiatonic[4*12+10]=466.16;  // A#/Bb
-    dDiatonic[4*12+11]=493.88;  // B
-    
-    // dalla ottava 5 alla 9
-    for(nOttava=5; nOttava<9; nOttava++)
-    {
-        for(nTono=0; nTono<12; nTono++)
+        // genera forma d'onda sinusoidale
+        fDeltaF = 360.0/SAMPLESINENUM;
+        for (nIndex = 0; nIndex < SAMPLESINENUM; nIndex++) 
         {
-            dDiatonic[(nOttava*12)+nTono]=dDiatonic[((nOttava-1)*12)+nTono]*2;
+            fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide
+            fRads = (PI * fAngle)/180.0; // Convert degree in radian
+            //usaSine[nIndex] = AMPLITUDE * cos(fRads + PHASE) + OFFSET;
+            usaSine[nIndex] = nAmplitude * cos(fRads + fPhase) + nOffset;
         }
-    }
-    
-    // dalla ottava 0 alla 3
-    for(nOttava=3; nOttava>=0; nOttava--)
-    {
-        for(nTono=0; nTono<12; nTono++)
+     }
+     else
+     {
+        // genera forma d'onda quadra. 
+        for (nIndex = 0; nIndex < SAMPLESINENUM/2; nIndex++) 
         {
-            dDiatonic[(nOttava*12)+nTono]=dDiatonic[((nOttava+1)*12)+nTono]/2;
+            usaSine[nIndex] = nAmplitude*(1.0)+ nOffset;
         }
-    }
+        for (nIndex = SAMPLESINENUM/2; nIndex < SAMPLESINENUM; nIndex++) 
+        {
+            usaSine[nIndex] = nAmplitude*(-1.0)+ nOffset;
+        }
+     }   
 }
 
 //***************************
@@ -176,10 +169,19 @@
 //*******************  
 int main()
 {
+    // numero di note che compongono il brano
+    #define SYMPHONYN5DURATION 10 // numero di note che compongono il brano
+    // note del brano
+    float fNoteSymphonyN5 [SYMPHONYN5DURATION] = {m,        G1,     G1,     G1,     E1b,     m,     F1,     F1,     F1,     D1};
+    // durata delle note del brano
+    float fLengthSymphonyN5[SYMPHONYN5DURATION] ={CROMA,    CROMA,  CROMA,  CROMA,  MINIMA, CROMA,  CROMA,  CROMA,  CROMA,  MINIMA};
+    // indice per i cicli
+    int nIndex;
+    
+    
     // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
     pc.baud(921600); //921600 bps
     
-    
     // messaggio di benvenuto
     pc.printf("\r\nHallo Amaldi Students - Exercise 9 \r\n");
     pc.printf("\r\n*** Amaldi Vs Beethoven ***\r\n");
@@ -201,354 +203,230 @@
     wait_ms(1000);
     led3=0;
     
-    
-    
+    pc.printf("\r\n*** Select SoundWave ***\r\n");
+    pc.printf("\r\n> 0: Sine ***\r\n");
+    pc.printf("\r\n> 1: Square ***\r\n");
+    while(pc.readable())
+    {
+        // acquisisce il suono da generare
+        cSoundWave = pc.getc();   
+    }   
+     
     pc.printf("\r\n*** Select Score ***\r\n");
     pc.printf("\r\n> 0: Lalala land ***\r\n");
     pc.printf("\r\n> 1: Minuetto  ***\r\n");
     pc.printf("\r\n> 2: Prima invenzione ***\r\n");
     pc.printf("\r\n> 3: Nona sinfonia  ***\r\n");
-    pc.printf("\r\n> 4: When the saint go macinin  ***\r\n");
+    pc.printf("\r\n> 4: When the saint go marching in  ***\r\n");
     pc.printf("\r\n> 5: Preludio  ***\r\n");
-    pc.printf("\r\n> 6:   ***\r\n");
+    pc.printf("\r\n> 6: Quinta Sinfonia  ***\r\n");
     pc.printf("\r\n> 7: Minuetto  ***\r\n");
     pc.printf("\r\n> 8: Minuetto  ***\r\n");
     pc.printf("\r\n> 9: Me Composer  ***\r\n");
-    //dichiarazione array pause
-      float pausa [7]; 
-      pausa [1] = 1 ; //semibreve
-      pausa [2] = 0.5; //minima
-      pausa [3] = 0.25;//semiminima
-      pausa [4] = 0.125;//croma
-      pausa [5] = 0.0625;//semicroma
-      pausa [6] = 0.03125;//semibiscroma 
-    //dichiarazione matrice
-     float note [25][7];
-      note [1][1] =  261.63,1;//Do semibreve (Frequenza),(Tempo in s)
-      note [1][2] =  261.63,0.5;//Do minima
-      note [1][3] =  261.63,0.25;//Do semiminima
-      note [1][4] =  261.63,0.125;//Do croma
-      note [1][5] =  261.63,0.0625;//Do semicroma
-      note [1][6] =  261.63,0.03125;//Do semibiscroma
-      note [2][1] =  293.66,1;//Re semibreve
-      note [2][2] =  293.66,0.5;//Re minima
-      note [2][3] =  293.66,0.25;//Re semiminima
-      note [2][4] =  293.66,0.125;//Re croma
-      note [2][5] =  293.66,0.0625;//Re semicroma
-      note [2][6] =  293.66,0.03125;//Re semibiscroma
-      note [3][1] =  330.00,1;//Mi semibreve
-      note [3][2] =  330.00,0.5;//Mi minima
-      note [3][3] =  330.00,0.25;//Mi semiminima
-      note [3][4] =  330.00,0.125;//Mi croma
-      note [3][5] =  330.00,0.0625;//Mi semicroma
-      note [3][6] =  330.00,0.03125;//Mi semibiscroma
-      note [4][1] =  349.00,1;//Fa semibreve
-      note [4][2] =  349.00,0.5;//Fa minima
-      note [4][3] =  349.00,0.25;//Fa semiminima
-      note [4][4] =  349.00,0.125;//Fa croma
-      note [4][5] =  349.00,0.0625;//Fa semicroma
-      note [4][6] =  349.00,0.03125;//Fa semibiscroma
-      note [5][1] =  392.00,1;//Sol semibreve
-      note [5][2] =  392.00,0.5;//Sol minima
-      note [5][3] =  392.00,0.25;//Sol semiminima
-      note [5][4] =  392.00,0.125;//Sol croma
-      note [5][5] =  392.00,0.0625;//Sol semicroma
-      note [5][6] =  392.00,0.03125;//Sol semibiscroma
-      note [6][1] =  440.00,1;//La semibreve
-      note [6][2] =  440.00,0.5;//la minima
-      note [6][3] =  349.00,0.25;//La semiminima
-      note [6][4] =  440.00,0.125;//La croma
-      note [6][5] =  440.00,0.0625;//La semicroma
-      note [6][6] =  440.00,0.03125;//La semibiscroma
-      note [7][1] =  494.00,1;//Si semibreve
-      note [7][2] =  494.00,0.5;//Si minima
-      note [7][3] =  494.00,0.25;//Si semiminima
-      note [7][4] =  494.00,0.125;//Si croma
-      note [7][5] =  494.00,0.0625;//Si semicroma
-      note [7][6] =  494.00,0.03125;//Si semibiscroma
-      note [8][1] =  277.18,1;//Do# semibreve
-      note [8][2] =  277.18,0.5;//Do# minima
-      note [8][3] =  277.18,0.25;//Do# semiminima
-      note [8][4] =  277.18,0.125;//Do# croma
-      note [8][5] =  277.18,0.0625;//Do# semicroma
-      note [8][6] =  277.18,0.03125;//Do# semibiscroma
-      note [9][1] =  311.13,1;//Re# semibreve
-      note [9][2] =  311.13,0.5;//Re# minima
-      note [9][3] =  311.13,0.25;//Re# semiminima
-      note [9][4] =  311.13,0.125;//Re#croma
-      note [9][5] =  311.13,0.0625;//Re# semicroma
-      note [9][6] =  311.13,0.03125;//Re# semibiscroma
-      note [10][1] =  370.00,1;//Fa# semibreve
-      note [10][2] =  370.00,0.5;//Fa# minima
-      note [10][3] =  370.00,0.25;//fa# semiminima
-      note [10][4] =  370.00,0.125;//Fa#croma
-      note [10][5] =  370.00,0.0625;//Fa# semicroma
-      note [10][6] =  370.00,0.03125;//Fa# semibiscroma
-      note [11][1] =  370.00,1;//Fa# semibreve
-      note [11][2] =  370.00,0.5;//Fa# minima
-      note [11][3] =  370.00,0.25;//fa# semiminima
-      note [11][4] =  370.00,0.125;//Fa#croma
-      note [11][5] =  370.00,0.0625;//Fa# semicroma
-      note [11][6] =  370.00,0.03125;//Fa# semibiscroma
-      note [12][1] =  370.00,1;//Sol# semibreve
-      note [12][2] =  370.00,0.5;//Sol# minima
-      note [12][3] =  370.00,0.25;//Sol# semiminima
-      note [12][4] =  370.00,0.125;//Sol#croma
-      note [12][5] =  370.00,0.0625;//Sol# semicroma
-      note [12][6] =  370.00,0.03125;//Sol# semibiscroma 
-      note [13][1] =  370.00,1;//La# semibreve
-      note [13][2] =  370.00,0.5;//La# minima
-      note [13][3] =  370.00,0.25;//La# semiminima
-      note [13][4] =  370.00,0.125;//La#croma
-      note [13][5] =  370.00,0.0625;//La# semicroma
-      note [13][6] =  370.00,0.03125;//La# semibiscroma
-      note [14][1] =  523.00,1;//Do 5° semibreve 
-      note [14][2] =  523.00,0.5;//Do 5° minima 
-      note [14][3] =  523.00,0.25;//Do 5° semiminima 
-      note [14][4] =  523.00,0.125;//Do 5° croma 
-      note [14][5] =  523.00,0.0625;//Do 5° semicroma 
-      note [14][6] =  523.00,0.03125;//Do 5° semibiscroma  
-      note [15][1] =  523.00,1;//Do# 5° semibreve 
-      note [15][2] =  523.00,0.5;//Do# 5° minima 
-      note [15][3] =  523.00,0.25;//Do# 5° semiminima 
-      note [15][4] =  523.00,0.125;//Do# 5° croma 
-      note [15][5] =  523.00,0.0625;//Do# 5° semicroma 
-      note [15][6] =  523.00,0.03125;//Do# 5° semibiscroma 
-      note [16][1] =  622.00,1;//Re# 5° semibreve 
-      note [16][2] =  622.00,0.5;//Re# 5° minima 
-      note [16][3] =  622.00,0.25;//Re# 5° semiminima 
-      note [16][4] =  622.00,0.125;//Re# 5° croma 
-      note [16][5] =  622.00,0.0625;//Re# 5° semicroma 
-      note [16][6] =  622.00,0.03125;//Re# 5° semibiscroma
-      note [17][1] =  587.00,1;//Re 5° semibreve 
-      note [17][2] =  587.00,0.5;//Re 5° minima 
-      note [17][3] =  587.00,0.25;//Re 5° semiminima 
-      note [17][4] =  587.00,0.125;//Re 5° croma 
-      note [17][5] =  587.00,0.0625;//Re 5° semicroma 
-      note [17][6] =  587.00,0.03125;//Re 5° semibiscroma   
-      note [18][1] =  659.00,1;//Mi 5° semibreve 
-      note [18][2] =  659.00,0.5;//Mi 5° minima 
-      note [18][3] =  659.00,0.25;//Mi 5° semiminima 
-      note [18][4] =  659.00,0.125;//Mi 5° croma 
-      note [18][5] =  659.00,0.0625;//Mi 5° semicroma 
-      note [18][6] =  659.00,0.03125;//Mi 5° semibiscroma 
-      note [19][1] =  698.00,1;//Fa 5° semibreve 
-      note [19][2] =  698.00,0.5;//Fa 5° minima 
-      note [19][3] =  698.00,0.25;//Fa 5° semiminima 
-      note [19][4] =  698.00,0.125;//Fa 5° croma 
-      note [19][5] =  698.00,0.0625;//Fa 5° semicroma 
-      note [19][6] =  698.00,0.03125;//Fa 5° semibiscroma 
-      note [20][1] =  740.00,1;//Fa# 5° semibreve 
-      note [20][2] =  740.00,0.5;//Fa# 5° minima 
-      note [20][3] =  740.00,0.25;//Fa# 5° semiminima 
-      note [20][4] =  740.00,0.125;//Fa# 5° croma 
-      note [20][5] =  740.00,0.0625;//Fa# 5° semicroma 
-      note [20][6] =  740.00,0.03125;//Fa# 5° semibiscroma 
-      note [21][1] =  784.00,1;//Sol 5° semibreve 
-      note [21][2] =  784.00,0.5;//Sol 5° minima 
-      note [21][3] =  784.00,0.25;//Sol 5° semiminima 
-      note [21][4] =  784.00,0.125;//Sol 5° croma 
-      note [21][5] =  784.00,0.0625;//Sol 5° semicroma 
-      note [21][6] =  784.00,0.03125;//Sol 5° semibiscroma 
-      note [22][1] =  831.00,1;//Sol# 5° semibreve 
-      note [22][2] =  831.00,0.5;//Sol# 5° minima 
-      note [22][3] =  831.00,0.25;//Sol# 5° semiminima 
-      note [22][4] =  831.00,0.125;//Sol# 5° croma 
-      note [22][5] =  831.00,0.0625;//Sol# 5° semicroma 
-      note [22][6] =  831.00,0.03125;//Sol# 5° semibiscroma  
-      note [23][1] =  880.00,1;//La 5° semibreve 
-      note [23][2] =  880.00,0.5;//La 5° minima 
-      note [23][3] =  880.00,0.25;//La 5° semiminima 
-      note [23][4] =  880.00,0.125;//La 5° croma 
-      note [23][5] =  880.00,0.0625;//La 5° semicroma 
-      note [23][6] =  880.00,0.03125;//La 5° semibiscroma  
-      note [24][1] =  932.00,1;//La# 5° semibreve 
-      note [24][2] =  932.00,0.5;//La# 5° minima 
-      note [24][3] =  932.00,0.25;//La# 5° semiminima 
-      note [24][4] =  932.00,0.125;//La# 5° croma 
-      note [24][5] =  932.00,0.0625;//La# 5° semicroma 
-      note [24][6] =  932.00,0.03125;//La# 5° semibiscroma 
-      note [25][1] =  988.00,1;//Si 5° semibreve 
-      note [25][2] =  988.00,0.5;//Si 5° minima 
-      note [25][3] =  988.00,0.25;//Si 5° semiminima 
-      note [25][4] =  988.00,0.125;//Si 5° croma 
-      note [25][5] =  988.00,0.0625;//Si 5° semicroma 
-      note [25][6] =  988.00,0.03125;//Si 5° semibiscroma     
-    while(true)
-    {     
-        // verifica se è arrivato un carattere dalla seriale del pc
-        if(pc.readable())
+    while(pc.readable())
+    {
+        // acquisisce il suono da generare
+        cScore = pc.getc();   
+    }   
+    
+    // suona lo spartito selezionato   
+    if(cScore == '6')
+    {
+        // abilita la generazione di suoni
+        bStop=false;
+        // genera le note indicate nell'array spartito con la durata indicata nell'array length 
+        for(nIndex=0; nIndex<SYMPHONYN5DURATION; nIndex++)
         {
-            cReadChar = pc.getc(); // Read hyperterminal  
-        
-              
-             // genera la nota corrispondente al carattere ricevuto
-            switch(cReadChar)
-            {
-                //La#
-                case 'u':
-                case 'U':
-                {
-                    fFreq=466.16;// frequenza della sinusoide La#
-                    pc.printf("\n\r--- Generazione La#_SIb= %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                //sol#
-                case 'y':
-                case 'Y':
-                {
-                    fFreq=415.3;// frequenza della sinusoide Sol#
-                    pc.printf("\n\r--- Generazione Sol#_LAb = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                //Sol_b
-                case 't':
-                case 'T':
-                {
-                    fFreq=369.99;// frequenza della sinusoide Sol_b
-                    pc.printf("\n\r--- Generazione Solb_Fa# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-               //DO#
-                case 'e':
-                case 'E':
-                {
-                    fFreq=277.18;// frequenza della sinusoide DO diesis
-                    pc.printf("\n\r--- Generazione DO# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;   
-                //DO
-                case 'd':
-                case 'D':
-                {
-                    fFreq=261.63;// frequenza della sinusoide DO da generare
-                    pc.printf("\n\r--- Generazione DO = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                // RE
-                case 'f':
-                case 'F':
-                {
-                    fFreq=293.66;// frequenza della sinusoide RE da generare
-                    pc.printf("\n\r--- Generazione RE = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                // RE#/MIb
-                case 'r':
-                case 'R':
-                {
-                    fFreq=311.13;
-                    pc.printf("\n\r--- Generazione Mib = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                case 'g':
-                case 'G':
-                {
-                    fFreq=329.63; // frequenza della sinusoide MI da generare
-                    pc.printf("\n\r--- Generazione MI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                case 'h':
-                case 'H':
-                {
-                    fFreq=349.23;// frequenza della sinusoide FA da generare
-                    pc.printf("\n\r--- Generazione FA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                
-                // SOL
-                case 'j':
-                case 'J':
-                {
-                    fFreq=392.0;
-                    pc.printf("\n\r--- Generazione SOL = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                // LA
-                case 'k':
-                case 'K':
-                {
-                    fFreq=440.0; // frequenza della sinusoide LA da generare
-                    pc.printf("\n\r--- Generazione LA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                //SI
-                case 'l':
-                case 'L':
-                {
-                    fFreq=493.88;// frequenza della sinusoide SI da generare
-                    pc.printf("\n\r--- Generazione SI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                //DO 5°
-                case 'z':
-                case 'Z':
-                {
-                    fFreq=523.00;// frequenza della sinusoide SI da generare
-                    pc.printf("\n\r--- Generazione DO5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                //RE 5°
-                case 'x':
-                case 'X':
-                {
-                    fFreq=587.00;// frequenza della sinusoide SI da generare
-                    pc.printf("\n\r--- Generazione RE5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                    bStop = false;
-                } break;
-                
-                // pausa
-                case ' ':
-                {
-                    bStop = true;
-                    pc.printf("\n\r--- Generazione pausa = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                   
-                } break;
-                //prova
-                case 'o':
-                {
-                     fFreq=587.00;
-                     wait_ms(600);
-                     fFreq=392.00;
-                     wait_ms(300);
-                     fFreq=440.00;
-                     wait_ms(300);
-                     fFreq=493.88;
-                     wait_ms(300);
-                     fFreq=523.16;
-                     wait_ms(300);
-                } break;
-                //Stop
-                case 'b':
-                case 'B':
-                {
-                   
-                   fFreq=0;// stop
-                    pc.printf("\n\r--- Generazione Stop = %.2f Hz ampiezza nominale ---\n\r", fFreq);
-                   bStop = false;
-                } break;
-                
-                default:
-                {
-                    bStop=true; // se la nota non è riconosciuta blocca la generazione
-                    pc.printf("\n\r--- Wrong Tone ---\n\r");
-                } break;  
-            } // switch (cReadChar)
-            
-            // genera la frequenza relativa alla nota che è stata selezionata
+            // genera la frequenza relativa alla nota selezionata, da nIndex, nello spartito
+            fFreq=fNoteSymphonyN5[nIndex];
             fAmp = 0.1; // coefficiente per il quale viene moltiplicato l'ampiezza massima
             fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
             CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
             SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
-         
             
+            //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
+            wait_ms(fLengthSymphonyN5[nIndex]);
         }
-        else // se non è stato premuto nessun tasto
+    }
+    else
+    {
+        if(cScore=='9')
         {
-           
-        } 
-     }   
- 
+            while(true)
+            {   
+                // verifica se è arrivato un carattere dalla seriale del pc
+                if(pc.readable())
+                {
+                    cReadChar = pc.getc(); // Read hyperterminal
+                                   
+                    // genera la nota corrispondente al carattere ricevuto
+                    switch(cReadChar)
+                    {
+                        //La#
+                        case 'u':
+                        case 'U':
+                        {
+                            fFreq=466.16;// frequenza della sinusoide La#
+                            pc.printf("\n\r--- Generazione La#_SIb= %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        //sol#
+                        case 'y':
+                        case 'Y':
+                        {
+                            fFreq=415.3;// frequenza della sinusoide Sol#
+                            pc.printf("\n\r--- Generazione Sol#_LAb = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        //Sol_b
+                        case 't':
+                        case 'T':
+                        {
+                            fFreq=369.99;// frequenza della sinusoide Sol_b
+                            pc.printf("\n\r--- Generazione Solb_Fa# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                       //DO#
+                        case 'e':
+                        case 'E':
+                        {
+                            fFreq=277.18;// frequenza della sinusoide DO diesis
+                            pc.printf("\n\r--- Generazione DO# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;   
+                        //DO
+                        case 'd':
+                        case 'D':
+                        {
+                            fFreq=261.63;// frequenza della sinusoide DO da generare
+                            pc.printf("\n\r--- Generazione DO = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        // RE
+                        case 'f':
+                        case 'F':
+                        {
+                            fFreq=293.66;// frequenza della sinusoide RE da generare
+                            pc.printf("\n\r--- Generazione RE = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        // RE#/MIb
+                        case 'r':
+                        case 'R':
+                        {
+                            fFreq=311.13;
+                            pc.printf("\n\r--- Generazione Mib = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        case 'g':
+                        case 'G':
+                        {
+                            fFreq=329.63; // frequenza della sinusoide MI da generare
+                            pc.printf("\n\r--- Generazione MI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        case 'h':
+                        case 'H':
+                        {
+                            fFreq=349.23;// frequenza della sinusoide FA da generare
+                            pc.printf("\n\r--- Generazione FA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        
+                        // SOL
+                        case 'j':
+                        case 'J':
+                        {
+                            fFreq=392.0;
+                            pc.printf("\n\r--- Generazione SOL = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        // LA
+                        case 'k':
+                        case 'K':
+                        {
+                            fFreq=440.0; // frequenza della sinusoide LA da generare
+                            pc.printf("\n\r--- Generazione LA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        //SI
+                        case 'l':
+                        case 'L':
+                        {
+                            fFreq=493.88;// frequenza della sinusoide SI da generare
+                            pc.printf("\n\r--- Generazione SI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        //DO 5°
+                        case 'z':
+                        case 'Z':
+                        {
+                            fFreq=523.00;// frequenza della sinusoide SI da generare
+                            pc.printf("\n\r--- Generazione DO5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        //RE 5°
+                        case 'x':
+                        case 'X':
+                        {
+                            fFreq=587.00;// frequenza della sinusoide SI da generare
+                            pc.printf("\n\r--- Generazione RE5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                            bStop = false;
+                        } break;
+                        
+                        // pausa
+                        case ' ':
+                        {
+                            bStop = true;
+                            pc.printf("\n\r--- Generazione pausa = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                           
+                        } break;
+                        //prova
+                        case 'o':
+                        {
+                             fFreq=587.00;
+                             wait_ms(600);
+                             fFreq=392.00;
+                             wait_ms(300);
+                             fFreq=440.00;
+                             wait_ms(300);
+                             fFreq=493.88;
+                             wait_ms(300);
+                             fFreq=523.16;
+                             wait_ms(300);
+                        } break;
+                        //Stop
+                        case 'b':
+                        case 'B':
+                        {
+                           
+                           fFreq=0;// stop
+                            pc.printf("\n\r--- Generazione Stop = %.2f Hz ampiezza nominale ---\n\r", fFreq);
+                           bStop = false;
+                        } break;
+                        
+                        default:
+                        {
+                            bStop=true; // se la nota non è riconosciuta blocca la generazione
+                            pc.printf("\n\r--- Wrong Tone ---\n\r");
+                        } break;  
+                    } // switch (cReadChar)
+                    
+                    // genera la frequenza relativa alla nota che è stata selezionata
+                    fAmp = 0.1; // coefficiente per il quale viene moltiplicato l'ampiezza massima
+                    fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
+                    CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
+                    SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
+                 
+                    
+                }
+                else // se non è stato premuto nessun tasto
+                {
+                   
+                } 
+            } // while   
+        } // cScore = '9'
+    }
     /******* START ONDA DIGITALE FUNZIONA *****
     led1=1;
     led2=1;