Generazione suono campionato
Dependencies: mbed
Fork of Amplificatore_bomboni_rev2 by
SampledSound.cpp@8:60f09ee3f03f, 2018-11-08 (annotated)
- Committer:
- pinofal
- Date:
- Thu Nov 08 12:14:38 2018 +0000
- Revision:
- 8:60f09ee3f03f
Dovrebbe funzionare
Who changed what in which revision?
User | Revision | Line number | New 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 | } |