Test CBS-GPIO

Dependencies:   mbed

Fork of Amplificatore_bomboni_rev2 by Giuseppe Falagario

Committer:
pinofal
Date:
Mon Jun 18 07:36:08 2018 +0000
Revision:
7:cc303710b1bc
Parent:
Sound-Generation.cpp@6:be1561f8c63c
Inserito accento sulle note

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 7:cc303710b1bc 14 #define SEMIBREVE 2000000 // durata della semibreve in microsecondi = 4sec
pinofal 7:cc303710b1bc 15 #define MINIMA SEMIBREVE/2
pinofal 7:cc303710b1bc 16 #define SEMIMINIMA SEMIBREVE/4
pinofal 7:cc303710b1bc 17 #define CROMA SEMIBREVE/8
pinofal 7:cc303710b1bc 18 #define SEMICROMA CROMA/16
pinofal 7:cc303710b1bc 19 #define BISCROMA SEMIBREVE/32
pinofal 7:cc303710b1bc 20 #define SEMIBISCROMA SEMIBREVE/64
pinofal 6:be1561f8c63c 21
pinofal 6:be1561f8c63c 22
pinofal 2:93bba36e0c06 23 // definizione della frequenza delle note ottava centrale del pianoforte
pinofal 7:cc303710b1bc 24 #define p 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 7:cc303710b1bc 85 volatile int bGenerate = false;
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 7:cc303710b1bc 146 if(bGenerate==0)
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 7:cc303710b1bc 175 float fNoteSymphonyN5 [SYMPHONYN5DURATION] = {p, G1, G1, G1, E1b, p, 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 7:cc303710b1bc 178
pinofal 7:cc303710b1bc 179 // numero di note che compongono il brano
pinofal 7:cc303710b1bc 180 #define MINUETTODURATION 20 // numero di note che compongono il brano
pinofal 7:cc303710b1bc 181 // note del brano
pinofal 7:cc303710b1bc 182 float fNoteMinuetto [SYMPHONYN5DURATION] = {p, G1, G1, G1, E1b, p, F1, F1, F1, D1};
pinofal 7:cc303710b1bc 183 // durata delle note del brano
pinofal 7:cc303710b1bc 184 float fLengthMinuetto[SYMPHONYN5DURATION] ={CROMA, CROMA, CROMA, CROMA, MINIMA, CROMA, CROMA, CROMA, CROMA, MINIMA};
pinofal 7:cc303710b1bc 185
pinofal 6:be1561f8c63c 186 // indice per i cicli
pinofal 6:be1561f8c63c 187 int nIndex;
pinofal 6:be1561f8c63c 188
pinofal 7:cc303710b1bc 189 //inizializza variabili
pinofal 7:cc303710b1bc 190 bGenerate=false;
pinofal 7:cc303710b1bc 191 cReadChar = 0;
pinofal 7:cc303710b1bc 192 nSampleOutIndex=0;
pinofal 7:cc303710b1bc 193 nSampleOutCount=0;
pinofal 7:cc303710b1bc 194
pinofal 6:be1561f8c63c 195
pinofal 2:93bba36e0c06 196 // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
pinofal 2:93bba36e0c06 197 pc.baud(921600); //921600 bps
pinofal 2:93bba36e0c06 198
pinofal 2:93bba36e0c06 199 // messaggio di benvenuto
pinofal 2:93bba36e0c06 200 pc.printf("\r\nHallo Amaldi Students - Exercise 9 \r\n");
Vito1704 5:413f85118dd5 201 pc.printf("\r\n*** Amaldi Vs Beethoven ***\r\n");
pinofal 2:93bba36e0c06 202
pinofal 7:cc303710b1bc 203
pinofal 2:93bba36e0c06 204
pinofal 2:93bba36e0c06 205 // test dei LED
pinofal 2:93bba36e0c06 206 led1=1; //Verde
pinofal 7:cc303710b1bc 207 wait_ms(500);
pinofal 2:93bba36e0c06 208 led1=0;
pinofal 2:93bba36e0c06 209 led2=1; // Blu
pinofal 7:cc303710b1bc 210 wait_ms(500);
pinofal 2:93bba36e0c06 211 led2=0;
pinofal 2:93bba36e0c06 212 led3=1; //Rosso
pinofal 7:cc303710b1bc 213 wait_ms(500);
pinofal 2:93bba36e0c06 214 led3=0;
pinofal 2:93bba36e0c06 215
pinofal 6:be1561f8c63c 216 pc.printf("\r\n*** Select SoundWave ***\r\n");
pinofal 6:be1561f8c63c 217 pc.printf("\r\n> 0: Sine ***\r\n");
pinofal 6:be1561f8c63c 218 pc.printf("\r\n> 1: Square ***\r\n");
pinofal 7:cc303710b1bc 219
pinofal 7:cc303710b1bc 220 // acquisisce il tipo di suono da generare
pinofal 7:cc303710b1bc 221 while(!pc.readable())
pinofal 6:be1561f8c63c 222 {
pinofal 6:be1561f8c63c 223 }
pinofal 7:cc303710b1bc 224 cSoundWave = pc.getc();
pinofal 7:cc303710b1bc 225
pinofal 6:be1561f8c63c 226
Vito1704 5:413f85118dd5 227 pc.printf("\r\n*** Select Score ***\r\n");
Vito1704 5:413f85118dd5 228 pc.printf("\r\n> 0: Lalala land ***\r\n");
Vito1704 5:413f85118dd5 229 pc.printf("\r\n> 1: Minuetto ***\r\n");
Vito1704 5:413f85118dd5 230 pc.printf("\r\n> 2: Prima invenzione ***\r\n");
Vito1704 5:413f85118dd5 231 pc.printf("\r\n> 3: Nona sinfonia ***\r\n");
pinofal 6:be1561f8c63c 232 pc.printf("\r\n> 4: When the saint go marching in ***\r\n");
Vito1704 5:413f85118dd5 233 pc.printf("\r\n> 5: Preludio ***\r\n");
pinofal 6:be1561f8c63c 234 pc.printf("\r\n> 6: Quinta Sinfonia ***\r\n");
Vito1704 5:413f85118dd5 235 pc.printf("\r\n> 7: Minuetto ***\r\n");
Vito1704 5:413f85118dd5 236 pc.printf("\r\n> 8: Minuetto ***\r\n");
Vito1704 5:413f85118dd5 237 pc.printf("\r\n> 9: Me Composer ***\r\n");
pinofal 7:cc303710b1bc 238
pinofal 7:cc303710b1bc 239 // acquisisce lo spartito da generare
pinofal 7:cc303710b1bc 240 while(!pc.readable())
pinofal 6:be1561f8c63c 241 {
pinofal 6:be1561f8c63c 242 }
pinofal 7:cc303710b1bc 243 cScore = pc.getc();
pinofal 7:cc303710b1bc 244
pinofal 6:be1561f8c63c 245
pinofal 6:be1561f8c63c 246 // suona lo spartito selezionato
pinofal 7:cc303710b1bc 247 if(cScore =='6')
pinofal 6:be1561f8c63c 248 {
pinofal 6:be1561f8c63c 249 // abilita la generazione di suoni
pinofal 7:cc303710b1bc 250 bGenerate=true;
pinofal 7:cc303710b1bc 251
pinofal 7:cc303710b1bc 252 fAmp = 1.0; // coefficiente per il quale viene moltiplicato l'ampiezza massima
pinofal 7:cc303710b1bc 253
pinofal 7:cc303710b1bc 254 // genera la frequenza relativa alla nota selezionata, da nIndex, nello spartito
pinofal 7:cc303710b1bc 255 bGenerate=fNoteSymphonyN5[0];
pinofal 7:cc303710b1bc 256 fFreq=fNoteSymphonyN5[0];
pinofal 7:cc303710b1bc 257 if(bGenerate !=0)
pinofal 7:cc303710b1bc 258 {
pinofal 7:cc303710b1bc 259 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 7:cc303710b1bc 260 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 7:cc303710b1bc 261 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 7:cc303710b1bc 262 }
pinofal 7:cc303710b1bc 263
pinofal 7:cc303710b1bc 264 //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
pinofal 7:cc303710b1bc 265 wait_us(fLengthSymphonyN5[1]);
pinofal 7:cc303710b1bc 266
pinofal 7:cc303710b1bc 267 // accento sulla nota
pinofal 7:cc303710b1bc 268 bGenerate=false;
pinofal 7:cc303710b1bc 269 wait_us(fLengthSymphonyN5[1]/5);
pinofal 7:cc303710b1bc 270 bGenerate=true;
pinofal 7:cc303710b1bc 271
pinofal 7:cc303710b1bc 272 bGenerate=fNoteSymphonyN5[1];
pinofal 7:cc303710b1bc 273 fFreq=fNoteSymphonyN5[1];
pinofal 7:cc303710b1bc 274 if(bGenerate !=0)
pinofal 7:cc303710b1bc 275 {
pinofal 7:cc303710b1bc 276 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 7:cc303710b1bc 277 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 7:cc303710b1bc 278 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 7:cc303710b1bc 279 }
pinofal 7:cc303710b1bc 280
pinofal 7:cc303710b1bc 281 //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
pinofal 7:cc303710b1bc 282 wait_us(fLengthSymphonyN5[1]);
pinofal 7:cc303710b1bc 283
pinofal 7:cc303710b1bc 284 // accento sulla nota
pinofal 7:cc303710b1bc 285 bGenerate=false;
pinofal 7:cc303710b1bc 286 wait_us(fLengthSymphonyN5[1]/5);
pinofal 7:cc303710b1bc 287 bGenerate=true;
pinofal 7:cc303710b1bc 288
pinofal 7:cc303710b1bc 289 bGenerate=fNoteSymphonyN5[2];
pinofal 7:cc303710b1bc 290 fFreq=fNoteSymphonyN5[2];
pinofal 7:cc303710b1bc 291 if(bGenerate !=0)
pinofal 7:cc303710b1bc 292 {
pinofal 7:cc303710b1bc 293 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 7:cc303710b1bc 294 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 7:cc303710b1bc 295 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 7:cc303710b1bc 296 }
pinofal 7:cc303710b1bc 297 //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
pinofal 7:cc303710b1bc 298 wait_us(fLengthSymphonyN5[2]);
pinofal 7:cc303710b1bc 299
pinofal 7:cc303710b1bc 300 // accento sulla nota
pinofal 7:cc303710b1bc 301 bGenerate=false;
pinofal 7:cc303710b1bc 302 wait_us(fLengthSymphonyN5[2]/5);
pinofal 7:cc303710b1bc 303 bGenerate=true;
pinofal 7:cc303710b1bc 304
pinofal 7:cc303710b1bc 305 bGenerate=fNoteSymphonyN5[3];
pinofal 7:cc303710b1bc 306 fFreq=fNoteSymphonyN5[3];
pinofal 7:cc303710b1bc 307 if(bGenerate !=0)
pinofal 7:cc303710b1bc 308 {
pinofal 7:cc303710b1bc 309 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 7:cc303710b1bc 310 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 7:cc303710b1bc 311 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 7:cc303710b1bc 312 }
pinofal 7:cc303710b1bc 313 //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
pinofal 7:cc303710b1bc 314 wait_us(fLengthSymphonyN5[3]);
pinofal 7:cc303710b1bc 315
pinofal 7:cc303710b1bc 316 // accento sulla nota
pinofal 7:cc303710b1bc 317 bGenerate=false;
pinofal 7:cc303710b1bc 318 wait_us(fLengthSymphonyN5[3]/5);
pinofal 7:cc303710b1bc 319 bGenerate=true;
pinofal 7:cc303710b1bc 320
pinofal 7:cc303710b1bc 321 bGenerate=fNoteSymphonyN5[4];
pinofal 7:cc303710b1bc 322 fFreq=fNoteSymphonyN5[4];
pinofal 7:cc303710b1bc 323 if(bGenerate !=0)
pinofal 7:cc303710b1bc 324 {
pinofal 7:cc303710b1bc 325 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 7:cc303710b1bc 326 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 7:cc303710b1bc 327 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 7:cc303710b1bc 328 }
pinofal 7:cc303710b1bc 329 //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
pinofal 7:cc303710b1bc 330 wait_us(fLengthSymphonyN5[4]);
pinofal 7:cc303710b1bc 331
pinofal 7:cc303710b1bc 332 // accento sulla nota
pinofal 7:cc303710b1bc 333 bGenerate=false;
pinofal 7:cc303710b1bc 334 wait_us(fLengthSymphonyN5[4]/5);
pinofal 7:cc303710b1bc 335 //bGenerate=true;
pinofal 7:cc303710b1bc 336
pinofal 7:cc303710b1bc 337 pc.printf("\r\n premi tasto");
pinofal 7:cc303710b1bc 338 while(!pc.readable())
pinofal 7:cc303710b1bc 339 {
pinofal 7:cc303710b1bc 340 }
pinofal 7:cc303710b1bc 341
pinofal 7:cc303710b1bc 342
pinofal 7:cc303710b1bc 343 // coefficiente per il quale viene moltiplicato l'ampiezza massima
pinofal 7:cc303710b1bc 344 fAmp = 1.0;
pinofal 7:cc303710b1bc 345
pinofal 6:be1561f8c63c 346 // genera le note indicate nell'array spartito con la durata indicata nell'array length
pinofal 6:be1561f8c63c 347 for(nIndex=0; nIndex<SYMPHONYN5DURATION; nIndex++)
pinofal 2:93bba36e0c06 348 {
pinofal 7:cc303710b1bc 349 bGenerate=fNoteSymphonyN5[nIndex];
pinofal 6:be1561f8c63c 350 fFreq=fNoteSymphonyN5[nIndex];
pinofal 7:cc303710b1bc 351 if(bGenerate !=0)
pinofal 7:cc303710b1bc 352 {
pinofal 7:cc303710b1bc 353 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 7:cc303710b1bc 354 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 7:cc303710b1bc 355 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 7:cc303710b1bc 356 }
pinofal 7:cc303710b1bc 357 //dopo aver generato la nota, attendi per un periodo pari alla durata della nota
pinofal 7:cc303710b1bc 358 wait_us(fLengthSymphonyN5[nIndex]);
pinofal 2:93bba36e0c06 359
pinofal 7:cc303710b1bc 360 // accento sulla nota
pinofal 7:cc303710b1bc 361 bGenerate=false;
pinofal 7:cc303710b1bc 362 wait_us(fLengthSymphonyN5[nIndex]/5);
pinofal 7:cc303710b1bc 363 bGenerate=true;
pinofal 2:93bba36e0c06 364 }
pinofal 7:cc303710b1bc 365 // dopo la lettura dello spartito disattiva suoni
pinofal 7:cc303710b1bc 366 bGenerate = false;
pinofal 6:be1561f8c63c 367 }
pinofal 6:be1561f8c63c 368 else
pinofal 6:be1561f8c63c 369 {
pinofal 6:be1561f8c63c 370 if(cScore=='9')
pinofal 2:93bba36e0c06 371 {
pinofal 6:be1561f8c63c 372 while(true)
pinofal 6:be1561f8c63c 373 {
pinofal 6:be1561f8c63c 374 // verifica se è arrivato un carattere dalla seriale del pc
pinofal 6:be1561f8c63c 375 if(pc.readable())
pinofal 6:be1561f8c63c 376 {
pinofal 6:be1561f8c63c 377 cReadChar = pc.getc(); // Read hyperterminal
pinofal 6:be1561f8c63c 378
pinofal 6:be1561f8c63c 379 // genera la nota corrispondente al carattere ricevuto
pinofal 6:be1561f8c63c 380 switch(cReadChar)
pinofal 6:be1561f8c63c 381 {
pinofal 6:be1561f8c63c 382 //La#
pinofal 6:be1561f8c63c 383 case 'u':
pinofal 6:be1561f8c63c 384 case 'U':
pinofal 6:be1561f8c63c 385 {
pinofal 6:be1561f8c63c 386 fFreq=466.16;// frequenza della sinusoide La#
pinofal 6:be1561f8c63c 387 pc.printf("\n\r--- Generazione La#_SIb= %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 388 bGenerate = true;
pinofal 6:be1561f8c63c 389 } break;
pinofal 6:be1561f8c63c 390 //sol#
pinofal 6:be1561f8c63c 391 case 'y':
pinofal 6:be1561f8c63c 392 case 'Y':
pinofal 6:be1561f8c63c 393 {
pinofal 6:be1561f8c63c 394 fFreq=415.3;// frequenza della sinusoide Sol#
pinofal 6:be1561f8c63c 395 pc.printf("\n\r--- Generazione Sol#_LAb = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 396 bGenerate = true;
pinofal 6:be1561f8c63c 397 } break;
pinofal 6:be1561f8c63c 398 //Sol_b
pinofal 6:be1561f8c63c 399 case 't':
pinofal 6:be1561f8c63c 400 case 'T':
pinofal 6:be1561f8c63c 401 {
pinofal 6:be1561f8c63c 402 fFreq=369.99;// frequenza della sinusoide Sol_b
pinofal 6:be1561f8c63c 403 pc.printf("\n\r--- Generazione Solb_Fa# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 404 bGenerate = true;
pinofal 6:be1561f8c63c 405 } break;
pinofal 6:be1561f8c63c 406 //DO#
pinofal 6:be1561f8c63c 407 case 'e':
pinofal 6:be1561f8c63c 408 case 'E':
pinofal 6:be1561f8c63c 409 {
pinofal 6:be1561f8c63c 410 fFreq=277.18;// frequenza della sinusoide DO diesis
pinofal 6:be1561f8c63c 411 pc.printf("\n\r--- Generazione DO# = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 412 bGenerate = true;
pinofal 6:be1561f8c63c 413 } break;
pinofal 6:be1561f8c63c 414 //DO
pinofal 6:be1561f8c63c 415 case 'd':
pinofal 6:be1561f8c63c 416 case 'D':
pinofal 6:be1561f8c63c 417 {
pinofal 6:be1561f8c63c 418 fFreq=261.63;// frequenza della sinusoide DO da generare
pinofal 6:be1561f8c63c 419 pc.printf("\n\r--- Generazione DO = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 420 bGenerate = true;
pinofal 6:be1561f8c63c 421 } break;
pinofal 6:be1561f8c63c 422 // RE
pinofal 6:be1561f8c63c 423 case 'f':
pinofal 6:be1561f8c63c 424 case 'F':
pinofal 6:be1561f8c63c 425 {
pinofal 6:be1561f8c63c 426 fFreq=293.66;// frequenza della sinusoide RE da generare
pinofal 6:be1561f8c63c 427 pc.printf("\n\r--- Generazione RE = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 428 bGenerate = true;
pinofal 6:be1561f8c63c 429 } break;
pinofal 6:be1561f8c63c 430 // RE#/MIb
pinofal 6:be1561f8c63c 431 case 'r':
pinofal 6:be1561f8c63c 432 case 'R':
pinofal 6:be1561f8c63c 433 {
pinofal 6:be1561f8c63c 434 fFreq=311.13;
pinofal 6:be1561f8c63c 435 pc.printf("\n\r--- Generazione Mib = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 436 bGenerate = true;
pinofal 6:be1561f8c63c 437 } break;
pinofal 6:be1561f8c63c 438 case 'g':
pinofal 6:be1561f8c63c 439 case 'G':
pinofal 6:be1561f8c63c 440 {
pinofal 6:be1561f8c63c 441 fFreq=329.63; // frequenza della sinusoide MI da generare
pinofal 6:be1561f8c63c 442 pc.printf("\n\r--- Generazione MI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 443 bGenerate = true;
pinofal 6:be1561f8c63c 444 } break;
pinofal 6:be1561f8c63c 445 case 'h':
pinofal 6:be1561f8c63c 446 case 'H':
pinofal 6:be1561f8c63c 447 {
pinofal 6:be1561f8c63c 448 fFreq=349.23;// frequenza della sinusoide FA da generare
pinofal 6:be1561f8c63c 449 pc.printf("\n\r--- Generazione FA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 450 bGenerate = true;
pinofal 6:be1561f8c63c 451 } break;
pinofal 6:be1561f8c63c 452
pinofal 6:be1561f8c63c 453 // SOL
pinofal 6:be1561f8c63c 454 case 'j':
pinofal 6:be1561f8c63c 455 case 'J':
pinofal 6:be1561f8c63c 456 {
pinofal 6:be1561f8c63c 457 fFreq=392.0;
pinofal 6:be1561f8c63c 458 pc.printf("\n\r--- Generazione SOL = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 459 bGenerate = true;
pinofal 6:be1561f8c63c 460 } break;
pinofal 6:be1561f8c63c 461 // LA
pinofal 6:be1561f8c63c 462 case 'k':
pinofal 6:be1561f8c63c 463 case 'K':
pinofal 6:be1561f8c63c 464 {
pinofal 6:be1561f8c63c 465 fFreq=440.0; // frequenza della sinusoide LA da generare
pinofal 6:be1561f8c63c 466 pc.printf("\n\r--- Generazione LA = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 467 bGenerate = true;
pinofal 6:be1561f8c63c 468 } break;
pinofal 6:be1561f8c63c 469 //SI
pinofal 6:be1561f8c63c 470 case 'l':
pinofal 6:be1561f8c63c 471 case 'L':
pinofal 6:be1561f8c63c 472 {
pinofal 6:be1561f8c63c 473 fFreq=493.88;// frequenza della sinusoide SI da generare
pinofal 6:be1561f8c63c 474 pc.printf("\n\r--- Generazione SI = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 475 bGenerate = true;
pinofal 6:be1561f8c63c 476 } break;
pinofal 6:be1561f8c63c 477 //DO 5°
pinofal 6:be1561f8c63c 478 case 'z':
pinofal 6:be1561f8c63c 479 case 'Z':
pinofal 6:be1561f8c63c 480 {
pinofal 6:be1561f8c63c 481 fFreq=523.00;// frequenza della sinusoide SI da generare
pinofal 6:be1561f8c63c 482 pc.printf("\n\r--- Generazione DO5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 483 bGenerate = true;
pinofal 6:be1561f8c63c 484 } break;
pinofal 6:be1561f8c63c 485 //RE 5°
pinofal 6:be1561f8c63c 486 case 'x':
pinofal 6:be1561f8c63c 487 case 'X':
pinofal 6:be1561f8c63c 488 {
pinofal 6:be1561f8c63c 489 fFreq=587.00;// frequenza della sinusoide SI da generare
pinofal 6:be1561f8c63c 490 pc.printf("\n\r--- Generazione RE5 = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 491 bGenerate = true;
pinofal 6:be1561f8c63c 492 } break;
pinofal 6:be1561f8c63c 493
pinofal 6:be1561f8c63c 494 // pausa
pinofal 6:be1561f8c63c 495 case ' ':
pinofal 6:be1561f8c63c 496 {
pinofal 7:cc303710b1bc 497 bGenerate = false;
pinofal 6:be1561f8c63c 498 pc.printf("\n\r--- Generazione pausa = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 6:be1561f8c63c 499
pinofal 6:be1561f8c63c 500 } break;
pinofal 6:be1561f8c63c 501 //prova
pinofal 6:be1561f8c63c 502 case 'o':
pinofal 6:be1561f8c63c 503 {
pinofal 6:be1561f8c63c 504 fFreq=587.00;
pinofal 6:be1561f8c63c 505 wait_ms(600);
pinofal 6:be1561f8c63c 506 fFreq=392.00;
pinofal 6:be1561f8c63c 507 wait_ms(300);
pinofal 6:be1561f8c63c 508 fFreq=440.00;
pinofal 6:be1561f8c63c 509 wait_ms(300);
pinofal 6:be1561f8c63c 510 fFreq=493.88;
pinofal 6:be1561f8c63c 511 wait_ms(300);
pinofal 6:be1561f8c63c 512 fFreq=523.16;
pinofal 6:be1561f8c63c 513 wait_ms(300);
pinofal 6:be1561f8c63c 514 } break;
pinofal 6:be1561f8c63c 515 //Stop
pinofal 6:be1561f8c63c 516 case 'b':
pinofal 6:be1561f8c63c 517 case 'B':
pinofal 6:be1561f8c63c 518 {
pinofal 6:be1561f8c63c 519
pinofal 6:be1561f8c63c 520 fFreq=0;// stop
pinofal 6:be1561f8c63c 521 pc.printf("\n\r--- Generazione Stop = %.2f Hz ampiezza nominale ---\n\r", fFreq);
pinofal 7:cc303710b1bc 522 bGenerate = false;
pinofal 6:be1561f8c63c 523 } break;
pinofal 6:be1561f8c63c 524
pinofal 6:be1561f8c63c 525 default:
pinofal 6:be1561f8c63c 526 {
pinofal 7:cc303710b1bc 527 bGenerate = false; // se la nota non è riconosciuta blocca la generazione
pinofal 6:be1561f8c63c 528 pc.printf("\n\r--- Wrong Tone ---\n\r");
pinofal 6:be1561f8c63c 529 } break;
pinofal 6:be1561f8c63c 530 } // switch (cReadChar)
pinofal 6:be1561f8c63c 531
pinofal 6:be1561f8c63c 532 // genera la frequenza relativa alla nota che è stata selezionata
pinofal 6:be1561f8c63c 533 fAmp = 0.1; // coefficiente per il quale viene moltiplicato l'ampiezza massima
pinofal 6:be1561f8c63c 534 fDeltaT = 1.0/(fFreq*SAMPLESINENUM);
pinofal 6:be1561f8c63c 535 CalculateSinewave(32767, (32767*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 6:be1561f8c63c 536 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia output della sinusoide per generazione
pinofal 6:be1561f8c63c 537
pinofal 6:be1561f8c63c 538
pinofal 6:be1561f8c63c 539 }
pinofal 6:be1561f8c63c 540 else // se non è stato premuto nessun tasto
pinofal 6:be1561f8c63c 541 {
pinofal 6:be1561f8c63c 542
pinofal 6:be1561f8c63c 543 }
pinofal 6:be1561f8c63c 544 } // while
pinofal 6:be1561f8c63c 545 } // cScore = '9'
pinofal 6:be1561f8c63c 546 }
pinofal 2:93bba36e0c06 547 /******* START ONDA DIGITALE FUNZIONA *****
pinofal 2:93bba36e0c06 548 led1=1;
pinofal 2:93bba36e0c06 549 led2=1;
pinofal 2:93bba36e0c06 550 led3=1;
pinofal 2:93bba36e0c06 551 while(true)
pinofal 2:93bba36e0c06 552 {
pinofal 2:93bba36e0c06 553 DigitalWave=0;
pinofal 2:93bba36e0c06 554 //wait_us(2024); //SI
pinofal 2:93bba36e0c06 555 //wait_us(2551); //SOL
pinofal 2:93bba36e0c06 556 wait_us(1515); //MI
pinofal 2:93bba36e0c06 557 DigitalWave=1;
pinofal 2:93bba36e0c06 558 wait_us(1515);
pinofal 2:93bba36e0c06 559 }
pinofal 2:93bba36e0c06 560 ****** END ONDA DIGITALE FUNZIONA ******/
pinofal 2:93bba36e0c06 561 }