Cómo hacer un controlador THEREMIN MIDI USB con ARDUINO LEONARDO



Hola amigos les traigo este controlador fácil de armar que puede servir como complemento para variar cualquier parámetro en tus programas de música solo con mover tu mano. Puedes aplicarlo para producción o live performance. Una herram,ienta para hacer sonidos con instrumentos virtuales de manera mas divertida.



Usamos Arduino Leonardo para usar la comunicación USB HID en este caso MIDI que nos permite la compatibilidad de nuestro proyecto con las aplicaciones de música mas usadas como fl studio, reaper, ableton, mixxx, etc... Solo necesitamos agregarle un  sensor ultrasonico HC-SR04 y 4 cables.

Ustedes pueden usar cualquier chasis, yo hice una estructura con piezas en pvc cortadas con láser si les interesa déjenme sus comentarios.

Aquí les dejo el código:

/*
Mini controlador de expresion theremin MIDI USB con Arduino Leonardo

Este proyecto es abierto, hagan lo que quieran con el :D
Autor: Sergio A. Yañez M.
Año: 2020
Tutorial para el canal AQUILES VAESA 
youtube.com/aqulesvaesa

Inspirado en los ejemplos de la libreria MIDIUSB
y el proyecto MIDI https://geekytheory.com/arduinomidi-tu-propio-piano
Usamos el filtro de mediana movil, para eliminar el ruido electrico en los potenciomteros.
INDISPENSABLE INSTALAR LAS LIBRERIAS

MIDIUSB:
https://github.com/arduino-libraries/MIDIUSB
MedianFilterLib:
https://github.com/luisllamasbinaburo/Arduino-MedianFilter

 */ 

#include "MIDIUSB.h" //libreria comunicacion USB HID MIDI
#include "MedianFilterLib.h" //lib. filtro de mediana movil

int echo = 2;     // Pin para echo                          
int trigger = 3; // Pin para trigger   
int control = 0;
int tiempoRespuesta;
int distancia=0;
int distanciaAnterior=0;
MedianFilter<int> medianFilter(20); // Inicia el filtro de mediana con una ventana de 20

void setup() {
  pinMode(echo, INPUT_PULLUP);
  pinMode(trigger, OUTPUT);
}


void loop() {
  //se toman 20 muestras de la lectura de la distancia
  for(int i=0;i<20;i++){
    medianFilter.AddValue(medir()); // Se agregan los valores analogicos al filtro de mediana movil
    delayMicroseconds(10);  
  }
  distancia = medianFilter.GetFiltered(); //se filtra con la mediana
  //discrimina para evitar errores
  if(distancia>=10 && distancia<=40 && distancia != distanciaAnterior){ 

    int control=map(distancia,10,40,0,127);  //escala el valor a un entero entre 0 y 127
    analogWrite(13,control); //genera un pwm en el led del pin 13 con un ancho de pulso proporcional a la distancia
    controlChange(0, 1, control); //usa la funcion de enviar cambios de control
    delay(10); //espera 10 ms
  }
  MidiUSB.flush(); //Refresca comunicacion USB HID MIDI
  distanciaAnterior=distancia; 
}
//funcion general para mandar cambios de control 

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}

//funcion para medir la distancia de la mano al sensor en cm
int medir(){
  int x;
  digitalWrite(trigger, HIGH);            // Enviamos pulso de 10 microsegundos
  delayMicroseconds(10);                        
  digitalWrite(trigger, LOW);                   
  tiempoRespuesta = pulseIn(echo, HIGH);  // Y esperamos pulso de vuelta
  x = tiempoRespuesta/58;         // Calculo de distancia en cm
  return x;
  }


Publicar un comentario

0 Comentarios