program that sound the imperial march

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 // Definimos los tonos de frecuencia en Hertz
00004 #define c 261
00005 #define d 294
00006 #define e 329
00007 #define f 349
00008 #define g 391
00009 #define gS 415
00010 #define a 440
00011 #define aS 455
00012 #define b 466
00013 #define cH 523
00014 #define cSH 554
00015 #define dH 587
00016 #define dSH 622
00017 #define eH 659
00018 #define fH 698
00019 #define fSH 740
00020 #define gH 784
00021 #define gSH 830
00022 #define aH 880
00023 
00024 // Definimos una matriz con el orden en que se reproducen los tonos
00025 int imperialMarch[] = { a, a, a, f, cH,
00026                     a, f, cH, a,
00027                     eH, eH, eH, fH, cH,
00028                     gS, f, cH, a,
00029                     aH, a, a, aH, gSH, gH,
00030                     fSH, fH, fSH,
00031 
00032                     aS, dSH, dH, cSH,
00033                     cH, b, cH,
00034 
00035                     f, gS, f, a,
00036                     cH, a, cH, eH,
00037                     aH, a, a, aH, gSH, gH,
00038                     fSH, fH, fSH,
00039 
00040                     aS, dSH, dH, cSH,
00041                     cH, b, cH,
00042 
00043                     f, gS, f, cH,
00044                     a, f, c, a};
00045 
00046 // Definimos otra matriz con la duración de los tonos
00047 int tones[] = { 500, 500, 500, 350, 150,
00048             500, 350, 150, 1000,
00049             500, 500, 500, 350, 150,
00050             500, 350, 150, 1000,
00051             500, 350, 150, 500, 250, 250,
00052             125, 125, 250,
00053 
00054             250, 500, 250, 250,
00055             125, 125, 250,
00056 
00057             125, 500, 375, 125,
00058             500, 375, 125, 1000,
00059             500, 350, 150, 500, 250, 250,
00060             125, 125, 250,
00061 
00062             250, 500, 250, 250,
00063             125, 125, 250,
00064 
00065             250, 500, 375, 125,
00066             500, 375, 125, 1000};
00067 
00068 // Definimos el número total de tonos que empleamos
00069 int tones_num = 66;
00070 
00071 // Establecemos una salida PWM( PB_3 ) para el buzzer, y una digital para el LED
00072 // de la Núcleo( PA_5 ) como indicador de que se está reproduciendo un tono
00073 PwmOut Buzzer(PWM_OUT);
00074 DigitalOut Led1(LED1);
00075 
00076 // Definimos una función prototipo                    
00077 void Play_tunes(PwmOut name, int notes, int tones);
00078 
00079 // ----- FUNCIÓN PRINCIPAL DEL PROGRAMA -----
00080 int main(void)
00081 {
00082     // Declaramos una variable i para el siguiente ciclo FOR
00083     int i;
00084 
00085     // Con este ciclo FOR recorremos cada uno de los tonos y sus duraciones
00086     for(i=0; i<tones_num; i++)
00087     {   
00088         // Mandamos a llamar a la función Play_tunes dandole los valores del
00089         // pin del buzzer, el valor i de la matriz de notas y de los tonos
00090         Play_tunes(Buzzer, imperialMarch[i], tones[i]);
00091         // Aquí separamos las estrofas de nuestra melodía
00092         if( i == 27 || i == 34 || i == 51 || i == 58 )
00093         {
00094             // ... estas estrofas se separan 250ms una de la otra
00095             wait_ms(250);
00096         }
00097     }
00098 }
00099 
00100 // Esta es la función Play_tunes que mandamos a llamar dandole algunos
00101 // valores anteriormente
00102 void Play_tunes(PwmOut name, int notes, int tones)
00103 {
00104     // Declaramos una variable tipo flotante
00105     float period;
00106     // Calculamos el periodo de la nota en turno a reproducir
00107     period = 1000000/notes;
00108     // Activamos el led de la Núcleo para indicar que estamos reproduciendo
00109     // una nota
00110     Led1 = 1;
00111     // Establecemos el periodo calculado a la salida PWM
00112     name.period_us(period);
00113     // Establecemos un ciclo de trabajo del %50
00114     name.write(0.50f);
00115     // Esperamos el tiempo establecido por el tono i
00116     wait_ms(tones);
00117     // Desactivamos el led de la Núcleo para indicar el fin de la nota
00118     Led1 = 0;
00119     // Terminamos la nota
00120     name.period_us(0);
00121     // Esperamos un poco para diferenciar entre una nota y otra
00122     wait_ms(20);
00123 }