Electronica, Microcontroladores y Psicología
  Melodías con PIC
 


Bueno aquí estoy de nuevo con un proyecto/tutorial, esta vez vamos a generar melodías con un PIC, primero voy a explicar algunas cosas que puedes obviar si sabes algo de música.

 

Las canciones que escuchamos están compuestas por notas musicales (DO, RE, MI, FA, SOL, LA, SI) a cada una de estas notas le corresponde una frecuencia. En la siguiente tabla mostraré qué frecuencia le corresponde a cada nota:

 

Do – C

262 Hz

Re – D

294 Hz

Mi – E

330 Hz

Fa – F

349 Hz

Sol – G

392 Hz

La – A

440 Hz

Si - B

494 Hz

 

Las letras que coloqué al lado de cada nota pertenecen a la nomenclatura inglesa (otra forma de llamar a las notas), las coloqué por que son con las que trabaja la librería del PIC C Compiler.

 

Las notas tienen también una duración, que está determinada por las figuras musicales; para este ejemplo se usará la siguiente duración.

 

Fusa

62 mS

Semicorchea

125 mS

Corchea

250 mS

Negra

500 mS

Blanca

1 Segundo

Redonda

2 Segundos

 

No se si estos tiempos son los correctos, pero las melodías con la que los he probado suenan bien, si alguna sabe con exactitud la duración de la figuras por favor corríjanme.

 

Bueno ya tenemos la frecuencia y la duración, entonces a explicar el código. Las notas se generarán utilizando una librería que trae el CCS. La librería de llama “TONES.C” e incluye esta función:

 

generate_tone(frequency, duration)

 

Esta función nos permitirá crear las notas musicales. Para usarla debemos tener en cuenta los siguientes parámetros:

 

“frecuency” es una variable que tomará el valor de la nota que queramos generar.

“duration” es el tiempo que durará la nota y está dada en milisegundos.

 

La librería trae predefinidas las frecuencias adecuadas para cada nota y permite elegir en que octava tocarla; permite hasta una tercera octava. 
 

Así pues, si por ejemplo queremos generar un Do que dura una negra, le decimos entonces:

 

generate_tone(C_NOTE[0], 500);

 

Entonces si queremos generar la escala musical, sería así:

 

 

Entonces teniendo esto y espero que todo haya quedado claro, lo único que necesitamos son las partituras de las canciones que queramos crear.

 

A continuación les mostraré el código para el “Himno de la alegría”:

 

 

#include <16f84.h>
#use delay (clock=4000000, RESTART_WDT)
#include <TONES.c>
 
int S_corchea=125,corchea=250,fusa=62;
long negra=500,blanca=1000,redonda=2000;
 
main()
{
set_tris_a(0x00);
set_tris_b(0x00);
output_b(0x00);
while (1)
{
 
generate_tone(B_NOTE[0], blanca);
generate_tone(C_NOTE[1], negra);
generate_tone(D_NOTE[1], negra);
generate_tone(D_NOTE[1], negra);
generate_tone(C_NOTE[1], negra);
generate_tone(B_NOTE[0], negra);
generate_tone(A_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(A_NOTE[0], negra);
generate_tone(B_NOTE[0], negra);
generate_tone(B_NOTE[0], blanca);
generate_tone(A_NOTE[0],negra);
generate_tone(A_NOTE[0],negra);
 
delay_ms(1000);
 
generate_tone(A_NOTE[0], blanca);
generate_tone(B_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(A_NOTE[0], negra);
generate_tone(B_NOTE[0], corchea);
generate_tone(C_NOTE[1], corchea);
generate_tone(B_NOTE[0], negra);
generate_tone(G_NOTE[0],negra);
generate_tone(A_NOTE[0], negra);
generate_tone(B_NOTE[0], corchea);
generate_tone(C_NOTE[1], corchea);
generate_tone(B_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(A_NOTE[0], negra);
generate_tone(D_NOTE[0], blanca);
 
delay_ms(2000);
 
}
}

 

Por comodidad definí la duración de las notas al principio del programa; para escuchar la canción copien el código y compílenlo, luego lo simulan. Para los que usan Proteus les dejo una imagen:

 

Espero que les sea de mucha utilidad, si no tienen la librería escríbanme al correo y con mucho gusto se las enviaré. Suerte.

 

generate_tone(C_NOTE[0], 500);
generate_tone(D_NOTE[0], 500);
generate_tone(E_NOTE[0], 500);
generate_tone(F_NOTE[0], 500);
generate_tone(G_NOTE[0], 500);
generate_tone(A_NOTE[0], 500);
generate_tone(B_NOTE[0], 500);
 
   
 
Este sitio web fue creado de forma gratuita con PaginaWebGratis.es. ¿Quieres también tu sitio web propio?
Registrarse gratis