Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Unopad - Controlador MIDI Arduino con Ableton

Componentes y suministros

Arduino UNO
× 1
Actuador de interruptor, interruptores pulsadores iluminados serie APEM A01
× 9
Cables de puente (genéricos)
× 1

Herramientas y máquinas necesarias

Soldador (genérico)
Opcional

Aplicaciones y servicios en línea

loopMidi
Puente MIDISerial sin pelo
Prueba de Ableton Live 10

Acerca de este proyecto

Resumen

La mayoría de los tutoriales y proyectos para controladores Midi se basan solo en una explicación del trabajo de Arduino, pero no tanto en su uso en el DAW en sí. Quiero crear un tutorial con todas las cosas necesarias en un solo lugar. Con este proyecto, quería ayudar a los principiantes a comprender mejor el proceso de creación y uso de un controlador, y espero que sea útil para alguien.

Hace tiempo que quería hacer un controlador midi y finalmente lo hice y ahora compartiré el proyecto con ustedes. Usé un Arduino Uno que no tiene la capacidad de enviar mensajes MIDI a través de USB, por lo que se tuvieron que usar programas especiales para eso (se explicará más adelante en el texto).

Las siguientes secciones describirán el circuito eléctrico, el código Arduino, así como también cómo conectarse a una computadora y DAW, en este caso Ableton.

Circuito

Es un circuito muy simple. Usé 9 botones, pero no en matriz, porque quería tener la capacidad de presionar varios botones (es más fácil y tengo pines digitales sin usar; uso 9, en matriz serían 6).

  Botón 3 ==> Botón D2 2 ==> Botón D3 1 ==> Botón D4 6 ==> Botón D5 5 ==> Botón D6 4 ==> Botón D7 9 ==> Botón D8 8 ==> Botón D9 7 ==> D10  

Asignaciones MIDI

Definí 9 notas MIDI, de 36 a 45, y NOTE_ON y NOTE_OFF.

Este tutorial MIDI lo ayudará a comprender cómo puede usar el lenguaje MIDI para controlar cualquier dispositivo que use el protocolo MIDI.

  #define NOTE_ONE 36 # define NOTE_TWO 37 // Defina todas las notas aquí. # define NOTE_ON_CMD 0x90 # define NOTE_OFF_CMD 0x80 # define MAX_MIDI_VELOCITY 127  

MIDI a través de USB

Debido a que Arduino Uno no puede enviar notas MIDI a DAW por sí solo, debemos usar dos programas adicionales:LoopMidi y Hairless MIDI <-> Serial Bridge.

Con LoopMidi creamos un puerto MIDI virtual que podemos usar en Hairless Midi para conectar con el puerto Arduino.

Explicación del código

Creé la clase Button y la uso así:

  int NUMBER_BUTTONS =9; Botón Button1 (4, NOTE_ONE); Botón Button2 (3, NOTE_TWO); Botón Button3 (2, NOTE_THREE); Botón Button4 (7, NOTE_FOUR); Botón Button5 (6, NOTE_FIVE); Botón Button6 (5, NOTE_SIX); Botón Button7 (10, NOTE_SEVEN); Botón Button8 (9, NOTE_EIGHT); Botón Button9 (8, NOTE_NINE); Botón * Botones [] {&Button1, &Button2, &Button3, &Button4, &Button5, &Button6 , &Button7, &Button8, &Button9};  

Para obtener más información sobre la implementación de botones, consulte Buttons.cpp.

Debido a que no usamos resistencias, solo conectamos el botón al pin digital y a tierra, usamos INPUT_PULLUP en lugar de INPUT.

  //Buttons.cpppinMode(_pin, INPUT_PULLUP);  

La única parte complicada de esto es que no está buscando un HIGH señal como podría suponer:su botón emitirá LOW (0) cuando se presiona.

  // Se presiona el botón if (state ==0) {midiNoteOn (Buttons [i] -> Note, 127); } // El botón no se presiona si (estado ==1) {}  

Esto también significa que el estado inicial del botón es 1, no 0.

  //Buttons.cpp _state =1;  

Cada mensaje de NOTA ON requiere su correspondiente mensaje de NOTA OFF. Cuando se presiona el botón, envía el mensaje NOTE_ON. Cuando se suelta el botón, envía el mensaje NOTE_OFF, así que además del estado inicial, agregué el último estado recordado al código.

  //Buttons.cpp _lastState =1;  

Solo enviamos mensajes MIDI si el estado actual es diferente al último estado.

  //Buttons.cppif(state!=_lastState) {// ....}  

Utilice estas dos funciones para enviar mensajes MIDI. Los parámetros de las funciones son nota y midiVelocity (Usé la velocidad máxima).

  void midiNoteOn (byte note, byte midiVelocity) {Serial.write (NOTE_ON_CMD); Serial.write (nota); Serial.write (midiVelocity);} void midiNoteOff (byte nota, byte midiVelocity) {Serial.write (NOTE_OFF_CMD); Serial.write (nota); Serial.write (midiVelocity);}  

Puse la lógica del programa en la función updateButtons función.

  void updateButtons () {for (int i =0; i  getButtonState (); // Se presiona el botón if (estado ==0) {midiNoteOn (Botones [i] -> Note, 127); } // El botón no se presiona if (estado ==1) midiNoteOff (Botones [i] -> Note, 0); }}  

La función se llama dentro del método de bucle.

  void loop () {if (NUMBER_BUTTONS! =0) updateButtons ();}  

Utilice su controlador con DAW (Ableton Live)

Como principiante en el uso de DAW, no sabía cómo conectar nada allí. Cuando conecté mi Korg Nanokey, Ableton lo reconoció él mismo y pude usar el controlador de inmediato. Este (por supuesto) no fue el caso con el controlador Arduino, ya que no es un dispositivo HID y la PC aún lo reconoce como un Arduino.

Aquí te mostraré cómo conectar y usar tu controlador MIDI Arduino en Ableton Live 10.

  • Conéctese con Ableton

Abra loopMIDI y cree un nuevo puerto MIDI virtual como en las siguientes imágenes.

Abrir midiserial sin pelo y asigne puerto serie, salida MIDI y entrada MIDI como en las siguientes imágenes. Para el puerto serie, elegimos el puerto Arduino Uno, y para la entrada y salida MIDI usamos el puerto MIDI virtual que creamos en el paso anterior.

Establezca la velocidad en baudios a la misma velocidad en su boceto de Arduino. Vaya a Archivo> Preferencias , y allí debe establecer la velocidad en baudios.

Si todo está bien, puede depurar el mensaje MIDI enviado por el controlador. Presione el botón en el controlador y verifique los mensajes MIDI entrantes en Hairless MIDI.

¡No cierre el MIDI sin pelo!

Abra Ableton Live y vaya a la pestaña Opciones, luego Preferencias. La pestaña Link MIDI debería verse como en este ejemplo.

Para comprobar que todo está bien conectado y que Ableton está leyendo mensajes MIDI, buscaremos en la esquina superior derecha de Ableton. El cuadro superior debe parpadear cuando se presiona el botón del controlador, como se muestra en el siguiente ejemplo.

¡El controlador está listo para usar!

  • Usa el controlador como Drum Rack o Teclado

Seleccione la pista MIDI. En Monitor sección elija En , en lugar de Automático y en MIDI a elija la salida de su altavoz. Deberías escuchar tu teclado ahora. Se debe hacer lo mismo con Drum rack.

Mi proyecto terminado

Usé una caja de altavoz vieja para este proyecto y un poco de plástico que encontré en casa. Corté ambas placas de plástico a las dimensiones de la caja y taladré agujeros para los botones y un LED que agregaré más adelante.

También tengo otro altavoz antiguo con el mismo estuche que usaré para otro controlador MIDI, esta vez con perillas y joysticks.

Que hacer

- Botón de pulsación larga para cambiar al modo CC.

Código

  • MidiDrumPad.ino
  • Buttons.cpp
  • Buttons.h
MidiDrumPad.ino Arduino
 #include "Buttons.h" // ------ Notas ------------- # define NOTE_ONE 36 # define NOTE_TWO 37 # define NOTE_THREE 38 # define NOTE_FOUR 39 # define NOTE_FIVE 40 # define NOTE_SIX 41 # define NOTE_SEVEN 42 # define NOTE_EIGHT 43 # define NOTE_NINE 44 # define NOTE_ON_CMD 0x90 # define NOTE_OFF_CMD 0x80 # define MAX_MIDI_VELOCITY 127 // ------------------ ------ int NUMBER_BUTTONS =9; Botón Button1 (4, NOTE_ONE); Botón Button2 (3, NOTE_TWO); Botón Button3 (2, NOTE_THREE); Botón Button4 (7, NOTE_FOUR); Botón Button5 (6, NOTE_FIVE); Botón Button6 (5, NOTE_SIX); Botón Button7 (10, NOTE_SEVEN); Botón Button8 (9, NOTE_EIGHT); Botón Button9 (8, NOTE_NINE); Botón * Botones [] {&Button1, &Button2, &Button3, &Button4, &Button5, &Button6 , &Button7, &Button8, &Button9}; int red_light_pin =11; int green_light_pin =12; int blue_light_pin =13; void setup () {Serial.begin (9600);} void loop () {if (NUMBER_BUTTONS! =0) updateButtons ( );} void updateButtons () {for (int i =0; i  getButtonState (); // Se presiona el botón if (estado ==0) {midiNoteOn (Botones [i] -> Note, 127); } // El botón no se presiona if (estado ==1) {midiNoteOff (Botones [i] -> Note, 0); }}} void RGB_color (int valor_luz_roja, int valor_luz_verde, int valor_luz_azul) {analogWrite (pin_luz_roja, valor_luz_roja); analogWrite (pin_luz_verde, valor_luz_verde); analogWrite (blue_light_pin, blue_light_value);} // Enviar nota MIDI ONvoid midiNoteOn (byte nota, byte midiVelocity) {Serial.write (NOTE_ON_CMD); Serial.write (nota); Serial.write (midiVelocity);} // Enviar nota MIDI OFFvoid midiNoteOff (byte nota, byte midiVelocity) {Serial.write (NOTE_OFF_CMD); Serial.write (nota); Serial.write (midiVelocity);} 
Buttons.cpp Arduino
 #include "Buttons.h" Botón ::Botón (pin int, nota corta) {_pin =pin; pinMode (_pin, INPUT_PULLUP); _state =1; _lastState =1; Nota =nota;} int Button ::getButtonState () {int returnValue =-1; estado int =digitalRead (_pin); if (estado ==_lastState) return 5; if (state! =_lastState) {if (state ==0) {returnValue =0; } else {returnValue =1; }} _lastState =estado; return returnValue;} 
Buttons.h Arduino
 #ifndef Buttons_h # define Buttons_h # include  // Button (Número de pin, Número de nota) class Button {public:Button (pin int, nota corta); int getButtonState (); int Note; privado:int _pin; nota corta; int _state; int _lastState;}; # endif 
Puedes descargar el código de mi Github
https://github.com/sadreactonly/MidiDrumpad

Esquemas


Proceso de manufactura

  1. Atenuación de luces con PWM usando el botón pulsador
  2. Juego de giroscopio Arduino con MPU-6050
  3. Sensor DHT11 con LED y altavoz piezoeléctrico
  4. Iron Man
  5. Sensor de obstáculos simple con Arduino
  6. Encuéntrame
  7. Control del humidificador Arduino
  8. Cubo LED 4x4x4 con Arduino Uno y 1sheeld
  9. Joystick de Arduino
  10. Podómetro (Arduino 101)
  11. Mezclador de colores Arduino