Sintetizador (T2)

Sintetizador Electrónico

     En realidad este proyecto es una simulación de un sintetizador. Funciona de la siguiente manera... Al presionar una de las teclas, un mini interruptor envía a una de las entradas de Arduino una señal, Arduino verifica el pin y de acuerdo a una programación envía orden de reproducción de un determinado sonido al reproductor Catalex MP3. Para esto previamente se grabaron en una tarjeta de memoria la secuencia de notas musicales, que fueron creadas en el programa "Formant Classic" creado por  Eef  Fonken y que es un réplica del legendario Elektor Formant DIY synthesizer of 1977/78. El resultado es muy bueno, el único problema es que hay que tocar melodías que sean lentas, para que Catalex pueda reproducir a tiempo las notas.

web Formant Classic: http://www.ftec-audio.com/formant-classic/

Cualquier duda, que de seguro son muchas, pueden escribirme a robot@tongas.cl

--- Demo Sintetizador ---




--- Fotografías de armado de los componentes ---


     El teclado fue cortado en MDF (Trupán) y los componentes fueron montados en una placa virgen para circuitos que se grabaron con una mini CNC.



     Lo primero que hicimos fue la placa para la circuitería. Usé el programa Inkscape para dibujar los diferentes caminos del circuito y con una mini CNC lo grabé en una placa virgen. Todo esto se puede hacer con el método tradicional de dibujar los caminos en la placa de cobre y con ácido corroerla para generar una tarjeta donde podamos soldar los diferentes componentes. 






Aquí vemos el circuito esquemático y sus componentes


1.- Un Arduino Nano
2.- Un grabador reproductor MP 3 Catalex
3.- Potenciómetro 5 K
4.- Resistencia de 56 Ω (12)
5.- Mini interruptores de presión (12)
6.- Diodos  1N4007 o cualquiera que tengas a mano

--- Explicación conexiones ---

     Por supuesto que antes de soldar cualquier cosa, el proyecto fue armado en un Protoboard para poder probarlo. Los botones simulan las teclas y utilicé un Arduino Uno, que tenía a mano montado como banco de trabajo. El proyecto final lo hice con Arduino Nano.

     En estos dos gráficos vemos donde va montado el Arduino Nano, los 12 interruptores, las 12 resistencias. los 5 diodos y la placa Catalex MP3.


     Los cables que unen la dos placas están enumerados de 2 a 13 además de A0. También hay una unión en la primera placa en los dos caminos celestes, que me fue imposible evitar. 

Placas Impresas



Placa terminada para montar Arduino Nano.
Potenciómetro, resistencias, diodos e interruptores en su lugar.
     Estas placas están en un tamaño diferente al real, deben escalarlas al tamaño verdadero y hay que fijarse que están al derecho, por lo tanto hay que invertirlas con la función espejo para trasladarlas a la placa.



El Teclado

     Lo corté en trupán con mi CNC, pero está claro que también se puede hacer con sierra marquetera, aunque es más lento y no tan preciso. Los pernitos para afirmarlas son de 3 milímetros, pero también podrían ser de 1/8 que son más fáciles de conseguir.
     Las teclas se pueden pintar, yo aquí las dejé naturales para apreciar mejor el trabajo de carpintería.

--- Explicación Software Arduino ---

#include <SoftwareSerial.h>       //........ librería Serial
#define ARDUINO_RX 5          //..... conectar pin (5)RX a pin TX en Serial MP3 Player module
#define ARDUINO_TX 6          //..... conectar pin (6)TX a pin RX en Serial MP3 Player module
SoftwareSerial mp3(ARDUINO_RX, ARDUINO_TX);   //... decir al serial cual es pin TX y RX

//................ Declaramos Variables
int pin2;
int pin3;
int pin4;
int pin7;
int pin8;
int pin9;
int pin10;
int pin11;
int pin12;
int pin13;
int boton;
int selector;

//................ Órdenes de inicio de MP3 Player
static int8_t Send_buf[8] = {0} ;  // MP3 player undestands orders in a 8 int string
#define CMD_PLAY_WITHVOLUME 0X22   //data is needed  0x7E 06 22 00 xx yy EF;(xx                                                                                      //volume)(yy number of song)
#define CMD_SEL_DEV 0X09 //SELECT STORAGE DEVICE, DATA IS REQUIRED
#define DEV_TF 0X02 //HELLO,IM THE DATA REQUIRED
#define CMD_PLAY_WITHFOLDER 0X0F//DATA IS NEEDED, 0x7E 06 0F 00 01 02 EF;(play                                                                          //the song with the directory \01\002xxxxxx.mp3)
#define SET_CYCLEPLAY 0X19//data is needed 00 start; 01 close
#define SET_DAC 0X17//data is needed 00 start DAC OUTPUT;01 DAC no output

void setup()
{
  Serial.begin(9600);//...........Inicio puerto serial para monitorear estado de los pines digitales
  mp3.begin(9600);//.............Inicio puerta serial para tarjeta Catalex reproductor MP3
  delay(500);//................. Espera inicialización de chip se complete
  sendCommand(CMD_SEL_DEV, DEV_TF);//Selecciona la Tarjeta de memoria del MP3
  delay(250);//................... Espera de 250 ms
  pinMode(2, INPUT); //................ pines 2 a 13 en modo INPUT
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(7, INPUT);
  pinMode(8, INPUT);
  pinMode(9, INPUT);
  pinMode(10, INPUT);
  pinMode(11, INPUT);
  pinMode(12, INPUT);
  pinMode(13, INPUT);
}
void loop()
{
  //............................ asignamos botones a puertos digitales
  pin2 = digitalRead(2);
  pin3 = digitalRead(3);
  pin4 = digitalRead(4);
  pin7 = digitalRead(7);
  pin8 = digitalRead(8);
  pin9 = digitalRead(9);
  pin10 = digitalRead(10);
  pin11 = digitalRead(11);
  pin12 = digitalRead(12);
  pin13 = digitalRead(13);

  selector = analogRead(A0); //.... En variable selector valor de A0 (potenciómetro)
  selector = map(selector, 0, 1023, 0, 4);// Operación para transformar valores entre 0 y 4

  //............... Rutina 0
  if (selector == 0) {//------------ registro 1 - NOTAS INSTRUMENTOS MUSICALES ---
 //----------------------------------------------------- DO 
 if (pin2 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E01);
      // nos lleva a la función serial que envía al reproductor los parámetros elegidos
      while (pin2 == HIGH) {
        pin2 = digitalRead(2);
      }
    }
    //----------------------------------------------------- DO#
    if (pin3 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E02); // reproduce sonido grabado 2
      while (pin3 == HIGH) {
        pin3 = digitalRead(3);
      }
    }
    //----------------------------------------------------- RE
    if (pin4 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E03); // reproduce sonido grabado 3
      while (pin4 == HIGH) {
        pin4 = digitalRead(4);
      }
    }
    //----------------------------------------------------- RE#
    if (pin7 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E04); // reproduce sonido grabado 4
      while (pin7 == HIGH) {
        pin7 = digitalRead(7);
      }
    }
    //----------------------------------------------------- MI
    if (pin8 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E05); // reproduce sonido grabado 5
      while (pin8 == HIGH) {
        pin8 = digitalRead(8);
      }
    }
    //----------------------------------------------------- FA
    if (pin9 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E06); // reproduce sonido grabado 6
      while (pin9 == HIGH) {
        pin9 = digitalRead(9);
      }
    }
    //----------------------------------------------------- FA#
    if (pin10 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E07); // reproduce sonido grabado 7
      while (pin10 == HIGH) {
        pin10 = digitalRead(10);
      }
    }
    //----------------------------------------------------- SOL
    if (pin11 == HIGH  && pin12 == LOW) { // reproduce sonido grabado 8
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E08);
      while (pin11 == HIGH) {
        pin11 = digitalRead(11);
      }
    }
    //----------------------------------------------------- SOL#
    if ( pin12 == HIGH && pin11 == LOW && pin13 == LOW) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E09); // reproduce sonido grabado 9
      while (pin12 == HIGH) {
        pin12 = digitalRead(12);
      }
    }
    //----------------------------------------------------- LA
    if (pin13 == HIGH && pin11 == LOW && pin12 == LOW ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E0A); // reproduce sonido grabado 10
      while (pin13 == HIGH) {
        pin13 = digitalRead(13);
      }
    }
    //----------------------------------------------------- LA#
    if (pin11 == HIGH && pin12 == HIGH && pin13 == LOW) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E0B); // reproduce sonido grabado 11
      while (pin11 == HIGH) {
        pin11 = digitalRead(11);
      }
    }
    //----------------------------------------------------- SI
    if (  pin13 == HIGH) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E0C); // reproduce sonido grabado 12
      while (pin12 == HIGH) {
        pin12 = digitalRead(12);
      }
    }
  }

  //............... Rutina 1
  if (selector == 1) {//------------ registro 2 - NOTAS INSTRUMENTOS MUSICALES ---
    //----------------------------------------------------- DO
    if (pin2 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E0D);
      while (pin2 == HIGH) {
        pin2 = digitalRead(2);
      }
    }
    //----------------------------------------------------- DO#
    if (pin3 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E0E);
      while (pin3 == HIGH) {
        pin3 = digitalRead(3);
      }
    }
    //----------------------------------------------------- RE
    if (pin4 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E0F);
      while (pin4 == HIGH) {
        pin4 = digitalRead(4);
      }
    }
    //----------------------------------------------------- RE#
    if (pin7 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E10);
      while (pin7 == HIGH) {
        pin7 = digitalRead(7);
      }
    }
    //----------------------------------------------------- MI
    if (pin8 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E11);
      while (pin8 == HIGH) {
        pin8 = digitalRead(8);
      }
    }
    //----------------------------------------------------- FA
    if (pin9 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E12);
      while (pin9 == HIGH) {
        pin9 = digitalRead(9);
      }
    }
    //----------------------------------------------------- FA#
    if (pin10 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E13);
      while (pin10 == HIGH) {
        pin10 = digitalRead(10);
      }
    }
    //----------------------------------------------------- SOL
    if (pin11 == HIGH && pin12 == LOW ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E14);
      while (pin11 == HIGH) {
        pin11 = digitalRead(11);
      }
    }
    //----------------------------------------------------- SOL#
    if (pin12 == HIGH && pin11 == LOW && pin13 == LOW) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E15);
      while (pin12 == HIGH) {
        pin12 = digitalRead(12);
      }
    }
    //----------------------------------------------------- LA
    if ( pin13 == HIGH && pin11 == LOW && pin12 == LOW ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E16);
      while (pin13 == HIGH) {
        pin13 = digitalRead(13);
      }
    }
    //----------------------------------------------------- LA#
    if (pin11 == HIGH && pin12 == HIGH && pin13 == LOW) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E17);
      while (pin11 == HIGH) {
        pin11 = digitalRead(11);
      }
    }
    //----------------------------------------------------- SI
    if ( pin13 == HIGH) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E18);
      while (pin12 == HIGH) {
        pin12 = digitalRead(12);
      }
    }
  }

  //............... Rutina 2
  if (selector == 2) {//------------ registro 3 - NOTAS INSTRUMENTOS MUSICALES ---
    //----------------------------------------------------- DO
    if (pin2 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E19);
      while (pin2 == HIGH) {
        pin2 = digitalRead(2);
      }
    }
    //----------------------------------------------------- DO#
    if (pin3 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E1A);
      while (pin3 == HIGH) {
        pin3 = digitalRead(3);
      }
    }
    //----------------------------------------------------- RE
    if (pin4 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E1B);
      while (pin4 == HIGH) {
        pin4 = digitalRead(4);
      }
    }
    //----------------------------------------------------- RE#
    if (pin7 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E1C);
      while (pin7 == HIGH) {
        pin7 = digitalRead(7);
      }
    }
    //----------------------------------------------------- MI
    if (pin8 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E1D);
      while (pin8 == HIGH) {
        pin8 = digitalRead(8);
      }
    }
    //----------------------------------------------------- FA
    if (pin9 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E1E);
      while (pin9 == HIGH) {
        pin9 = digitalRead(9);
      }
    }
    //----------------------------------------------------- FA#
    if (pin10 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E1F);
      while (pin10 == HIGH) {
        pin10 = digitalRead(10);
      }
    }
    //----------------------------------------------------- SOL
    if (pin11 == HIGH && pin12 == LOW ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E20);
      while (pin11 == HIGH) {
        pin11 = digitalRead(11);
      }
    }
    //----------------------------------------------------- SOL# 
    if ( pin12 == HIGH && pin11 == LOW && pin13 == LOW) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E21);
      while (pin12 == HIGH) {
        pin12 = digitalRead(12);
      }
    }
    //----------------------------------------------------- LA
    if ( pin13 == HIGH && pin11 == LOW && pin12 == LOW) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E22);
      while (pin13 == HIGH) {
        pin13 = digitalRead(13);
      }
    }
    //----------------------------------------------------- LA#
    if (pin11 == HIGH && pin12 == HIGH && pin13 == LOW) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E23);
      while (pin11 == HIGH) {
        pin11 = digitalRead(11);
      }
    }
    //----------------------------------------------------- SI
    if ( pin13 == HIGH) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E24);
      while (pin12 == HIGH) {
        pin12 = digitalRead(12);
      }
    }
  }

  //............... Rutina 3
  if (selector == 3) {//------------ registro 4 - VOCES -----
    //----------------------------------------------------- TONGAS SALUDANDO
    if (pin2 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E25);
      while (pin2 == HIGH) {
        pin2 = digitalRead(2);
      }
    }
    //----------------------------------------------------- TONGAS DIBUJOS ANIMADOS
    if (pin3 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E26);
      while (pin3 == HIGH) {
        pin3 = digitalRead(3);
      }
    }
    //----------------------------------------------------- LA MANO PELUDA
    if (pin4 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E27);
      while (pin4 == HIGH) {
        pin4 = digitalRead(4);
      }
    }
    //----------------------------------------------------- TITULOS PIPIRIPAO
    if (pin7 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E28);
      while (pin7 == HIGH) {
        pin7 = digitalRead(7);
      }
    }
    //----------------------------------------------------- DISKETERA ATARI
    if (pin8 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E29);
      while (pin8 == HIGH) {
        pin8 = digitalRead(8);
      }
    }
    //----------------------------------------------------- APLAUSOS
    if (pin9 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E2A);
      while (pin9 == HIGH) {
        pin9 = digitalRead(9);
      }
    }
    //----------------------------------------------------- BALAZO
    if (pin10 == HIGH ) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E2B);
      while (pin10 == HIGH) {
        pin10 = digitalRead(10);
      }
    }
    //----------------------------------------------------- RISAS
    if (pin11 == HIGH && pin12 == LOW) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E2C);
      while (pin11 == HIGH) {
        pin11 = digitalRead(11);
      }
    }
    //----------------------------------------------------- TROMPETA
    if (pin12 == HIGH && pin11 == LOW &&  pin13 == LOW) {
      sendCommand(CMD_PLAY_WITHVOLUME, 0X1E2D);
      while (pin12 == HIGH) {
        pin12 = digitalRead(12);
      }
    }
  }
}

//........... envío de instrucciones MP3 Player para reproducir sonido
void sendCommand(int8_t command, int16_t dat)
{
  Serial.println("     Estado de PushButton");
  Serial.print("     pin2="); Serial.print(pin2);
  Serial.print(" / pin3="); Serial.print(pin3);
  Serial.print(" / pin4="); Serial.print(pin4);
  Serial.print(" / pin5="); Serial.print(pin7);
  Serial.print(" / pin6="); Serial.print(pin8);
  Serial.print(" / pin7="); Serial.print(pin9);
  Serial.print(" / pin8="); Serial.print(pin10);
  Serial.print(" / pin9="); Serial.print(pin11);
  Serial.print(" / pin10="); Serial.print(pin12);
  Serial.print(" / pin11="); Serial.println(pin13);
  Serial.print("     Banco de Memoria - selector="); Serial.println(selector);
  Serial.print("     Enviando comando a Player MP3=");

  Send_buf[0] = 0x7e; //starting byte
  Send_buf[1] = 0xff; //version
  Send_buf[2] = 0x06; //the number of bytes of the command without starting byte and ending byte
  Send_buf[3] = command;
  Send_buf[4] = 0x00; //0x00 = no feedback, 0x01 = feedback
  Send_buf[5] = (int8_t)(dat >> 8); //datah
  Send_buf[6] = (int8_t)(dat); //datal
  Send_buf[7] = 0xef; //ending byte
  for (uint8_t i = 0; i < 8; i++) //
  {
    mp3.write(Send_buf[i]) ; //send bit to serial mp3
    Serial.print(Send_buf[i]);
  }
  Serial.println(" ");
  Serial.println("----------------------------------------------------------------------------------------------");
}

Cualquier duda o error, que de seguro son muchos, pueden escribirme a robot@tongas.cl