Keytar
En este proyecto se ha decidido hacer un Keytar. Esto viene a ser un piano que pueda ser tocado de pie, es decir, no hace falta que esté sujeto al suelo como los pianos convencionales. Un Keytar se llama así por el parecido con una guitarra, donde “key” significa tecla y “tar” son las últimas letras de guitar.
Coste del proyecto
Dado que se nos proporcionó una gran cantidad de material, se ha gastado poco dinero extra en la elaboración del proyecto. Los componentes adicionales que se han comprado son los siguientes:
Componente | Cantidad | Precio |
Pulsador | 20 | 10.40 € |
Buzzer | 3 | 2.20 € |
Cables | 3 | 3.60 € |
La cantidad de pulsadores es bastante grande dado que el primer pedido que se realizó de 10 pulsadores tenían los pines muy pequeños, por lo que se descolgaban todo el rato de la protoplaca. Esto hizo que tuviéramos que pedir otro pack de 10 pulsadores con pines de un tamaño mayor.
Funcionalidad
Este Keytar permite la reproducción de notas en dos escalas disponibles, así como producir dichas notas sostenidas o grabar una melodía para, más tarde, poder reproducirla. Está construido de forma que cada una de las protoplacas recaiga sobre una mano, de manera que puedan ser pulsados los botones de notas y de funciones extra (escala, sostenidos y grabación) al mismo tiempo
Problemas encontrados
El primer enfoque que quisimos darle al proyecto fue reproducir varios sonidos a la vez de forma que se formasen acordes. Nos dimos cuenta que esto no era posible en una Arduino, por lo que tuvimos que simplificar el proyecto de forma que solo se reprodujese una nota en vez de varias a la vez.
Como se ha comentado antes, otro problema que tuvimos fue que los primeros pulsadores que compramos tenían los pines muy pequeños por lo que no se conectaban bien a la protoplaca y se caían continuamente.
Posibles mejoras
La reproducción de melodías a través de la funcionalidad de la grabadora no es del todo exacta, debido a la forma en la que se guardan los tiempos, por lo tanto una posible mejora sería implementar un código más óptimo para desempeñar esta función.
Nos hubiese gustado poder hacer un diseño más llamativo para el producto en cuestión dado que el soporte está compuesto simplemente de una superficie de cartón.
Código
#define DO 262
#define DOs 277
#define RE 294
#define REs 311
#define MI 330
#define FA 349
#define FAs 370
#define SOL 392
#define SOLs 415
#define LA 440
#define LAs 466
#define SI 494
#define DO2 523
#define DO2s 554
#define RE2 587
#define RE2s 622
#define MI2 659
#define FA2 698
#define FA2s 740
#define SOL2 784
#define SOL2s 831
#define LA2 880
#define LA2s 932
#define SI2 988
#define DO3 1047
int grabadora;
int contador;
int nota;
int* list;
size_t count;
size_t capacity;
int analog0 = 0;
int analog1 = 1;
int analog2 = 2;
int buzzer = 13;
// Crear una nueva lista
void CreateList(size_t _capacity)
{
list = new int[_capacity];
capacity = _capacity;
count = 0;
}
int Elemento(int pos)
{
return list[pos];
}
void AddItem(int item)
{
++count;
if (count > capacity)
{
size_t newSize = capacity * 2;
resize(newSize);
}
list[count - 1] = item;
}
void RemoveTail()
{
--count;
}
void Trim()
{
resize(count);
}
void resize(size_t newCapacity)
{
int* newList = new int[newCapacity];
memmove(newList, list, count * sizeof(int));
delete[] list;
capacity = newCapacity;
list = newList;
}
// Muestra la lista por Serial para debug
void printList()
{
Serial.print("Capacity:");
Serial.print(capacity);
Serial.print(" Count:");
Serial.print(count);
Serial.print(" Items:");
for (size_t index = 0; index < count; index++)
{
Serial.print(list[index]);
Serial.print(' ');
}
Serial.println();
}
void setup()
{
int grabadora = 0;
int contador = 0;
int nota = 0;
Serial.begin(9600);
CreateList(2);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
}
void loop()
{
if (analogRead(analog2) > 500)
{
delay(500);
if (grabadora == 0)
{
grabadora = 1;
contador = 0;
}
else if (grabadora == 1)
{
grabadora = 2;
}
else if (grabadora == 2)
{
int a = 0;
int b = 0;
for (int i = 0; i < count; i= i+2)
{
int a = Elemento(i);
int b = Elemento(i+1);
if (a > 0)
{
tone(buzzer, a, b);
delay(b);
noTone(buzzer);
}
else
{
delay(b);
}
}
}
}
if (analogRead(analog1) < 100)
{
if (digitalRead(6) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, DOs);
nota = DOs;
}
else
{
tone(buzzer, DO);
nota = DO;
}
}
else if (digitalRead(7) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, REs);
nota = REs;
}
else
{
tone(buzzer, RE);
nota = RE;
}
}
else if (digitalRead(8) == LOW)
{
tone(buzzer, MI);
nota = MI;
}
else if (digitalRead(9) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, FAs);
nota = FAs;
}
else
{
tone(buzzer, FA);
nota = FA;
}
}
else if (digitalRead(10) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, SOLs);
nota = SOLs;
}
else
{
tone(buzzer, SOL);
nota = SOL;
}
}
else if (digitalRead(11) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, LAs);
nota = LAs;
}
else
{
tone(buzzer, LA);
nota = LA;
}
}
else if (digitalRead(12) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, DO2);
nota = DO2;
}
else
{
tone(buzzer, SI);
nota = SI;
}
}
else
{
noTone(buzzer);
if (grabadora == 1)
{
AddItem(nota);
AddItem(contador*130);
contador = 0;
nota = 0;
}
}
}
else
{
if (digitalRead(6) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, DO2s);
nota = DO2s;
}
else
{
tone(buzzer, DO2);
nota = DO2s;
}
}
else if (digitalRead(7) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, RE2s);
nota = RE2s;
}
else
{
tone(buzzer, RE2);
nota = RE2;
}
}
else if (digitalRead(8) == LOW)
{
tone(buzzer, MI2);
nota = MI2;
}
else if (digitalRead(9) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, FA2s);
nota = FA2s;
}
else
{
tone(buzzer, FA2);
nota = FA2;
}
}
else if (digitalRead(10) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, SOL2s);
nota = SOL2s;
}
else
{
tone(buzzer, SOL2);
nota = SOL2;
}
}
else if (digitalRead(11) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, LA2s);
nota = LA2s;
}
else
{
tone(buzzer, LA2);
nota = LA2;
}
}
else if (digitalRead(12) == LOW)
{
if (analogRead(analog0) > 500)
{
tone(buzzer, DO3);
nota = DO3;
}
else
{
tone(buzzer, SI2);
nota = SI2;
}
}
else
{
noTone(buzzer);
if (grabadora == 1)
{
AddItem(nota);
AddItem(contador*130);
contador = 0;
nota = 0;
}
}
}
contador++;
}