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