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

Committer:
pinofal
Date:
Thu May 31 22:29:23 2018 +0000
Revision:
6:be1561f8c63c
Parent:
5:413f85118dd5
inserito selezione di forma d'onda del suono; inserito la generazione di uno spartito alla selezione '6'

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pinofal 2:93bba36e0c06 1 // Tested : NUCLEO F207ZG
pinofal 2:93bba36e0c06 2 #include "mbed.h"
Vito1704 5:413f85118dd5 3 #include<stdlib.h>
pinofal 2:93bba36e0c06 4 // Definizione periferiche
pinofal 2:93bba36e0c06 5 Serial pc(USBTX, USBRX);
pinofal 2:93bba36e0c06 6 AnalogOut OutWave(PA_5);
pinofal 2:93bba36e0c06 7 //DigitalOut DigitalWave(PA_5);
pinofal 2:93bba36e0c06 8 DigitalOut led1(LED1);
pinofal 2:93bba36e0c06 9 DigitalOut led2(LED2);
pinofal 2:93bba36e0c06 10 DigitalOut led3(LED3);
pinofal 2:93bba36e0c06 11
pinofal 6:be1561f8c63c 12
pinofal 6:be1561f8c63c 13 // definizione durata note
pinofal 6:be1561f8c63c 14 #define SEMIBREVE 1000 // durata della semibreve in microsecondi
pinofal 6:be1561f8c63c 15 #define MINIMA SEMIBREVE/2
pinofal 6:be1561f8c63c 16 #define SEMIMINIMA MINIMA/2
pinofal 6:be1561f8c63c 17 #define CROMA SEMIMINIMA/2
pinofal 6:be1561f8c63c 18 #define SEMICROMA CROMA/2
pinofal 6:be1561f8c63c 19 #define BISCROMA SEMICROMA/2
pinofal 6:be1561f8c63c 20 #define SEMIBISCROMA BISCROMA/2
pinofal 6:be1561f8c63c 21
pinofal 6:be1561f8c63c 22
pinofal 2:93bba36e0c06 23 // definizione della frequenza delle note ottava centrale del pianoforte
francesco01 4:6225b049c06b 24 #define m 0
pinofal 6:be1561f8c63c 25 #define C1 261.63
pinofal 6:be1561f8c63c 26 #define C1d 277.18
pinofal 6:be1561f8c63c 27 #define D1b 277.18
pinofal 6:be1561f8c63c 28 #define D1 293.66
pinofal 6:be1561f8c63c 29 #define D1d 311.13
pinofal 6:be1561f8c63c 30 #define E1b 311.13
pinofal 6:be1561f8c63c 31 #define E1 329.63
pinofal 6:be1561f8c63c 32 #define F1 349.23
pinofal 6:be1561f8c63c 33 #define F1d 369.99
pinofal 6:be1561f8c63c 34 #define G1b 369.99
pinofal 6:be1561f8c63c 35 #define G1 392.9
pinofal 6:be1561f8c63c 36 #define G1d 415.3
pinofal 6:be1561f8c63c 37 #define A1b 415.3
pinofal 6:be1561f8c63c 38 #define A1 440.0
pinofal 6:be1561f8c63c 39 #define A1d 466.16
pinofal 6:be1561f8c63c 40 #define B1b 466.16
pinofal 6:be1561f8c63c 41 #define B1 493.18
pinofal 2:93bba36e0c06 42
pinofal 2:93bba36e0c06 43
pinofal 2:93bba36e0c06 44
pinofal 2:93bba36e0c06 45
pinofal 2:93bba36e0c06 46
pinofal 2:93bba36e0c06 47
pinofal 2:93bba36e0c06 48 // numero di campioni che compongono un periodo della sinusoide in Output sull'ADC
pinofal 2:93bba36e0c06 49 #define SAMPLESINENUM 45// consigliabile avere multipli di 45
pinofal 2:93bba36e0c06 50
pinofal 2:93bba36e0c06 51 // parametri dell'onda coseno da generare
pinofal 2:93bba36e0c06 52 #define PI (3.141592653589793238462)
pinofal 2:93bba36e0c06 53 #define AMPLITUDE 32767 //(1.0) // x * 3.3V
pinofal 2:93bba36e0c06 54 #define PHASE (PI/2) // 2*pi è un periodo
pinofal 2:93bba36e0c06 55 #define OFFSET 32767 //(0x7FFF)
pinofal 2:93bba36e0c06 56
pinofal 2:93bba36e0c06 57 // numero di note componenti la scala diatonica
pinofal 2:93bba36e0c06 58 #define NUMTONE 120
pinofal 2:93bba36e0c06 59
pinofal 2:93bba36e0c06 60 // Output LED di diagnostica
pinofal 2:93bba36e0c06 61 DigitalOut led(LED1);
pinofal 2:93bba36e0c06 62
pinofal 2:93bba36e0c06 63 // ticker per la generazione dell'onda con DAC
pinofal 2:93bba36e0c06 64 Ticker SampleOutTicker;
pinofal 2:93bba36e0c06 65
pinofal 2:93bba36e0c06 66 // Buffer contenente la sinusoide da porre in output.
pinofal 2:93bba36e0c06 67 unsigned short usaSine[SAMPLESINENUM];
pinofal 2:93bba36e0c06 68
pinofal 2:93bba36e0c06 69 // prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
pinofal 2:93bba36e0c06 70 void CalculateSinewave(void);
pinofal 2:93bba36e0c06 71
pinofal 2:93bba36e0c06 72 // carattere in arrivo dal PC
pinofal 2:93bba36e0c06 73 volatile char cReadChar;
Vito1704 5:413f85118dd5 74 volatile char CReadMusic;
pinofal 2:93bba36e0c06 75 // indice, nell'array, del campione da porre in output
pinofal 2:93bba36e0c06 76 volatile int nSampleOutIndex;
pinofal 2:93bba36e0c06 77 // contatore dei campioni in output sul DAC
pinofal 2:93bba36e0c06 78 volatile int nSampleOutCount;
pinofal 2:93bba36e0c06 79 // Periodo di generazione campioni in output DeltaT = T/NumSample
pinofal 2:93bba36e0c06 80 double fDeltaT;
pinofal 2:93bba36e0c06 81 // amplificazione per il dato da spedire sull'ADC
pinofal 2:93bba36e0c06 82 volatile double fAmp;
pinofal 2:93bba36e0c06 83 //volatile double fAmpNew;
pinofal 2:93bba36e0c06 84 // flag per bloccare la generazione del segnale
pinofal 2:93bba36e0c06 85 volatile bool bStop;
pinofal 2:93bba36e0c06 86 // frequenza segnale da generare
pinofal 2:93bba36e0c06 87 volatile double fFreq;
pinofal 2:93bba36e0c06 88 // periodo della sinusoide da generare
pinofal 2:93bba36e0c06 89 double fPeriod;
pinofal 2:93bba36e0c06 90 double dDiatonic[NUMTONE];
pinofal 2:93bba36e0c06 91
pinofal 6:be1561f8c63c 92 // tipo di suono da generare: 0=Sine, 1= Square
pinofal 6:be1561f8c63c 93 char cSoundWave;
pinofal 6:be1561f8c63c 94 // tipo di spartito selezionato
pinofal 6:be1561f8c63c 95 char cScore;
pinofal 6:be1561f8c63c 96
pinofal 2:93bba36e0c06 97 //****************************
pinofal 2:93bba36e0c06 98 // Create the sinewave buffer
pinofal 6:be1561f8c63c 99 // // ATTENZIONE ----- SAREBBE MEGLIO CAMBIARE IL NOME DELLA FUNZIONE in CalculateWave[] !!!!! ----
pinofal 2:93bba36e0c06 100 //****************************
pinofal 2:93bba36e0c06 101 void CalculateSinewave(int nOffset, int nAmplitude, double fPhase)
pinofal 2:93bba36e0c06 102 {
pinofal 2:93bba36e0c06 103 // variabile contenente l'angolo in radianti
pinofal 2:93bba36e0c06 104 double fRads;
pinofal 2:93bba36e0c06 105 // indici per i cicli
pinofal 2:93bba36e0c06 106 int nIndex;
pinofal 2:93bba36e0c06 107 // passo in frequenza fissato dal numero di campioni in cui voglio dividere un periodo di sinusoide: DeltaF = 360°/NUMSAMPLE
pinofal 2:93bba36e0c06 108 double fDeltaF;
pinofal 2:93bba36e0c06 109 // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
pinofal 2:93bba36e0c06 110 double fAngle;
pinofal 2:93bba36e0c06 111
pinofal 6:be1561f8c63c 112 // a seconda della selezione, genera una diversa forma d'onda
pinofal 6:be1561f8c63c 113 // ATTENZIONE ----- SAREBBE MEGLIO CAMBIARE IL NOME DELL'ARRAY in usaWave[] !!!!! ----
pinofal 6:be1561f8c63c 114 if(cSoundWave=='0')
pinofal 2:93bba36e0c06 115 {
pinofal 6:be1561f8c63c 116 // genera forma d'onda sinusoidale
pinofal 6:be1561f8c63c 117 fDeltaF = 360.0/SAMPLESINENUM;
pinofal 6:be1561f8c63c 118 for (nIndex = 0; nIndex < SAMPLESINENUM; nIndex++)
pinofal 2:93bba36e0c06 119 {
pinofal 6:be1561f8c63c 120 fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide
pinofal 6:be1561f8c63c 121 fRads = (PI * fAngle)/180.0; // Convert degree in radian
pinofal 6:be1561f8c63c 122 //usaSine[nIndex] = AMPLITUDE * cos(fRads + PHASE) + OFFSET;
pinofal 6:be1561f8c63c 123 usaSine[nIndex] = nAmplitude * cos(fRads + fPhase) + nOffset;
pinofal 2:93bba36e0c06 124 }
pinofal 6:be1561f8c63c 125 }
pinofal 6:be1561f8c63c 126 else
pinofal 6:be1561f8c63c 127 {
pinofal 6:be1561f8c63c 128 // genera forma d'onda quadra.
pinofal 6:be1561f8c63c 129 for (nIndex = 0; nIndex < SAMPLESINENUM/2; nIndex++)
pinofal 2:93bba36e0c06 130 {
pinofal 6:be1561f8c63c 131 usaSine[nIndex] = nAmplitude*(1.0)+ nOffset;
pinofal 2:93bba36e0c06 132 }
pinofal 6:be1561f8c63c 133 for (nIndex = SAMPLESINENUM/2; nIndex < SAMPLESINENUM; nIndex++)
pinofal 6:be1561f8c63c 134 {
pinofal 6:be1561f8c63c 135 usaSine[nIndex] = nAmplitude*(-1.0)+ nOffset;
pinofal 6:be1561f8c63c 136 }
pinofal 6:be1561f8c63c 137 }
pinofal 2:93bba36e0c06 138 }
pinofal 2:93bba36e0c06 139
pinofal 2:93bba36e0c06 140 //***************************
pinofal 2:93bba36e0c06 141 // generazione sample da DAC
pinofal 2:93bba36e0c06 142 //***************************
pinofal 2:93bba36e0c06 143 void SampleOut()
pinofal 2:93bba36e0c06 144 {
pinofal 2:93bba36e0c06 145 // se è stato inviato il comando Stop, non fare niente fino a nuovo comando
pinofal 2:93bba36e0c06 146 if(bStop)
pinofal 2:93bba36e0c06 147 {
pinofal 2:93bba36e0c06 148 }
pinofal 2:93bba36e0c06 149 else // se non è stato inviato il comando di bStop continua
pinofal 2:93bba36e0c06 150 {
pinofal 2:93bba36e0c06 151 // output del campione della forma d'onda
pinofal 2:93bba36e0c06 152 OutWave.write_u16(usaSine[nSampleOutIndex]);
pinofal 2:93bba36e0c06 153
pinofal 2:93bba36e0c06 154 // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSampleOutIndex va da 0 a 359
pinofal 2:93bba36e0c06 155 nSampleOutIndex++;
pinofal 2:93bba36e0c06 156 if(nSampleOutIndex >= SAMPLESINENUM)
pinofal 2:93bba36e0c06 157 {
pinofal 2:93bba36e0c06 158 nSampleOutIndex=0;
pinofal 2:93bba36e0c06 159 }
pinofal 2:93bba36e0c06 160
pinofal 2:93bba36e0c06 161 }
pinofal 2:93bba36e0c06 162 }
pinofal 2:93bba36e0c06 163
pinofal 2:93bba36e0c06 164
pinofal 2:93bba36e0c06 165
pinofal 2:93bba36e0c06 166
pinofal 2:93bba36e0c06 167 //*******************
pinofal 2:93bba36e0c06 168 // Loop Principale
pinofal 2:93bba36e0c06 169 //*******************
pinofal 2:93bba36e0c06 170 int main()
pinofal 2:93bba36e0c06 171 {
pinofal 6:be1561f8c63c 172 // numero di note che compongono il brano
pinofal 6:be1561f8c63c 173 #define SYMPHONYN5DURATION 10 // numero di note che compongono il brano
pinofal 6:be1561f8c63c 174 // note del brano
pinofal 6:be1561f8c63c 175 float fNoteSymphonyN5 [SYMPHONYN5DURATION] = {m, G1, G1, G1, E1b, m, F1, F1, F1, D1};
pinofal 6:be1561f8c63c 176 // durata delle note del brano
pinofal 6:be1561f8c63c 177 float fLengthSymphonyN5[SYMPHONYN5DURATION] ={CROMA, CROMA, CROMA, CROMA, MINIMA, CROMA, CROMA, CROMA, CROMA, MINIMA};
pinofal 6:be1561f8c63c 178 // indice per i cicli
pinofal 6:be1561f8c63c 179 int nIndex;
pinofal 6:be1561f8c63c 180
pinofal 6:be1561f8c63c 181
pinofal 2:93bba36e0c06 182 // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
pinofal 2:93bba36e0c06 183 pc.baud(921600); //921600 bps
pinofal 2:93bba36e0c06 184
pinofal 2:93bba36e0c06 185 // messaggio di benvenuto
pinofal 2:93bba36e0c06 186 pc.printf("\r\nHallo Amaldi Students - Exercise 9 \r\n");
Vito1704 5:413f85118dd5 187 pc.printf("\r\n*** Amaldi Vs Beethoven ***\r\n");
pinofal 2:93bba36e0c06 188
pinofal 2:93bba36e0c06 189 //inizializza variabili
pinofal 2:93bba36e0c06 190 cReadChar = 0;
pinofal 2:93bba36e0c06 191 nSampleOutIndex=0;
pinofal 2:93bba36e0c06 192 nSampleOutCount=0;
pinofal 2:93bba36e0c06 193 bStop=true;
pinofal 2:93bba36e0c06 194
pinofal 2:93bba36e0c06 195 // test dei LED
pinofal 2:93bba36e0c06 196 led1=1; //Verde
pinofal 2:93bba36e0c06 197 wait_ms(1000);
pinofal 2:93bba36e0c06 198 led1=0;
pinofal 2:93bba36e0c06 199 led2=1; // Blu
pinofal 2:93bba36e0c06 200 wait_ms(1000);
pinofal 2:93bba36e0c06 201 led2=0;
pinofal 2:93bba36e0c06 202 led3=1; //Rosso
pinofal 2:93bba36e0c06 203 wait_ms(1000);
pinofal 2:93bba36e0c06 204 led3=0;
pinofal 2:93bba36e0c06 205
pinofal 6:be1561f8c63c 206 pc.printf("\r\n*** Select SoundWave ***\r\n");
pinofal 6:be1561f8c63c 207 pc.printf("\r\n> 0: Sine ***\r\n");
pinofal 6:be1561f8c63c 208 pc.printf("\r\n> 1: Square ***\r\n");
pinofal 6:be1561f8c63c 209 while(pc.readable())
pinofal 6:be1561f8c63c 210 {
pinofal 6:be1561f8c63c 211 // acquisisce il suono da generare
pinofal 6:be1561f8c63c 212 cSoundWave = pc.getc();
pinofal 6:be1561f8c63c 213 }
pinofal 6:be1561f8c63c 214
Vito1704 5:413f85118dd5 215 pc.printf("\r\n*** Select Score ***\r\n");
Vito1704 5:413f85118dd5 216 pc.printf("\r\n> 0: Lalala land ***\r\n");
Vito1704 5:413f85118dd5 217 pc.printf("\r\n> 1: Minuetto ***\r\n");
Vito1704 5:413f85118dd5 218 pc.printf("\r\n> 2: Prima invenzione ***\r\n");
Vito1704 5:413f85118dd5 219 pc.printf("\r\n> 3: Nona sinfonia ***\r\n");
pinofal 6:be1561f8c63c 220 pc.printf("\r\n> 4: When the saint go marching in ***\r\n");
Vito1704 5:413f85118dd5 221 pc.printf("\r\n> 5: Preludio ***\r\n");
pinofal 6:be1561f8c63c 222 pc.printf("\r\n> 6: Quinta Sinfonia ***\r\n");
Vito1704 5:413f85118dd5 223 pc.printf("\r\n> 7: Minuetto ***\r\n");
Vito1704 5:413f85118dd5 224 pc.printf("\r\n> 8: Minuetto ***\r\n");
Vito1704 5:413f85118dd5 225 pc.printf("\r\n> 9: Me Composer ***\r\n");
pinofal 6:be1561f8c63c 226 while(pc.readable())
pinofal 6:be1561f8c63c 227 {
pinofal 6:be1561f8c63c 228 // acquisisce il suono da generare
pinofal 6:be1561f8c63c 229 cScore = pc.getc();
pinofal 6:be1561f8c63c 230 }
pinofal 6:be1561f8c63c 231
pinofal 6:be1561f8c63c 232 // suona lo spartito selezionato
pinofal 6:be1561f8c63c 233 if(cScore == '6')
pinofal 6:be1561f8c63c 234 {
pinofal 6:be1561f8c63c 235 // abilita la generazione di suoni
pinofal 6:be1561f8c63c 236 bStop=false;
pinofal 6:be1561f8c63c 237 // genera le note indicate nell'array spartito con la durata indicata nell'array length
pinofal 6:be1561f8c63c 238 for(nIndex=0; nIndex<SYMPHONYN5DURATION; nIndex++)
pinofal 2:93bba36e0c06 239 {
pinofal 6:be1561f8c63c 240 // genera la frequenza relativa alla nota selezionata, da nIndex, nello spartito
pinofal 6:be1561f8c63c 241 fFreq=fNoteSymphonyN5[nIndex];
pinofal 2:93bba36e0c06 242 fAmp = 0.1; // coefficiente per il quale viene moltiplicato l'ampiezza massima
pinofal 2:93bba36e0c06 243 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 2:93bba36e0c06 244 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 2:93bba36e0c06 245 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 2:93bba36e0c06 246
pinofal 6:be1561f8c63c 247 //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
pinofal 6:be1561f8c63c 248 wait_ms(fLengthSymphonyN5[nIndex]);
pinofal 2:93bba36e0c06 249 }
pinofal 6:be1561f8c63c 250 }
pinofal 6:be1561f8c63c 251 else
pinofal 6:be1561f8c63c 252 {
pinofal 6:be1561f8c63c 253 if(cScore=='9')
pinofal 2:93bba36e0c06 254 {
pinofal 6:be1561f8c63c 255 while(true)
pinofal 6:be1561f8c63c 256 {
pinofal 6:be1561f8c63c 257 // verifica se è arrivato un carattere dalla seriale del pc
pinofal 6:be1561f8c63c 258 if(pc.readable())
pinofal 6:be1561f8c63c 259 {
pinofal 6:be1561f8c63c 260 cReadChar = pc.getc(); // Read hyperterminal
pinofal 6:be1561f8c63c 261
pinofal 6:be1561f8c63c 262 // genera la nota corrispondente al carattere ricevuto
pinofal 6:be1561f8c63c 263 switch(cReadChar)
pinofal 6:be1561f8c63c 264 {
pinofal 6:be1561f8c63c 265 //La#
pinofal 6:be1561f8c63c 266 case 'u':
pinofal 6:be1561f8c63c 267 case 'U':
pinofal 6:be1561f8c63c 268 {
pinofal 6:be1561f8c63c 269 fFreq=466.16;// frequenza della sinusoide La#
pinofal 6:be1561f8c63c 270 pc.printf("\n\r--- Generazione La#_SIb= %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 271 bStop = false;
pinofal 6:be1561f8c63c 272 } break;
pinofal 6:be1561f8c63c 273 //sol#
pinofal 6:be1561f8c63c 274 case 'y':
pinofal 6:be1561f8c63c 275 case 'Y':
pinofal 6:be1561f8c63c 276 {
pinofal 6:be1561f8c63c 277 fFreq=415.3;// frequenza della sinusoide Sol#
pinofal 6:be1561f8c63c 278 pc.printf("\n\r--- Generazione Sol#_LAb = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 279 bStop = false;
pinofal 6:be1561f8c63c 280 } break;
pinofal 6:be1561f8c63c 281 //Sol_b
pinofal 6:be1561f8c63c 282 case 't':
pinofal 6:be1561f8c63c 283 case 'T':
pinofal 6:be1561f8c63c 284 {
pinofal 6:be1561f8c63c 285 fFreq=369.99;// frequenza della sinusoide Sol_b
pinofal 6:be1561f8c63c 286 pc.printf("\n\r--- Generazione Solb_Fa# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 287 bStop = false;
pinofal 6:be1561f8c63c 288 } break;
pinofal 6:be1561f8c63c 289 //DO#
pinofal 6:be1561f8c63c 290 case 'e':
pinofal 6:be1561f8c63c 291 case 'E':
pinofal 6:be1561f8c63c 292 {
pinofal 6:be1561f8c63c 293 fFreq=277.18;// frequenza della sinusoide DO diesis
pinofal 6:be1561f8c63c 294 pc.printf("\n\r--- Generazione DO# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 295 bStop = false;
pinofal 6:be1561f8c63c 296 } break;
pinofal 6:be1561f8c63c 297 //DO
pinofal 6:be1561f8c63c 298 case 'd':
pinofal 6:be1561f8c63c 299 case 'D':
pinofal 6:be1561f8c63c 300 {
pinofal 6:be1561f8c63c 301 fFreq=261.63;// frequenza della sinusoide DO da generare
pinofal 6:be1561f8c63c 302 pc.printf("\n\r--- Generazione DO = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 303 bStop = false;
pinofal 6:be1561f8c63c 304 } break;
pinofal 6:be1561f8c63c 305 // RE
pinofal 6:be1561f8c63c 306 case 'f':
pinofal 6:be1561f8c63c 307 case 'F':
pinofal 6:be1561f8c63c 308 {
pinofal 6:be1561f8c63c 309 fFreq=293.66;// frequenza della sinusoide RE da generare
pinofal 6:be1561f8c63c 310 pc.printf("\n\r--- Generazione RE = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 311 bStop = false;
pinofal 6:be1561f8c63c 312 } break;
pinofal 6:be1561f8c63c 313 // RE#/MIb
pinofal 6:be1561f8c63c 314 case 'r':
pinofal 6:be1561f8c63c 315 case 'R':
pinofal 6:be1561f8c63c 316 {
pinofal 6:be1561f8c63c 317 fFreq=311.13;
pinofal 6:be1561f8c63c 318 pc.printf("\n\r--- Generazione Mib = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 319 bStop = false;
pinofal 6:be1561f8c63c 320 } break;
pinofal 6:be1561f8c63c 321 case 'g':
pinofal 6:be1561f8c63c 322 case 'G':
pinofal 6:be1561f8c63c 323 {
pinofal 6:be1561f8c63c 324 fFreq=329.63; // frequenza della sinusoide MI da generare
pinofal 6:be1561f8c63c 325 pc.printf("\n\r--- Generazione MI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 326 bStop = false;
pinofal 6:be1561f8c63c 327 } break;
pinofal 6:be1561f8c63c 328 case 'h':
pinofal 6:be1561f8c63c 329 case 'H':
pinofal 6:be1561f8c63c 330 {
pinofal 6:be1561f8c63c 331 fFreq=349.23;// frequenza della sinusoide FA da generare
pinofal 6:be1561f8c63c 332 pc.printf("\n\r--- Generazione FA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 333 bStop = false;
pinofal 6:be1561f8c63c 334 } break;
pinofal 6:be1561f8c63c 335
pinofal 6:be1561f8c63c 336 // SOL
pinofal 6:be1561f8c63c 337 case 'j':
pinofal 6:be1561f8c63c 338 case 'J':
pinofal 6:be1561f8c63c 339 {
pinofal 6:be1561f8c63c 340 fFreq=392.0;
pinofal 6:be1561f8c63c 341 pc.printf("\n\r--- Generazione SOL = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 342 bStop = false;
pinofal 6:be1561f8c63c 343 } break;
pinofal 6:be1561f8c63c 344 // LA
pinofal 6:be1561f8c63c 345 case 'k':
pinofal 6:be1561f8c63c 346 case 'K':
pinofal 6:be1561f8c63c 347 {
pinofal 6:be1561f8c63c 348 fFreq=440.0; // frequenza della sinusoide LA da generare
pinofal 6:be1561f8c63c 349 pc.printf("\n\r--- Generazione LA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 350 bStop = false;
pinofal 6:be1561f8c63c 351 } break;
pinofal 6:be1561f8c63c 352 //SI
pinofal 6:be1561f8c63c 353 case 'l':
pinofal 6:be1561f8c63c 354 case 'L':
pinofal 6:be1561f8c63c 355 {
pinofal 6:be1561f8c63c 356 fFreq=493.88;// frequenza della sinusoide SI da generare
pinofal 6:be1561f8c63c 357 pc.printf("\n\r--- Generazione SI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 358 bStop = false;
pinofal 6:be1561f8c63c 359 } break;
pinofal 6:be1561f8c63c 360 //DO 5°
pinofal 6:be1561f8c63c 361 case 'z':
pinofal 6:be1561f8c63c 362 case 'Z':
pinofal 6:be1561f8c63c 363 {
pinofal 6:be1561f8c63c 364 fFreq=523.00;// frequenza della sinusoide SI da generare
pinofal 6:be1561f8c63c 365 pc.printf("\n\r--- Generazione DO5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 366 bStop = false;
pinofal 6:be1561f8c63c 367 } break;
pinofal 6:be1561f8c63c 368 //RE 5°
pinofal 6:be1561f8c63c 369 case 'x':
pinofal 6:be1561f8c63c 370 case 'X':
pinofal 6:be1561f8c63c 371 {
pinofal 6:be1561f8c63c 372 fFreq=587.00;// frequenza della sinusoide SI da generare
pinofal 6:be1561f8c63c 373 pc.printf("\n\r--- Generazione RE5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 374 bStop = false;
pinofal 6:be1561f8c63c 375 } break;
pinofal 6:be1561f8c63c 376
pinofal 6:be1561f8c63c 377 // pausa
pinofal 6:be1561f8c63c 378 case ' ':
pinofal 6:be1561f8c63c 379 {
pinofal 6:be1561f8c63c 380 bStop = true;
pinofal 6:be1561f8c63c 381 pc.printf("\n\r--- Generazione pausa = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 382
pinofal 6:be1561f8c63c 383 } break;
pinofal 6:be1561f8c63c 384 //prova
pinofal 6:be1561f8c63c 385 case 'o':
pinofal 6:be1561f8c63c 386 {
pinofal 6:be1561f8c63c 387 fFreq=587.00;
pinofal 6:be1561f8c63c 388 wait_ms(600);
pinofal 6:be1561f8c63c 389 fFreq=392.00;
pinofal 6:be1561f8c63c 390 wait_ms(300);
pinofal 6:be1561f8c63c 391 fFreq=440.00;
pinofal 6:be1561f8c63c 392 wait_ms(300);
pinofal 6:be1561f8c63c 393 fFreq=493.88;
pinofal 6:be1561f8c63c 394 wait_ms(300);
pinofal 6:be1561f8c63c 395 fFreq=523.16;
pinofal 6:be1561f8c63c 396 wait_ms(300);
pinofal 6:be1561f8c63c 397 } break;
pinofal 6:be1561f8c63c 398 //Stop
pinofal 6:be1561f8c63c 399 case 'b':
pinofal 6:be1561f8c63c 400 case 'B':
pinofal 6:be1561f8c63c 401 {
pinofal 6:be1561f8c63c 402
pinofal 6:be1561f8c63c 403 fFreq=0;// stop
pinofal 6:be1561f8c63c 404 pc.printf("\n\r--- Generazione Stop = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 405 bStop = false;
pinofal 6:be1561f8c63c 406 } break;
pinofal 6:be1561f8c63c 407
pinofal 6:be1561f8c63c 408 default:
pinofal 6:be1561f8c63c 409 {
pinofal 6:be1561f8c63c 410 bStop=true; // se la nota non è riconosciuta blocca la generazione
pinofal 6:be1561f8c63c 411 pc.printf("\n\r--- Wrong Tone ---\n\r");
pinofal 6:be1561f8c63c 412 } break;
pinofal 6:be1561f8c63c 413 } // switch (cReadChar)
pinofal 6:be1561f8c63c 414
pinofal 6:be1561f8c63c 415 // genera la frequenza relativa alla nota che è stata selezionata
pinofal 6:be1561f8c63c 416 fAmp = 0.1; // coefficiente per il quale viene moltiplicato l'ampiezza massima
pinofal 6:be1561f8c63c 417 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 6:be1561f8c63c 418 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 6:be1561f8c63c 419 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 6:be1561f8c63c 420
pinofal 6:be1561f8c63c 421
pinofal 6:be1561f8c63c 422 }
pinofal 6:be1561f8c63c 423 else // se non è stato premuto nessun tasto
pinofal 6:be1561f8c63c 424 {
pinofal 6:be1561f8c63c 425
pinofal 6:be1561f8c63c 426 }
pinofal 6:be1561f8c63c 427 } // while
pinofal 6:be1561f8c63c 428 } // cScore = '9'
pinofal 6:be1561f8c63c 429 }
pinofal 2:93bba36e0c06 430 /******* START ONDA DIGITALE FUNZIONA *****
pinofal 2:93bba36e0c06 431 led1=1;
pinofal 2:93bba36e0c06 432 led2=1;
pinofal 2:93bba36e0c06 433 led3=1;
pinofal 2:93bba36e0c06 434 while(true)
pinofal 2:93bba36e0c06 435 {
pinofal 2:93bba36e0c06 436 DigitalWave=0;
pinofal 2:93bba36e0c06 437 //wait_us(2024); //SI
pinofal 2:93bba36e0c06 438 //wait_us(2551); //SOL
pinofal 2:93bba36e0c06 439 wait_us(1515); //MI
pinofal 2:93bba36e0c06 440 DigitalWave=1;
pinofal 2:93bba36e0c06 441 wait_us(1515);
pinofal 2:93bba36e0c06 442 }
pinofal 2:93bba36e0c06 443 ****** END ONDA DIGITALE FUNZIONA ******/
pinofal 2:93bba36e0c06 444 }