Publicaciones

Cómo generar música para un microcontrolador - cóndor pasa con pic16f88


 

En esta entrada os explicaré como generar música con un microcontrolador de microchip. y yo hice el cóndor pasa con pic16f88.

Se trataré de que se entienda mejor la idea y con un código más claro.
Si queremos generar música solo debemos generar ciertas frecuencias y se generara los sonidos para nuestros oídos.




Pero...¿Qué es un sonido?
Un sonido se trata de una onda de presión generada por un cuerpo en vibración que se propaga por un fluido.Tres características básicas del sonido son:
-La intensidad (Lo "fuerte" que se escucha el sonido)
-El tono (La frecuencia del sonido: a mayor frecuencia mas agudo y a menor frecuencia  mas grave)
-La duración (Cuanto dura el sonido)


Para generar un sonido con un PIC obviamente necesitaremos el PIC y un componente que reproduzca esas ondas audibles, el altavoz.
Si ponemos en alto "X" tiempo un pin del PIC y luego en bajo ese tiempo y repetimos esa secuencia, tendremos una onda. (Una onda cuadrada que se puede asemejar a una onda senoidal)


Asi que:
-El tiempo en alto(o bajo) será medio periodo de esta y con ello podremos calcular la frecuencia, es decir el tono.
-La intensidad del sonido será el voltaje que le suministremos al altavoz.
-Y la duración será cuanto tiempo repetiremos la secuencia de alto y bajo.

Ahora bien para generar música no basta con hacer sonidos con las frecuencias que nos de la gana ya que lo mas seguro es que no suene bien, si no que los sonidos deben de tener el tono adecuado, es decir, aquí es donde actúan las notas musicales. 




 Decir que dividimos el espectro audible (de 20 Hz a 20 KHz) en octavas, y las octavas en notas (Si me equivoco en algo que alguien me corrija que no soy experto en música :P).  Tenemos 7 notas musicales  (Do, Re Mi, Fa, Sol, La, Si) , cada una de ellas tendrá una frecuencia determinada. La octava inferior  de una nota tendrán la mitad de frecuencia y la octava superior tendrá el doble de frecuencia.
Por ejemplo la nota "La"  de la tercera octava tiene una frecuencia de 440 Hz, la cuarta octava tiene 880 Hz y la segunda octava 220 Hz. (A partir de esta nota se calculan las demás con unos cálculos)
(Para quién le interese saber más que lea este artículo vease en https://es.wikipedia.org/wiki/Nota_%28sonido%29  y/o  http://latecladeescape.com/h/2015/08/frecuencia-de-las-notas-musicales )

A nosotros solo nos interesarán las primeras 6 octavas ya que por encima de la sexta no se escucha bien con el PIC.
Estas son las frecuencias de cada nota (en Hz):



0
1
2
3
4
5
6
DO
32,70
65,40
130,81
261,62
523,25
1046,50
2093,00
DO#
34,64
69,29
138,59
277,18
554,36
1108,73
2217,46
RE
36,70
73,41
146,83
293,66
587,32
1174,65
2349,31
RE#
38,89
77,78
155,56
311,12
622,25
1244,50
2489,01
MI
41,20
82,40
164,81
329,62
659,25
1318,51
2637,02
FA
43,65
87,30
174,61
349,22
698,45
1396,91
2793,82
FA#
46,24
92,49
184,99
369,99
739,98
1479,97
2959,95
SOL
48,99
97,99
195,99
391,99
783,99
1567,98
3135,96
SOL#
51,91
103,82
207,65
415,30
830,60
1661,21
3322,43
LA
55,00
110,00
220,00
440,00
880,00
1760,00
3520,00
LA#
58,27
116,54
233,08
466,16
932,32
1864,65
3729,31
SI
61,73
123,47
246,94
493,88
987,76
1975,53
3951,06


Para no cargar el PIC con cálculos matemáticos pasamos la frecuencia ya a su equivalencia a T/2 que debe estar en alto o en bajo el PIC (en microsegundos) :



0
1
2
3
4
5
6
DO
15289,02
7644,51
3822,25
1911,12
955,56
477,78
238,89
DO#
14430,91
7215,45
3607,72
1803,86
901,93
450,96
225,48
RE
13620,97
6810,48
3405,24
1702,62
851,31
425,65
212,82
RE#
12856,48
6428,24
3214,12
1607,06
803,53
401,76
200,88
MI
12134,90
6067,45
3033,72
1516,86
758,43
379,21
189,60
FA
11453,82
5726,91
2863,45
1431,72
715,86
357,93
178,96
FA#
10810,97
5405,48
2702,74
1351,37
675,68
337,84
168,92
SOL
10204,20
5102,10
2551,05
1275,52
637,76
318,88
159,44
SOL#
9631,48
4815,74
2407,87
1203,93
601,96
300,98
150,49
LA
9090,90
4545,45
2272,72
1136,36
568,18
284,09
142,04
LA#
8580,67
4290,33
2145,16
1072,58
536,29
268,14
134,07
SI
8099,07
4049,53
2024,76
1012,38
506,19
253,09
126,54


Si habéis entendido lo anterior no será nada difícil entender el código para reproducir música con el PIC.

Código hecho en PIC16f88 (están aquí los tres archivos)

tonos.h
/*INICIO
////////////////// Driver to generate musical tones /////////////////////
////                                                                 ////
////  generate_tone(frequency, duration)     Generates wave at set   ////
////                                         frequency (Hz) for set  ////
////                                         duration (ms)           ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////


#ifndef  MUSIC_NOTES
#define  MUSIC_NOTES


//            NOTE                 FREQUENCY
//Octave0 Octave1 Octave2
//                       Octave4  Octave5  Octave6  Octave7
const long NOTA_DO[4]  ={262,     523,    1047,    2093}; //DO
const long NOTA_DOS[4] ={277,     554,    1109,    2217}; //DO#
const long NOTA_RE[4]  ={294,     587,    1175,    2349}; //RE
const long NOTA_RES[4] ={311,     622,    1245,    2489}; //RE#
const long NOTA_MI[4]  ={330,     659,    1329,    2637}; //MI
const long NOTA_FA[4]  ={349,     698,    1397,    2794}; //FA
const long NOTA_FAS[4] ={370,     740,    1480,    2960}; //FA#
const long NOTA_SOL[4]  ={392,     784,    1568,    3136}; //SOL
const long NOTA_SOLS[4] ={415,     831,    1661,    3322}; //SOL#
const long NOTA_LA[4]  ={440,     880,    1760,    3520}; //LA
const long NOTA_LAS[4] ={466,     923,    1865,    3729}; //LA#
const long NOTA_SI[4]  ={494,     988,    1976,    3951}; //SI

#endif

#define TONE_PIN  PIN_B0


void do_delay(int ms_delay, int num_ms, int us_delay, int num_us)  {
 int i;

 for(i=0;i<num_ms;i++)
  delay_ms(250);
 delay_ms(ms_delay);
 for(i=0;i<num_us;i++)
  delay_us(250);
 delay_us(us_delay);
}


void tocar(long frequency, long duration)
{
   int32 total_delay_time;                      // in microseconds
   long total_ms_delay_time, total_us_delay_time;
   int num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
   long num_periods;

   total_delay_time = (1000000/frequency)/2-10; // calculate total delay time (10 for error)

   total_ms_delay_time = total_delay_time/1000; // total delay time of ms
   num_ms_delays = total_ms_delay_time/250;     // number of 250ms delays needed
   ms_delay_time = total_ms_delay_time%250;     // left over ms delay time needed

   total_us_delay_time = total_delay_time%1000; // total delay time of us (ms already acounted for)
   num_us_delays = total_us_delay_time/250;     // number of 250us delays needed
   us_delay_time = total_us_delay_time%250;     // left over us delay time needed

   num_periods = ((int32)duration*1000)/(1000000/frequency);

   while((num_periods--) != 0)
   {
      do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
      output_high(TONE_PIN);
      do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
      output_low(TONE_PIN);
   }

   return;
}
FIN */

notas.h
/*INICIO
   //Notas e¿ndor Pasa
 //  int semifusa=31;
 // int fusa=62;
 //  int semicorchea=125;
 //  int corchea=250;
   long negra=500;
   long blanca=1000;
   long redonda=2000;
    //Puntillos
   long negrap=750;
   long blancap=1500;
   long redondap=3000;  
   //Ligada
   long negral=750;
   long blancal=1500;
    long redondal=3000;
   //Silencios
   long negras= delay_ms(500);
   long blancas= delay_ms(1000);
   long redondas= delay_ms(2000);
FIN */

sonido.c

/*INICIO
WWW.NETANDINO.COM
Autor: Teodoro Infantes Yupan
Microcontroladores II
Generando Tonos con Microcontrolador
Más detalle en nuestro canal e Youtube
También puede ver en Nuestro Blog.
http://netandino.blogspot.com
*/
#include < 16F88.h >
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4M)
#include "tonos.h"// libreria tones en misma carpeta
#include "notas.h"

void linea1(){
tocar(NOTA_LA[1],negra);
tocar(NOTA_SOLS[1],negra);
tocar(NOTA_LA[1],negra);
tocar(NOTA_SI[1],negra);
tocar(NOTA_DO[2],negra);
tocar(NOTA_SI[1],negra);
tocar(NOTA_DO[2],negra);
tocar(NOTA_RE[2],negra);
tocar(NOTA_MI[2],redondal);
tocar(NOTA_SOL[2],blanca);
}
void linea2(){
  //Segunda línea
tocar(NOTA_MI[2],redondal);
tocar(NOTA_LA[2],negra);
tocar(NOTA_SOL[2],negra);
tocar(NOTA_MI[2],redondap);
tocar(NOTA_RE[2],negra);
tocar(NOTA_DO[2],negra);
   //Solo hasta fin de BIZ
}

void linea3(){
tocar(NOTA_LA[1],redondal);
tocar(NOTA_DO[2],blanca);
tocar(NOTA_LA[1],redondal);
tocar(NOTA_LA[1],negras);
tocar(NOTA_MI[2],negra);
tocar(NOTA_LA[2],blancap);
tocar(NOTA_SOLS[2],negra);
tocar(NOTA_LA[2],negra);
tocar(NOTA_SOL[2],negra);
tocar(NOTA_LA[2],negra);
tocar(NOTA_SOL[2],negra);
tocar(NOTA_LA[2],negra);
tocar(NOTA_SOL[2],negra);
tocar(NOTA_LA[2],redondal);
}
void main(void)  {
 while(TRUE){
 //Primera línea
  tocar(NOTA_MI[1],negra);
 linea1();
 linea2();
 tocar(NOTA_LA[1],redondal);  
 tocar(NOTA_LA[1],negras);
 tocar(NOTA_MI[1],negra);
 //BIZ regresas hasta LA
 linea1();
 linea2();
 // FIN de BIZ
 linea3();
 tocar(NOTA_LA[1],redondal);
delay_ms(2000);
       
}
}
FIN */


 

Haremos el trabaja con el tema del condor pasa.

Mi La Sol# La Si do° Si do° re° mi°
sol° mi° la° sol° mi° mi° re° do° re° do° La
Mi La Sol# La Si do° Si do° re° mi°
sol° mi° la° sol° mi° mi° re° do° re° do° La
Mi La Sol# La Sol# La Sol# La Si do° do°
La Sol La Sol Mi
Mi La Sol# La Sol# La Sol# La Si do° do°
La Sol La Sol Mi
mi° re° do° re° do° La


O tomaremos uno de estas notas Variadas del condor pasa.

INTRODUCCIÓN
LA….SOL LA SOL MI  DO  MI….
MI MI MI FA  MI  DO SI DO LA…

LENTO(YARAVÍ)
MI LA SOL# LA SI DO SI DO  MI…
SOL…MI…LA SOL MI. MI  DO LA

DO  MI LA…SOL# LA SOL# LA SOL# LA
DO LA SOL…LA SOL MI.
DO  MI LA…SOL# LA SOL# LA SOL# LA…
DO LA SOL…LA SOL MI..MI RE DO LA
DO…LA…DOLA RE MI.

(PASACALLE)
LA LA LA LA LA LA LA
MI LA SOL# LA SI DO SI DO RE MI
SOL MI….RE DO LA
MI LA….SOL# LA SOL# LA

MI LA SOL# LA SI DO SI DO RE MI
SOL MI….RE DO LA
MI LA….SOL# LA SOL# LA

DO LA SOL….LA SOL MI
MI LA SOL# LA SI DO SI DO RE MI
SOL MI….RE DO LA

MI LA SOL# LA SI DO SI DO RE MI
SOL MI..MI RE MI RE DO LA
DO LA DO LA DO RE MI LA.

(HUAYNO)
MI LA SOL# LA MI RE DO LA SOL LA MI
SOL LA SI RE MI SOL MI

MI LA SOL# LA MI RE DO LA SOL LA MI
SOL LA DO RE MI RE DO SI LA
MI SOL MI SOL RE SOL MI
MI SOL MI SOL RE SOL MI

MI LA SOL# LA MI RE DO LA SOL LA MI
SOL LA DO RE MI RE DO SI LA
DO DO MI RE DO LA DO LA SOL
DO DO MI SOL MI RE DO

LA LA DO LA SOL MI MI RE MI SOL
LA LA DO LA SOL MI MI RE MI SOL
DO DO RE MI RE DO LA

PARTE 
MI LA SOL# LA SI DO SI DO RE MI
LA SOL# LA MI RE DO SI LA SI
DO RE MI RE DO SI LA.

  VideoTutorial.



BAJAR SIMULACIÓN
Clave: www.netandino.com
 
Más detalles aquí http://netandino.blogspot.pe/2016/06/repaso-general-sobre-lenguaje-musical.html
 
Share this Article on :
 
d Copyright Electrónica Net Andino 2006 | Design by Net Andino | Published by Editor de Templates | Powered by Net Andino .