Riproduce un messaggio sonoro

Dependencies:   mbed BSP_DISCO_L496AG

Revision:
0:817b136c4489
Child:
1:4baec1317561
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Apr 26 15:51:52 2019 +0000
@@ -0,0 +1,211 @@
+#include "mbed.h"
+#include "stm32l496g_discovery_lcd.h"
+#include "stm32l496g_discovery_audio.h"
+
+#define BSP_AUDIO_OUT_STEREOMODE        ((uint32_t)0x00000004) /* STEREO MODE          */
+#define BSP_AUDIO_FREQUENCY_44K         SAI_AUDIO_FREQUENCY_44K  // Frequenza di campionamento
+#define AUDIODATA_SIZE                      2   /* 16-bits audio data size */
+#define DEFAULT_AUDIO_OUT_CHANNEL_NBR       ((uint8_t)2) // Stereo 2
+
+// definizione durata note
+#define SEMIBREVE 2000000 // durata della semibreve in microsecondi = 4sec
+#define MINIMA SEMIBREVE/2  
+#define SEMIMINIMA SEMIBREVE/4 
+#define CROMA SEMIBREVE/8  
+#define SEMICROMA CROMA/16  
+#define BISCROMA SEMIBREVE/32 
+#define SEMIBISCROMA SEMIBREVE/64 
+#define SBRMIN SEMIBREVE+SEMIMINIMA
+#define MINSEMIN MINIMA+SEMIMINIMA
+#define SEMCROMA SEMIMINIMA+CROMA
+#define SEMCROMCROM SEMICROMA+CROMA
+
+// definizione della frequenza delle note ottava centrale del pianoforte
+#define m 0
+#define C4 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 G4 392.0
+#define G1d 415.3
+#define A1b 415.3
+#define A1 440.0
+#define A1d 466.16
+#define B1b 466.16
+#define B1 493.18
+#define F5 698.0
+#define G5 784.0
+#define E5b 622.0
+#define C5 523.0
+#define LA4 440.0
+#define LA4d 466.0
+#define D4 294.0
+#define D4d 311.0
+#define B4 494.0
+#define F4 349.0
+#define F4d 370.0
+#define B4b 466.0
+#define A4b 415.0
+#define E4 330.0
+#define C6 1046.0
+#define C7 2093.0
+#define B5 988.0
+#define G7 3136.0
+#define D6 1175.0
+#define E4b 311.0
+#define E5 659.0
+#define G5 784.0
+#define A5b 831.0
+#define B5b 932.0
+#define C8 4186.0
+#define G4 392.0
+#define F4d 370.0
+#define C4d 277.0
+#define A4d 466.0
+#define C5d 554.0
+#define F4d 370.0
+#define F5d 698.0 
+#define A4 440.0
+#define D5 587.0
+#define A5d 932.0
+#define D5d 622.0
+
+// numero di campioni che compongono un periodo della sinusoide in Output sull'ADC
+#define SAMPLESINENUM   45// consigliabile avere  multipli di 45
+
+// parametri dell'onda coseno da generare
+#define PI        (3.141592653589793238462)
+#define AMPLITUDE 32767 //(1.0)    // x * 3.3V
+#define PHASE     (PI/2) // 2*pi è un periodo
+#define OFFSET    32767 //(0x7FFF)
+
+// numero di note componenti la scala diatonica
+#define NUMTONE 120
+
+// ticker per la generazione dell'onda con DAC
+Ticker SampleOutTicker;
+
+// Buffer contenente la sinusoide da porre in output.
+unsigned short usaSine[SAMPLESINENUM];
+
+// prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
+void CalculateSinewave(void);
+// cSoundWave = 0 for sine and = 1 for square
+char cSoundWave;
+
+void CalculateSinewave(int nOffset, int nAmplitude, double fPhase)
+{
+    // variabile contenente l'angolo in radianti
+    double fRads;
+    // indici per i cicli
+    int nIndex;
+    // passo in frequenza fissato dal numero di campioni in cui voglio dividere un periodo di sinusoide: DeltaF = 360°/NUMSAMPLE
+    double fDeltaF;
+    // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
+    double fAngle;
+    
+    // a seconda della selezione, genera una diversa forma d'onda
+    // ATTENZIONE ----- SAREBBE MEGLIO CAMBIARE IL NOME DELL'ARRAY in usaWave[] !!!!! ----
+    if(cSoundWave=='0')
+    {
+        // genera forma d'onda sinusoidale
+        fDeltaF = 360.0/SAMPLESINENUM;
+        for (nIndex = 0; nIndex < SAMPLESINENUM; nIndex++) 
+        {
+            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;
+        }
+     }
+     else
+     {
+        // genera forma d'onda quadra. 
+        for (nIndex = 0; nIndex < SAMPLESINENUM/2; nIndex++) 
+        {
+            usaSine[nIndex] = nAmplitude*(1.0)+ nOffset;
+        }
+        for (nIndex = SAMPLESINENUM/2; nIndex < SAMPLESINENUM; nIndex++) 
+        {
+            usaSine[nIndex] = nAmplitude*(-1.0)+ nOffset;
+        }
+     }   
+}
+
+
+int main()
+{
+    BSP_LCD_Init();
+   
+    // indice per i cicli
+    int nIndex;
+                        
+    // numero di note che compongono il brano
+    #define WHENDURATION 32 // numero di note che compongono il brano
+    // note del brano
+    float fNoteWhen [WHENDURATION] = {D4, F4d, G4, A1, D4, F4d, G4, A1, D4, F4d, G4, A1, F4d,
+    D4, F4d, E4, F4d, F4d, E4, D4, D4, F4d, A1, A1, G4, F4d, G4, A1, F4d, D4, E4, D4};
+    // durata delle note del brano
+    float fLengthWhen[WHENDURATION] ={SEMIMINIMA, SEMIMINIMA, SEMIMINIMA, SBRMIN, SEMIMINIMA,
+    SEMIMINIMA, SEMIMINIMA, SBRMIN, SEMIMINIMA, SEMIMINIMA, SEMIMINIMA, MINIMA, MINIMA,
+    MINIMA, MINIMA, SBRMIN, SEMIMINIMA, SEMIMINIMA, SEMIMINIMA, SBRMIN, SBRMIN, MINIMA, MINIMA, SEMIMINIMA,
+    SBRMIN, SEMIMINIMA, SEMIMINIMA, MINIMA, MINIMA, MINIMA, MINIMA, SEMIBREVE};
+    
+    //BSP_AUDIO_OUT_DeInit();
+
+    while(1) {
+        BSP_LCD_SetFont(&Font12);
+        BSP_LCD_Clear(LCD_COLOR_MAGENTA);
+        BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
+        BSP_LCD_SetTextColor(LCD_COLOR_ORANGE);
+        BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"DISCO_L496AG", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"VIOLATER", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)"WELCOME", CENTER_MODE);
+        wait(2);
+        BSP_LCD_SetFont(&Font16);
+        BSP_LCD_Clear(LCD_COLOR_RED);
+        BSP_LCD_SetBackColor(LCD_COLOR_RED);
+        BSP_LCD_SetTextColor(LCD_COLOR_YELLOW);
+        BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"DISCO_L496AG", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"VIOLATER", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)"WELCOME", CENTER_MODE);
+        wait(2);
+        BSP_LCD_SetFont(&Font20);
+        BSP_LCD_Clear(LCD_COLOR_GREEN);
+        BSP_LCD_SetBackColor(LCD_COLOR_GREEN);
+        BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
+        BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"DISCO_L496AG", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"VIOLATER", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)"WELCOME", CENTER_MODE);
+        wait(2);
+        BSP_LCD_Clear(LCD_COLOR_BLUE);
+        BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
+        BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
+        BSP_LCD_SetFont(&Font24);
+        BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"DISCO_L496AG", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"VIOLATER", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)"WHEN THE SAINT GO MARCHING IN", CENTER_MODE);
+        wait(2);
+        cSoundWave = 0;
+        BSP_AUDIO_OUT_SetVolume(50.0);
+        for(nIndex=0; nIndex<WHENDURATION; nIndex++)
+        {
+           BSP_AUDIO_OUT_Init( OUTPUT_DEVICE_HEADPHONE,
+                        50.0,
+                        fNoteWhen[nIndex]);
+           if (BSP_AUDIO_OUT_Stop != 0) 
+            {
+                BSP_AUDIO_OUT_Play((uint16_t *)OUTPUT_DEVICE_HEADPHONE, AUDIODATA_SIZE); // oppure fNoteWhen[nIndex]
+            }
+            wait_us(fLengthWhen[nIndex]);  
+        }
+        wait(2);
+    }                  //p.s. La funzione per il vecchio amplificatore SampleOut per la lettura della sinusoide non funziona
+
+}