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




0 Comentarios