lunes, 25 de enero de 2010

Crear melodías con un timbre

Vamos a utilizar un par de funciones para tocar una melodía, modificando los valores de las variables siguientes podemos modificar la melodía tocada.
length representa el número de notas, notes[] hace referencia a la frecuencia de cada nota, y
beats[] que representa la duración de cada nota.


El circuito físico lo implementaremos de la siguiente manera:
+ Lado positivo del timbre al pin 9 (digital)
- Lado negativo a ground





Aquí está el código:


const int speakerPin = 9;
int length = 19; // the number of notes
char notes[] = "cde cdef efg abC bC"; // a space represents a rest
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4, 1, 2, 3, 4 };
int tempo = 300;
int i=0;

void playTone(int tone, int duration)
{
for (long i=0; i < (duration*1000L) ; i+=tone*2)
{
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}

void playNote(char note, int duration)
{
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
// play the tone corresponding to the note name
for (int i=0; i<8; i++)
{
if (names[i] == note)
{
playTone(tones[i], duration);
}
}
}

void setup()
{
pinMode(speakerPin, OUTPUT);
}

void loop()
{
for (i=0; i<(length); i++)
{
if (notes[i] == ' ')
{
delay(beats[i]*tempo); // rest
}
else
{
playNote(notes[i], beats[i]*tempo);
}
// pause between notes
delay(70);
}
}

No hay comentarios:

Publicar un comentario