Generazione suono campionato

Dependencies:   mbed

Fork of Amplificatore_bomboni_rev2 by Giuseppe Falagario

Committer:
pinofal
Date:
Thu Nov 08 12:14:38 2018 +0000
Revision:
8:60f09ee3f03f
Dovrebbe funzionare

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pinofal 8:60f09ee3f03f 1 // Tested : NUCLEO F207ZG, L476
pinofal 8:60f09ee3f03f 2 #include "SampledSound.h"
pinofal 8:60f09ee3f03f 3 #include "mbed.h"
pinofal 8:60f09ee3f03f 4 #include<stdlib.h>
pinofal 8:60f09ee3f03f 5
pinofal 8:60f09ee3f03f 6
pinofal 8:60f09ee3f03f 7 // Definizione periferiche
pinofal 8:60f09ee3f03f 8 Serial pc(USBTX, USBRX);
pinofal 8:60f09ee3f03f 9 AnalogOut OutWave(PA_4); // pin di output per la forma d'onda analogica
pinofal 8:60f09ee3f03f 10 DigitalIn myButton(USER_BUTTON); // User Button
pinofal 8:60f09ee3f03f 11 DigitalOut led2(LED2); // LED su scheda
pinofal 8:60f09ee3f03f 12
pinofal 8:60f09ee3f03f 13 // ticker per la generazione dell'onda con DAC
pinofal 8:60f09ee3f03f 14 Ticker SampleOutTicker;
pinofal 8:60f09ee3f03f 15
pinofal 8:60f09ee3f03f 16
pinofal 8:60f09ee3f03f 17
pinofal 8:60f09ee3f03f 18 // prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
pinofal 8:60f09ee3f03f 19 void CalculateSinewave(void);
pinofal 8:60f09ee3f03f 20 // funzione di generazione suono della frequenza e ampiezza selezionate
pinofal 8:60f09ee3f03f 21 void SoundGenerate(double fFrequency);
pinofal 8:60f09ee3f03f 22
pinofal 8:60f09ee3f03f 23 // carattere in arrivo dal PC
pinofal 8:60f09ee3f03f 24 volatile char cReadChar;
pinofal 8:60f09ee3f03f 25 volatile char CReadMusic;
pinofal 8:60f09ee3f03f 26
pinofal 8:60f09ee3f03f 27
pinofal 8:60f09ee3f03f 28 // indice nell'array dei campioni da porre in output da DAC per Marimba
pinofal 8:60f09ee3f03f 29 volatile int nSampleSoundIndex;
pinofal 8:60f09ee3f03f 30
pinofal 8:60f09ee3f03f 31 // Periodo di generazione campioni in output DeltaT = T/NumSample
pinofal 8:60f09ee3f03f 32 double fDeltaT;
pinofal 8:60f09ee3f03f 33 // amplificazione per il dato da spedire sull'ADC
pinofal 8:60f09ee3f03f 34 volatile double fAmp;
pinofal 8:60f09ee3f03f 35 //volatile double fAmpNew;
pinofal 8:60f09ee3f03f 36 // flag per bloccare la generazione del segnale
pinofal 8:60f09ee3f03f 37 volatile int bGenerate = false;
pinofal 8:60f09ee3f03f 38
pinofal 8:60f09ee3f03f 39 // frequenza segnale da generare
pinofal 8:60f09ee3f03f 40 volatile double fFreq;
pinofal 8:60f09ee3f03f 41 //flag che diventa true se bisogna fermare la generazione di suoni
pinofal 8:60f09ee3f03f 42 volatile int bStop=true;
pinofal 8:60f09ee3f03f 43 // periodo della sinusoide da generare
pinofal 8:60f09ee3f03f 44 double fPeriod;
pinofal 8:60f09ee3f03f 45 // tipo di suono da generare: 0=Sine, 1= Square
pinofal 8:60f09ee3f03f 46 char cSoundWave;
pinofal 8:60f09ee3f03f 47
pinofal 8:60f09ee3f03f 48 // nota corrispondente al tasto premuto
pinofal 8:60f09ee3f03f 49 volatile char cKeyToPlay= '\0';
pinofal 8:60f09ee3f03f 50
pinofal 8:60f09ee3f03f 51 //**********************************************************************
pinofal 8:60f09ee3f03f 52 // generazione suoni con i sample da file di campioni in SoundSample.h
pinofal 8:60f09ee3f03f 53 //**********************************************************************
pinofal 8:60f09ee3f03f 54 void SampleOut()
pinofal 8:60f09ee3f03f 55 {
pinofal 8:60f09ee3f03f 56
pinofal 8:60f09ee3f03f 57 // genera campioni fino al raggiungimento del numero di campioni nel file Sound.h
pinofal 8:60f09ee3f03f 58 if((nSampleSoundIndex < nSampleNum) && (bGenerate == true))
pinofal 8:60f09ee3f03f 59 {
pinofal 8:60f09ee3f03f 60 // mette in output un campione della forma d'onda moltiplicato per l'amplificazione fAmp
pinofal 8:60f09ee3f03f 61 OutWave.write_u16(naInputSoundWave[nSampleSoundIndex]*fAmp);
pinofal 8:60f09ee3f03f 62 // incrementa l'indice del campione in output, nSampleNum è il numero dei campioni nle file Sound.h
pinofal 8:60f09ee3f03f 63 nSampleSoundIndex++;
pinofal 8:60f09ee3f03f 64 }
pinofal 8:60f09ee3f03f 65 else
pinofal 8:60f09ee3f03f 66 {
pinofal 8:60f09ee3f03f 67 // se è stato generato il numero di campioni del file oppure bGenerate = false, ferma la generazione di suoni
pinofal 8:60f09ee3f03f 68 bGenerate = false;
pinofal 8:60f09ee3f03f 69 }
pinofal 8:60f09ee3f03f 70 }
pinofal 8:60f09ee3f03f 71
pinofal 8:60f09ee3f03f 72 //*******************
pinofal 8:60f09ee3f03f 73 // Loop Principale
pinofal 8:60f09ee3f03f 74 //*******************
pinofal 8:60f09ee3f03f 75 int main()
pinofal 8:60f09ee3f03f 76 {
pinofal 8:60f09ee3f03f 77 //inizializza variabili
pinofal 8:60f09ee3f03f 78 bGenerate= false;
pinofal 8:60f09ee3f03f 79 bStop= true;
pinofal 8:60f09ee3f03f 80 cReadChar= 0;
pinofal 8:60f09ee3f03f 81 //nSampleOutIndex= 0;
pinofal 8:60f09ee3f03f 82 //nSampleOutCount= 0;
pinofal 8:60f09ee3f03f 83 nSampleSoundIndex= 0;
pinofal 8:60f09ee3f03f 84
pinofal 8:60f09ee3f03f 85 //imposta il funzionamento del pulsante come "PullDown": Aperto = '0'. L'altra modalità di funzionamento è PullUp
pinofal 8:60f09ee3f03f 86 myButton.mode(PullUp);
pinofal 8:60f09ee3f03f 87
pinofal 8:60f09ee3f03f 88 // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
pinofal 8:60f09ee3f03f 89 pc.baud(921600); //921600 bps
pinofal 8:60f09ee3f03f 90
pinofal 8:60f09ee3f03f 91 // test dei LED
pinofal 8:60f09ee3f03f 92 led2=1; // Blu
pinofal 8:60f09ee3f03f 93 wait_ms(500);
pinofal 8:60f09ee3f03f 94 led2=0;
pinofal 8:60f09ee3f03f 95
pinofal 8:60f09ee3f03f 96 pc.printf("\r\nHallo Amaldi Students - Exercise 12 \r\n");
pinofal 8:60f09ee3f03f 97 pc.printf("\n\r*** Sampled Sound Generator ***\n\r");
pinofal 8:60f09ee3f03f 98
pinofal 8:60f09ee3f03f 99 // fissa l'amplificazione da 0 a 1
pinofal 8:60f09ee3f03f 100 fAmp = 1.0;
pinofal 8:60f09ee3f03f 101
pinofal 8:60f09ee3f03f 102 // attende la pressione di tasti sulla marimba
pinofal 8:60f09ee3f03f 103 while(true)
pinofal 8:60f09ee3f03f 104 {
pinofal 8:60f09ee3f03f 105 if(myButton == 0)
pinofal 8:60f09ee3f03f 106 {
pinofal 8:60f09ee3f03f 107 while(myButton != 1){}; // attendi che il tasto sia rilasciato
pinofal 8:60f09ee3f03f 108 fFreq=nSamplePerSec;// campioni per secondo da generare
pinofal 8:60f09ee3f03f 109 pc.printf("--- Generazione B1 ---\n\r");
pinofal 8:60f09ee3f03f 110 bGenerate = true; // flag true quando è attiva la generazione di suoni
pinofal 8:60f09ee3f03f 111 nSampleSoundIndex =0; //inizializza indice dell'array
pinofal 8:60f09ee3f03f 112 fDeltaT = (1.0/fFreq); // fFreq dipende dal periodo di campionamento
pinofal 8:60f09ee3f03f 113 SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia generazione
pinofal 8:60f09ee3f03f 114 }
pinofal 8:60f09ee3f03f 115 } // while
pinofal 8:60f09ee3f03f 116 }