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:

ComponenteCantidadPrecio
Pulsador2010.40 €
Buzzer32.20 €
Cables33.60 €
costes de los componentes

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++;
  
}

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *