Tutorial: Usa MIDI para Controlar Tu Entorno

MIDI (Musical Instrument Digital Interface) is a protocol (with electrical connectors and a digital interface) that allows digital tools and electronic devices (virtual and physical) to communicate with each other. MIDI is usually used as a music sequencer. Originally, this format was created in the 80s as a way for instruments to communicate with each other, but since then, it has evolved into a highly organized specification that is heavily tested and adopted for a multitude of purposes.

Creamos una clase MIDI (con la ayuda de un miembro de la comunidad, Brainstormer) que puede usarse para controlar tu entorno en Overte. Por ejemplo, usamos MIDI para controlar la iluminación en un dominio durante un espectáculo musical.

Nota

Actualmente, solo se admite la clase MIDI en Windows.

Fundamentos de la clase MIDI

Nuestra clase MIDI funciona enviando un DWORD (palabra doble), un tipo de dato específico de Microsoft Windows, como mensaje. Es una unidad de datos sin signo de 32 bits y puede contener un valor entero que va de 0 a 4,294,967,295.

Cada vez que mueves una palanca, giras un control, presionas/liberas una tecla o tocas un pad, estás generando un mensaje MIDI que indica qué canal, qué nota, qué velocidad y cuál es el estado/comando a ejecutar.

Cada byte de este mensaje describe el valor de un tipo diferente.

00000000

0vvvvvvv

0nnnnnnn

1sss

cccc

Donde:

  • v = velocidad

  • n = notas

  • s = estado

  • c = canal

El número en el bit de orden superior (el primer número) indica si se trata de un comando (1) o de datos (0). El resto de los números determinan el valor del tipo. Esto significa que la velocidad y la nota pueden representar 128 valores únicos (1+2+4+8+16+32+64), el estado puede representar 8 valores únicos y el canal puede representar 16 valores.

Los diferentes tipos de estado que admitimos son:

Estado

Tipos

08

nota desactivada

09

nota activada

10

presión de tecla polifónica

11

control de cambios

12

cambio de programa

13

presión de canal

14

inflexión de tono

15

mensaje del sistema

Conectar tu Dispositivo de Control

Puedes conectar un dispositivo de control real que uses para manejar tu entorno en Overte, o crear uno virtual que te ayude a conectarte con otros dispositivos virtuales.

Conectar Ableton Live a la Interfaz

Para conectar Ableton Live directamente al cliente de Interfaz de Overte, recomendamos las siguientes herramientas virtuales:

  • loopMIDI: Esto creará un puerto virtual de entrada/salida para enviar información dentro y fuera de HiFi

  • VMP: Puedes usarlo para simular teclas presionadas o controles deslizantes/perillas manipuladas si no tienes un controlador físico.

Conectar un iPad o iPhone a la Interfaz

Puedes usar tu iPad o iPhone como un controlador táctil con botones, perillas y controles deslizantes. Lee las secciones Configura tu Dispositivo MIDI y Ejemplo: Cambiar el Color de un Cubo usando MIDI antes de leer estas instrucciones.

  • Descarga nuestra aplicación recomendada touchosc.

  • Descarga el puente para Windows.

  • Configura la conexión ya sea por USB o a través de tu red WIFI local en el menú de configuración.

  • Si configuras tu onEventReceived para registrar los mensajes entrantes, podrás ver qué perillas envían qué información, la cual puedes usar para llamar funciones personalizadas.

  • ¡También hay componentes interesantes como el acelerómetro que puedes utilizar!

Configura tu Dispositivo MIDI

Una vez que hayas configurado tu Dispositivo Controlador MIDI, necesitas configurarlo.

  1. Aquí tienes una función de configuración MIDI general recomendada que puedes ejecutar en un script. Con ella, puedes ver una lista de los dispositivos MIDI actualmente conectados:

    // Some helpful constants
    const INPUT = false;
    const OUTPUT = true;
    const ENABLE = true;
    const DISABLE = false;
    function midiConfig(){
        Midi.thruModeEnable(DISABLE );
        Midi.broadcastEnable(DISABLE );
        Midi.typeNoteOffEnable(ENABLE );
        Midi.typeNoteOnEnable(ENABLE );
        Midi.typePolyKeyPressureEnable(DISABLE);
        Midi.typeControlChangeEnable(ENABLE);
        Midi.typeProgramChangeEnable(ENABLE);
        Midi.typeChanPressureEnable(DISABLE);
        Midi.typePitchBendEnable(ENABLE );
        Midi.typeSystemMessageEnable(DISABLE);
    
        // get a list of the available  in and  out device IDs
        midiInDeviceList = Midi.listDevices(INPUT);
        midiOutDeviceList = Midi.listDevices(OUTPUT);
        print(JSON.stringify(midiInDeviceList));
        print(JSON.stringify(midiOutDeviceList));
    
  2. Después de ejecutar la función de configuración, querrás conectarte a midiMessages:

    Midi.midiMessage.connect(onEventReceived);
    // Your message handler will look like the following:
    /// @param {int} device: device number
    /// @param {int} channel: channel number
    /// @param {int} type: 0x8 is noteoff, 0x9 is noteon (if velocity=0, noteoff), etc
    /// @param {int} note: MIDI note number
    /// @param {int} velocity: note velocity (0 means noteoff)
    
    function onEventReceived(eventData){
        // functions you run in response to different MIDI events
    }
    

Ejemplo: Cambiar el Color de un Cubo usando MIDI

Vamos a cambiar el color de una entidad tipo cubo en Overte usando MIDI.

  1. Usa este método para transformar el rango MIDI de 0 a 127 en cualquier otro rango de salida que desees usando interpolación lineal:

    function lerp(InputLow, InputHigh, OutputLow, OutputHigh, Input) {
        return ((Input - InputLow) / (InputHigh - InputLow)) * (OutputHigh - OutputLow) + OutputLow;
    }
    lerp (0,127,0,360,eventData.velocity); // the 0 would be 0, and the 127 would be 360.
    
  2. Como los colores van de 0 a 255, podríamos hacer lo siguiente:

    var red = 0;
    function  changeCubeColor(redValue){
        var entityColorProps = Entities.getEntityProps(cubeID, ["color"]).color;
        entityColorProps.red = redValue;
        Entities.editEntity(cubeID, entityColorProps);
    }
    
  3. Luego usa onEventReceived para cambiar el color del cubo:

    // eventData.device, eventData.channel, eventData.type, eventData.note, eventData.velocity
    
    function onEventReceived(eventData){
        changeCubeColor( lerp(0,127,0,255,eventData.velocity) );
    }
    

Imprime el eventData en tu función onEventReceived para ver cada controlador y su salida. Esto te dirá todo lo que necesitas saber sobre cómo enrutar la tecla, deslizador, perilla o botón correcto hacia tus funciones de JavaScript deseadas.

Si deseas controlar algo fuera de Overte, o llamar directamente a un evento MIDI para controlar algo dentro de Overte, puedes usar la función:

// event similar to the above
Midi.playNote(Status, Note, Velocity);

Otras Formas de Usar MIDI en Overte

  • Usa Ableton para secuenciar animaciones completas de tu dominio.

  • Controla dispositivos del mundo real mediante los movimientos que ocurren en Overte y viceversa (piensa en un ciclo de actualización)

  • Configura tu iPad como un conjunto de botones que puedas presionar en cualquier momento para activar eventos en tu dominio a voluntad.

Ver también