TOCAR UNA CANCIÓN CON PIC
A continuación les mostraré mostraré el código para que el PIC toque una canción, en este caso el Himno de la alegría, para esto utilicé la libreria del PIC C Compiler "TONES.C", para una mejor sigan este link link:: #include <16f84.h> #use delay (clock=4000000, RESTART_WDT) #include int S_corchea=125,corchea=250 S_corchea=125,corchea=250,fusa=62; ,fusa=62; long negra=500,blanca=1000,redon negra=500,blanca=1000,redonda=2000; da=2000; main() { set_tris_a(0x00); set_tris_b(0x00); output_b(0x00); while (1) { generate_tone(B_NOTE[0], generate_tone(B_NOTE[0], blanca); generate_tone(C_NOTE[1], generate_tone(C_NOTE[1], negra); generate_tone(D_NOTE[1], generate_tone(D_NOTE[1], negra); generate_tone(D_NOTE[1], generate_tone(D_NOTE[1], negra); generate_tone(C_NOTE[1], generate_tone(C_NOTE[1], negra); generate_tone(B_NOTE[0], generate_tone(B_NOTE[0], negra); generate_tone(A_NOTE[0], generate_tone(A_NOTE[0], negra); generate_tone(G_NOTE[0], generate_tone(G_NOTE[0], negra); generate_tone(G_NOTE[0], generate_tone(G_NOTE[0], negra); generate_tone(A_NOTE[0], generate_tone(A_NOTE[0], negra); generate_tone(B_NOTE[0], generate_tone(B_NOTE[0], negra); generate_tone(B_NOTE[0], 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], generate_tone(A_NOTE[0], blanca); generate_tone(B_NOTE[0], generate_tone(B_NOTE[0], negra); generate_tone(G_NOTE[0], generate_tone(G_NOTE[0], negra); generate_tone(A_NOTE[0], generate_tone(A_NOTE[0], negra); generate_tone(B_NOTE[0], generate_tone(B_NOTE[0], corchea); generate_tone(C_NOTE[1], generate_tone(C_NOTE[1], corchea); corchea); generate_tone(B_NOTE[0], generate_tone(B_NOTE[0], negra); generate_tone(G_NOTE[0],negra); generate_tone(A_NOTE[0], generate_tone(A_NOTE[0], negra); generate_tone(B_NOTE[0], generate_tone(B_NOTE[0], corchea); generate_tone(C_NOTE[1], generate_tone(C_NOTE[1], corchea); corchea); generate_tone(B_NOTE[0], generate_tone(B_NOTE[0], negra); generate_tone(G_NOTE[0], generate_tone(G_NOTE[0], negra); generate_tone(G_NOTE[0], generate_tone(G_NOTE[0], negra); generate_tone(A_NOTE[0], generate_tone(A_NOTE[0], negra);
generate_tone(D_NOTE[0], blanca); delay_ms(2000); } } Ahora una imagen de la simulacion:
GENERAR
MELODIAS CON PIC
Muchos habrán querido alguna vez poner a "cantar" a su microcontrolador, realmente no es muy dificil hacerlo, existen varios métodos; a continuacion les mostraré uno relamente sencillo: 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 cómo crearlas en el PIC. 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. A continuación les mostraré las tablas:
// //
NOTE
FREQUENCY
Octave0 Octave1 Octave2 Octave3
const long C_NOTE[4] ={ 262, const long Db_NOTE[4] ={ 277,
523, 1047, 554, 1109,
2093}; 2217};
const long D_NOTE[4] ={ 294,
587, 1175, 2349};
const long Eb_NOTE[4] ={ 311,
622,
1245,
2489};
const long E_NOTE[4] ={ 330,
659,
1329,
2637};
const long F_NOTE[4] ={ 349,
698,
1397,
2794};
const long Gb_NOTE[4] ={ 370,
740, 1480,
2960};
const long G_NOTE[4] ={ 392,
784, 1568, 3136};
const long Ab_NOTE[4] ={ 415,
831,
const long A_NOTE[4] ={ 440, const long Bb_NOTE[4] ={ 466, const long B_NOTE[4] ={ 494,
1661,
3322};
880, 1760,
3520};
923,
1865,
988, 1976,
3729}; 3951};
OJO: Esto solo lo coloco como una ayuda por si alguien está perdido, no es la librería completa, es solo un pedazo, si la copian así, nunca les va a funcionar.
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í:
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);
Entonces teniendo esto y espero que todo haya quedado claro, lo único que necesitamos son las partituras de las canciones que queramos crear.