Advertisement
Villalba2006

POST_73

Nov 23rd, 2016
12,552
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 15.12 KB | None | 0 0
  1. /*  TITULO: Batería MIDI con Pro Tools 10 y EZ Drummer.
  2.            
  3.     AUTOR:
  4.    
  5.     MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
  6.     - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
  7.     - TWITTER: https://twitter.com/MarianoCampoGa
  8.     - CORREO: marianodc83@gmail.com
  9.    
  10.    
  11.     DESCRIPCIÓN DEL PROGRAMA
  12.    
  13.     Con este programa enviamos mensajes MIDI con una velocidad de 57600 BAUDIOS desde ARDUINO al PC,
  14.     a través del puerto serie USB, cada vez que golpeemos uno de los PADS o cada vez que presionemos
  15.     el pedal del Bombo, para que sean leídos por Pro Tools a través de una entrada MIDI, gracias al
  16.     conversor serie a MIDI y el puerto virtual MIDI (LoopBe) que tenemos que instalar para que se
  17.     reproduzcan los sonidos de batería del "Plugin" EZ Drummer (Caja, TOMS, platillos y bombo).
  18.     Este mensaje MIDI que enviamos, consta de tres partes claramente diferenciadas:
  19.     - STATUS: Compuesto por el estado de la NOTA MIDI(ON/OFF) y el canal MIDI por el que transmitimos.
  20.     - TONO: Es el TONO de la NOTA MIDI que transmitimos (de 0 a 127).
  21.     - VELOCIDAD: Es la velocidad con la que se reproduce la NOTA MIDI que transmitimos (de 0 a 127).
  22.     Podremos personalizar dentro del programa el canal MIDI por el que se realiza la transmisión del
  23.     mensaje MIDI, los tonos de las NOTAS MIDI reproducidas al golpear los PADS o al pisar el pedal
  24.     del Bombo, la sensibilidad para la activación de los PADS, el tiempo de espera (respuesta) entre
  25.     el golpeo de los PADS o cuando pisamos dos veces el pedal del Bomboo y por último la velocidad del
  26.     pedal del Bombo. Para una mayor información sobre el programa os recomiendo revisar los comentarios
  27.     realizados a lo largo del mismo.    
  28.    
  29.    
  30.     ESQUEMA DE CONEXION
  31.    
  32.                                            +-----+
  33.               +----[PWR]-------------------| USB |--+
  34.               |                            +-----+  |
  35.               |         GND/RST2  [ ][ ]            |
  36.               |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |    
  37.               |          5V/MISO2 [ ][ ]  A4/SDA[ ] |    
  38.               |                             AREF[ ] |
  39.               |                              GND[ ] |
  40.               | [ ]N/C                    SCK/13[ ] |  
  41.               | [ ]IOREF                 MISO/12[ ] |  LED_Charles(+)
  42.               | [ ]RST                   MOSI/11[ ]~|  LED_Bombo(+)
  43.               | [ ]3V3    +---+               10[ ]~|  PA (pulsador_bombo)
  44.               | [ ]5v    -| A |-               9[ ]~|  PA (pedal)
  45.               | [ ]GND   -| R |-               8[ ] |  PA (Charles)
  46.               | [ ]GND   -| D |-                    |
  47.               | [ ]Vin   -| U |-               7[ ] |  LEDS 1(+)
  48.               |          -| I |-               6[ ]~|  LEDS 2(+)
  49.   PIEZO 1(+)  | [ ]A0    -| N |-               5[ ]~|  LEDS 3(+)
  50.   PIEZO 2(+)  | [ ]A1    -| O |-               4[ ] |  LEDS 4(+)
  51.   PIEZO 3(+)  | [ ]A2     +---+           INT1/3[ ]~|  LEDS 5(+)
  52.   PIEZO 4(+)  | [ ]A3                     INT0/2[ ] |  LEDS 6(+)  
  53.   PIEZO 5(+)  | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |  
  54.   PIEZO 6(+)  | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |  
  55.               |            [ ] [ ] [ ]              |
  56.               |  UNO_R3    GND MOSI 5V  ____________/
  57.                \_______________________/
  58.  
  59.   NOTAS:
  60.    - El terminal(-) de todos los PIEZOS a GND.
  61.    - Resistencia de 1M ohm entre los terminales (+) y (-) de cada PIEZO.
  62.    - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos)
  63.    - Conexión PULL-DOWN de los pulsadores
  64.        - Pulsador_bombo:
  65.          - PB (Pulsador_bombo) conectado a VCC.
  66.          - PA (Pulsador_bombo) conectado a GND a través de una R=10K ohms.
  67.        - Pedal Charles:
  68.          - PB (Charles) conectado a VCC.
  69.          - PA (Charles) conectado a GND a través de una R=10K ohms.
  70.        - Pedal Bombo:
  71.          - PB (pedal) conectado a VCC.
  72.          - PA (pedal) conectado a GND a través de una R=10K ohms.  
  73.    - Cátodo(-) de todos los LEDS (pata más corta) a GND a través de una R=220 ohms, una para cada grupo de LEDS.            
  74.  
  75.  
  76.   SOTWARE REQUERIDO:
  77.  
  78.    -> Puerto MIDI Virtual - loopBE: https://mega.nz/#!as40kIaY!P8gPtd1ZidftKjnIS316M2wncZRe5mfwBOW-rOV2P_U
  79.    -> Conversor - Serial_MIDI_Converter_V2D: https://mega.nz/#!PooVGZza!SuRLVJEfNJ_54oIMQEQMceEfMc7jGLNBG2xsY7bh9FU
  80.    -> Pro Tools 10: https://mega.nz/#!m4JzFBBQ!T4DZ49dqpnBxL2B0-fpl1ncu8X605eoyqTlaq-gv5M0
  81.    -> EZ Drummer: https://mega.nz/#!u8BDWYwZ!39pimPFn63hweH6XwEcvPgceVAAd9nlVJ1ZsvvUM07E
  82. */
  83.  
  84.   // Canal MIDI del 0 a 15, +1 en el "mundo real" (Utilizo el 8 porque le configuro en Pro Tools 10).
  85.   #define  canal    7;
  86.  
  87.   // Notas MIDI de 0 a 127 (Mid C = 60) --> {Charles abierto, Caja, TOM 1, TOM 2, TOM de piso, platillos}.
  88.   unsigned char Nota[6] = {46,33,50,47,43,58};
  89.  
  90.   int Nota_pedal = 36; // Nota MIDI para el Bombo.
  91.  
  92.   int Sensibilidad_golpeo[6] = {400,400,400,400,400,400};   // Valor máximo 1023. A mayor valor menor sensibilidad.
  93.  
  94.   // Tiempo de espera entre golpes en milisegundos (respuesta). A mayor valor menor respuesta de la batería electrónica.
  95.   int Respuesta[6] = {90,90,90,90,90,90};
  96.  
  97.   // Variables para el control del pedal del Bombo.
  98.   int Velocidad_pedal = 120; // Velocidad del pedal entre 0 y 127 (elige la que más te guste).
  99.   int Tiempo_maximo = 70; // Tiempo de espera del pedal para poder pisarle por segunda vez (Respuesta del pedal)
  100.  
  101.   boolean Bandera_velocidad  = true; // Variable interna para el control de la velocidad.
  102.  
  103.   // Variables para el control de los PADS
  104.   boolean Pad_Activo[6] = {0,0,0,0,0,0}; // Matriz que almacena el estado inicial de los PADS (OFF).
  105.   int Comienzo_sonido[6] = {0,0,0,0,0,0}; // Matriz para contar el tiempo que dura la NOTA al golpear cada PAD.
  106.  
  107.   // Variables internas para el pedal del Bombo
  108.   int tiempo_pedal = 0;   // Cuenta el tiempo desde que pisamos el pedal (inicialmente cero).
  109.   boolean bombo_activo = false; // Estado inicial del pedal del Bombo.
  110.  
  111.   unsigned char status; // Variable para almacenar el ESTADO del mensaje MIDI (Estado NOTA MIDI <ON/OFF> + CANAL).
  112.  
  113.   int Nota_ON = 144; // Variable con valor 144 que activa la NOTA MIDI.
  114.   int Nota_OFF = 128; // Variable con valor 128 que desactiva la NOTA MIDI.
  115.  
  116.   int pedal = 9; // Pin digital para el interruptor del pedal del bombo
  117.   int valor_pedal; // Variable para almacenar el estado del pedal
  118.   int pin = 0; // Variable auxiliar para recorrer las matrices (Arrays)  
  119.   int velocidad = 0; // Variable interna para el control de la velocidad de las NOTAS
  120.   int LED_bateria[6] = {7, 6, 5, 4, 3, 2}; // Pines digitales para los LEDs de los PADS
  121.   int LED_Bombo = 11; // Pin digital para el LED del estado del Bombo
  122.   int LED_Charles = 12; // Pin digital para el LED del estado del Charles
  123.  
  124.   // Variables para la función del BOMBO y DOBLE BOMBO
  125.   const int pulsador_bombo = 10; // Pin digital para el pulsador del MODO del Bombo
  126.   const int tiempoAntirrebote = 10; // Tiempo en ms para evitar el rebote del pulsador del Bombo
  127.  
  128.   // Variables para el control del pulsador del Bombo
  129.   int cuenta = 0;
  130.   int estadoBoton;
  131.   int estadoBotonAnterior;
  132.  
  133.   // Variables para la función del CHARLES
  134.   int charles = 8; // Pin digital para el pedal del charles
  135.   int estado_charles; // Variable que almacena el estado del pedal del Charles
  136.  
  137.  
  138.   void setup()
  139.   {
  140.     Serial.begin(57600); // Comienza la comunicación serie a 57600 BAUDIOS
  141.    
  142.     pinMode(LED_Charles, OUTPUT); // Pin digital 12 como SALIDA
  143.     pinMode(LED_Bombo, OUTPUT); // Pin digital 11 como SALIDA
  144.     pinMode(pulsador_bombo, INPUT); // Pin digital 10 como ENTRADA
  145.     pinMode(pedal, INPUT); // Pin digital 9 como ENTRADA
  146.     pinMode(charles, INPUT); // Pin digital 8 como ENTRADA
  147.    
  148.     // Pines digitales del 7 al 2 como SALIDAS
  149.     for(int i=0; i<6; i++)
  150.     {
  151.       pinMode(LED_bateria[i], OUTPUT);
  152.     }  
  153.   }
  154.  
  155.  
  156.   void loop()
  157.   {
  158.     // Función que cambia la NOTA MIDI del charles en función del ESTADO del pedal charles
  159.     NOTA_Charles();
  160.    
  161.     // Función para controlar los PADS
  162.     CONTROL_PADS();
  163.    
  164.     // Función para controlar el BOMBO
  165.     CONTROL_Bombo();
  166.   }
  167.  
  168.  
  169.   // Función que transmite el mensaje MIDI
  170.   void MIDI_TX(unsigned char MENSAJE, unsigned char TONO, unsigned char VELOCIDAD)
  171.   {
  172.     status = MENSAJE + canal; // Estado de la NOTA MIDI (ON/OFF) + canal MIDI de transmisión
  173.     // Enviamos los valores por el puerto serie USB de ARDUINO
  174.     Serial.write(status); // Estado del mensaje
  175.     Serial.write(TONO); // Tono de la NOTA MIDI
  176.     Serial.write(VELOCIDAD); // Velocidad de la NOTA MIDI
  177.   }
  178.  
  179.   // Función que cambia la NOTA MIDI del charles en función del ESTADO del pedal charles
  180.   void NOTA_Charles()
  181.   {
  182.     // Obtenemos el valor del pedal del Charles
  183.     estado_charles = digitalRead(charles);
  184.    
  185.     // Si no hemos pisado el pedal del Charles
  186.     if(estado_charles == LOW)
  187.     {
  188.       Nota[0] = 46; // Nota MIDI para Charles abierto
  189.       digitalWrite(LED_Charles, LOW); // LED del Charles apagado
  190.     }
  191.    
  192.     // Si hemos pisado el pedal del Charles
  193.     if(estado_charles == HIGH)
  194.     {
  195.       Nota[0] = 42; // Nota MIDI para Charles cerrado
  196.       digitalWrite(LED_Charles, HIGH); // LED del Charles encendido
  197.     }
  198.   }
  199.    
  200.   // Función para controlar los PADS
  201.   void CONTROL_PADS()
  202.   {
  203.     // Recorremos las 6 entradas analógicas (A0, A1,....A5)
  204.     for(int pin=0; pin < 6; pin++)
  205.     {
  206.       // Guardamos el valor analógico de la entrada
  207.       velocidad = analogRead(pin);                            
  208.       // Si el golpe está dentro del tiempo de respuesta ..
  209.       if((velocidad > Sensibilidad_golpeo[pin]))
  210.       {
  211.         // Si el PAD no estaba activado
  212.         if((Pad_Activo[pin] == false))
  213.         {
  214.           // Calculamos la velocidad de golpeo
  215.           if(Bandera_velocidad == true)
  216.           {
  217.             velocidad = (velocidad / 8) -1 ;
  218.           }
  219.           else
  220.           {
  221.             velocidad = 127;
  222.           }
  223.           // Enviamos el mensaje MIDI para encender la NOTA
  224.           MIDI_TX(Nota_ON,Nota[pin],velocidad);
  225.           Comienzo_sonido[pin] = 0;
  226.           Pad_Activo[pin] = true;
  227.           digitalWrite(LED_bateria[pin], HIGH); // Activamos los LEDS del PAD
  228.         }
  229.         // Si no hemos golpeado el PAD correspondiente
  230.         else
  231.         {
  232.           // Incremento el tiempo entre golpes en una unidad
  233.           Comienzo_sonido[pin] = Comienzo_sonido[pin] + 1;  
  234.         }
  235.       }
  236.       // Si el PAD estaba ya activado
  237.       else if((Pad_Activo[pin] == true))
  238.       {
  239.         // Incremento el tiempo entre golpes en una unidad
  240.         Comienzo_sonido[pin] = Comienzo_sonido[pin] + 1;
  241.        
  242.         // Si se ha superado el tiempo de respuesta
  243.         if(Comienzo_sonido[pin] > Respuesta[pin])
  244.         {
  245.           // Enviamos el mensaje MIDI para apagar la NOTA
  246.           MIDI_TX(Nota_OFF,Nota[pin],127);
  247.           Pad_Activo[pin] = false;
  248.           digitalWrite(LED_bateria[pin], LOW); // Desactivamos los LEDS del PAD
  249.         }
  250.       }
  251.     }
  252.   }
  253.  
  254.   // Función para controlar el BOMBO
  255.   void CONTROL_Bombo()
  256.   {
  257.     // Se adquiere el estado del pulsador del bombo
  258.     estadoBoton = digitalRead(pulsador_bombo);
  259.    
  260.     // Se cuentan las veces que lo hemos pulsado  
  261.     if(estadoBoton != estadoBotonAnterior)
  262.     {
  263.       if(antirrebote(pulsador_bombo))
  264.       {
  265.         cuenta++;
  266.       }
  267.     }  
  268.     estadoBotonAnterior = estadoBoton;
  269.    
  270.     // Se reinicia la cuenta cuando llega a 2
  271.     if(cuenta==2)
  272.     {
  273.       cuenta = 0;
  274.     }
  275.    
  276.     // Se adquiere el estado del pedal del bombo
  277.     valor_pedal = digitalRead(pedal);
  278.    
  279.     // Se evalúa el valor de la cuenta del pulsador del bombo
  280.     switch(cuenta)
  281.     {
  282.       // Bombo normal: LED apagado
  283.       case 0:
  284.         digitalWrite(LED_Bombo, LOW);  
  285.         pedal_Bombo();  // Función para "Bombo simple"      
  286.         break;
  287.        
  288.       // Doble bombo: LED encendido
  289.       case 1:
  290.         digitalWrite(LED_Bombo, HIGH);
  291.         pedal_doble_Bombo(); // Función para "doble Bombo"
  292.         break;  
  293.     }  
  294.   }
  295.  
  296.   // Función para "Bombo simple"
  297.   void pedal_Bombo()
  298.   {
  299.     // Si hemos pisado el pedal del bombo  
  300.     if(valor_pedal == HIGH)
  301.     {
  302.       // Si el bombo estaba desactivado
  303.       if((bombo_activo == false))
  304.       {
  305.         // Enviamos el mensaje MIDI para encender la NOTA
  306.         MIDI_TX(Nota_ON,Nota_pedal,Velocidad_pedal);
  307.         tiempo_pedal = 0;
  308.         bombo_activo = true;
  309.       }
  310.       // Si el bombo estaba ya activado
  311.       else
  312.       {
  313.         // Incremento el tiempo entre pisadas del pedal en una unidad
  314.         tiempo_pedal = tiempo_pedal + 1;
  315.       }
  316.     }
  317.    
  318.     // Si no hemos pisado el pedal del bombo
  319.     else if((bombo_activo == true))
  320.     {
  321.       // Incremento el tiempo entre pisadas del pedal en una unidad
  322.       tiempo_pedal = tiempo_pedal + 1;
  323.      
  324.       // Si se ha superado el tiempo de respuesta
  325.       if(tiempo_pedal > Tiempo_maximo)
  326.       {
  327.         // Enviamos el mensaje MIDI para apagar la NOTA
  328.         MIDI_TX(Nota_OFF,Nota_pedal,Velocidad_pedal);
  329.         bombo_activo = false;
  330.       }
  331.     }
  332.   }
  333.  
  334.   // Función para "doble Bombo"
  335.   void pedal_doble_Bombo()
  336.   {
  337.     // Si hemos pisado el pedal del bombo
  338.     if(valor_pedal == HIGH)
  339.     {
  340.       // Si el bombo estaba desactivado
  341.       if((bombo_activo == false))
  342.       {
  343.         // Enviamos el mensaje MIDI para encender la NOTA
  344.         MIDI_TX(Nota_ON,Nota_pedal,Velocidad_pedal);
  345.         delay(45); // Tiempo de espera
  346.         // Enviamos el mensaje MIDI para apagar la NOTA
  347.         MIDI_TX(Nota_OFF,Nota_pedal,Velocidad_pedal);
  348.         delay(45); // Tiempo de espera
  349.         // Enviamos el mensaje MIDI para encender la NOTA
  350.         MIDI_TX(Nota_ON,Nota_pedal,Velocidad_pedal);
  351.         tiempo_pedal = 0;
  352.         bombo_activo = true;
  353.       }
  354.       // Si el bombo estaba activado
  355.       else
  356.       {
  357.         // Incremento el tiempo entre pisadas del pedal en una unidad
  358.         tiempo_pedal = tiempo_pedal + 1;
  359.       }
  360.     }
  361.     // Si no hemos pisado el pedal del bombo
  362.     else if((bombo_activo == true))
  363.     {
  364.       // Incremento el tiempo entre pisadas del pedal en una unidad
  365.       tiempo_pedal = tiempo_pedal + 1;
  366.      
  367.       // Si se ha superado el tiempo de respuesta
  368.       if(tiempo_pedal > Tiempo_maximo)
  369.       {
  370.         // Enviamos el mensaje MIDI para apagar la NOTA
  371.         MIDI_TX(Nota_OFF,Nota_pedal,Velocidad_pedal);
  372.         bombo_activo = false;
  373.       }
  374.     }
  375.   }    
  376.  
  377.   // Función que evita el rebote del pulsador del bombo
  378.   boolean antirrebote(int pin)
  379.   {
  380.     int contador = 0;
  381.     boolean estado;
  382.     boolean estadoAnterior;
  383.    
  384.     do
  385.     {
  386.       estado = digitalRead(pin);
  387.       if(estado != estadoAnterior)
  388.       {
  389.         contador = 0;
  390.         estadoAnterior = estado;
  391.       }
  392.       else
  393.       {
  394.         contador = contador+ 1;
  395.       }
  396.       delay(1);
  397.     } while(contador < tiempoAntirrebote);
  398.    
  399.     return estado; // Devuelve el valor del ESTADO del pulsador
  400.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement