RTP-MIDI (también conocido como AppleMIDI) es un protocolo para transportar mensajes MIDI dentro de paquetes RTP ( Protocolo de Transporte en Tiempo Real ) a través de redes Ethernet y Wi-Fi. Es completamente abierto y gratuito (no requiere licencia) y es compatible con aplicaciones LAN y WAN. En comparación con MIDI 1.0, RTP-MIDI incluye nuevas funciones como la gestión de sesiones, la sincronización de dispositivos y la detección de paquetes perdidos, con regeneración automática de los datos perdidos. RTP-MIDI es compatible con aplicaciones en tiempo real y admite la sincronización precisa a nivel de muestra para cada mensaje MIDI.
Historia de RTP-MIDI
En 2004, John Lazzaro y John Wawrzynek , de la UC Berkeley , hicieron una presentación ante la AES titulada "Una carga útil RTP para MIDI". [ 1 ] En 2006, el documento fue enviado a la IETF y recibió el número RFC 4695. [ 2 ] Paralelamente, Lazzaro y Wawrzynek publicaron otro documento para brindar detalles sobre la implementación práctica del protocolo RTP-MIDI, especialmente el mecanismo de registro. [ 3 ]
RFC 4695 fue reemplazado por RFC 6295 en 2011. El protocolo no cambió entre las dos versiones de los documentos RFC; la última contiene correcciones de errores encontrados en RFC 4695) [ 4 ].
La MMA ( Asociación de Fabricantes MIDI ) ha creado una página en su sitio web para proporcionar información básica relacionada con el protocolo RTP-MIDI. [ 5 ]
AppleMIDI
Apple Computer introdujo RTP-MIDI como parte de su sistema operativo, Mac OS X v10.4 , en 2005. El controlador RTP-MIDI se accede mediante el icono de Red en la herramienta de Configuración MIDI/Audio. La implementación de Apple sigue estrictamente el RFC 4695 para la carga útil y el sistema de registro de RTP, pero utiliza un protocolo de gestión de sesiones dedicado; no sigue la propuesta de gestión de sesiones del RFC 4695. Este protocolo se muestra en Wireshark como "AppleMIDI" y fue documentado posteriormente por Apple .
Apple también creó una clase específica en su implementación de mDNS / Bonjour . Los dispositivos compatibles con esta clase aparecen automáticamente en el panel de configuración RTP-MIDI de Apple como participantes, lo que convierte al sistema MIDI de Apple en totalmente Plug & Play . Sin embargo, es posible introducir manualmente direcciones IP y puertos en este directorio para conectarse a dispositivos que no son compatibles con Bonjour.
Apple también introdujo la compatibilidad con RTP-MIDI en iOS4, pero dichos dispositivos no pueden ser iniciadores de sesión.
El controlador RTP-MIDI de Apple crea puertos MIDI virtuales llamados "Sesiones", que están disponibles como puertos MIDI en cualquier software, como secuenciadores o instrumentos virtuales, que utilice CoreMIDI, donde aparecen como un par de puertos MIDI IN / MIDI OUT como cualquier otro puerto MIDI 1.0 o puerto USB MIDI.
Implementaciones
Dispositivos integrados
En 2006, la empresa holandesa Kiss-Box presentó la primera implementación integrada de RTP-MIDI en diferentes productos, como interfaces MIDI o LTC . [ 6 ] Estos dispositivos cumplen con la implementación de AppleMIDI, utilizando el mismo protocolo de gestión de sesiones, para ser compatibles con otros dispositivos y sistemas operativos que utilizan este protocolo.
Inicialmente, la empresa desarrolló un controlador propietario para Windows XP , pero este se limitaba a la comunicación con sus dispositivos; no era posible conectar un PC con un ordenador Mac mediante dicho controlador. En 2012, se dejó de dar soporte a este controlador en favor del método estándar, cuando se lanzó el controlador rtpMIDI para Windows.
Kiss-Box anunció el lanzamiento en 2012 de una nueva generación de placas de CPU, denominadas "V3", que admiten las funcionalidades de iniciador de sesión. Estos modelos pueden establecer sesiones con otros dispositivos RTP-MIDI sin necesidad de un ordenador como punto de control.
Durante la feria NAMM 2013, la empresa canadiense iConnectivity presentó una nueva interfaz llamada iConnectivityMIDI4+, compatible con RTP-MIDI y que permite la conexión directa entre dispositivos USB y RTP-MIDI. Posteriormente, lanzaron otras interfaces compatibles con RTP-MIDI, como la mio4, la mio10 y la PlayAUDIO 12.
Windows
En 2010, Tobias Erichsen lanzó una implementación para Windows del controlador RTP-MIDI de Apple. [ 7 ] Este controlador funciona en XP , Vista , Windows 7 , Windows 8 y Windows 10 , versiones de 32 y 64 bits. [ 8 ] El controlador utiliza un panel de configuración muy similar al de Apple y es totalmente compatible con la implementación de Apple. Se puede usar para conectar una máquina Windows con una computadora Macintosh, así como con sistemas embebidos. Al igual que el controlador de Apple, el controlador de Windows crea puertos MIDI virtuales, que se vuelven visibles para cualquier aplicación MIDI que se ejecute en la PC. El acceso se realiza a través de la capa mmsystem, como todos los demás puertos MIDI.
Linux
El soporte RTP-MIDI para Linux se reactivó en febrero de 2013 tras un periodo de inactividad. La disponibilidad de controladores se anunció en algunos foros, basados en el trabajo original de Nicolas Falquet y Dominique Fober. [ 9 ] [ 10 ]
También está disponible una implementación específica (pero incompleta) para la computadora Raspberry Pi , llamada raveloxmidi. [ 11 ] Consulte rtpmidid más adelante para obtener una implementación completa.
Una implementación completa de RTP-MIDI (incluido el sistema de registro) está disponible dentro de la distribución Ubuntu, en el paquete de software Scenic. [ 12 ]
Existe una nueva implementación, rtpmidid, [ 13 ] que se integra perfectamente con el secuenciador ALSA, permitiendo el uso de herramientas como QjackCtl para controlar las conexiones. Esta implementación también está disponible para ARM64, lo que significa que funciona en la Raspberry Pi.
iOS
En 2010, Apple incorporó compatibilidad total con CoreMIDI en sus dispositivos iOS, lo que permitió el desarrollo de aplicaciones MIDI para iPhone, iPad e iPod. Posteriormente, MIDI estuvo disponible a través del puerto dock mediante un controlador USB, lo que permitió la conexión de dispositivos MIDI USB utilizando el "Apple Camera Kit". También se pudo utilizar como receptor de sesiones RTP-MIDI a través de Wi-Fi.
Los dispositivos iOS no admiten la función de inicio de sesión, lo que requiere el uso de un iniciador de sesión externo en la red para abrir una sesión RTP-MIDI con el iPad. Este iniciador de sesión puede ser un ordenador Mac o Windows con el controlador RTP-MIDI activado, o un dispositivo RTP-MIDI integrado. La sesión RTP-MIDI aparece con el nombre "Network MIDI" en todas las aplicaciones CoreMIDI para iOS, y no se requiere ningún desarrollo específico para añadir compatibilidad con RTP-MIDI en la aplicación iOS. CoreMIDI virtualiza el puerto MIDI, por lo que el programador solo necesita abrir una conexión MIDI, independientemente de si el puerto está conectado a USB o RTP-MIDI.
Surgieron algunas quejas sobre el uso de MIDI por USB con dispositivos iOS, [ 14 ] ya que el iPad/iPhone debe suministrar energía al dispositivo externo. Algunos adaptadores MIDI USB consumen demasiada corriente para el iPad, lo que limita la corriente y bloquea el arranque del dispositivo, que luego no aparece como disponible para la aplicación. Este problema se evita mediante el uso de RTP-MIDI.
JavaScript
Desde junio de 2013, una implementación en JavaScript de RTP-MIDI, creada por J. Dachtera, está disponible como proyecto de código abierto. [ 15 ] El código fuente se basa en el protocolo de gestión de sesiones de Apple y puede funcionar como iniciador y receptor de sesiones.
Java
Es posible implementar RTP-MIDI en Java en varias plataformas , en particular con la biblioteca 'nmj'. [ 16 ]
WinRT
El proyecto WinRTP-MIDI [ 17 ] es una implementación de código abierto de la pila de protocolos RTP-MIDI bajo Windows RT . El código fue diseñado inicialmente para ser portable entre las distintas versiones de Windows, pero la última versión se ha optimizado para WinRT, con el fin de simplificar el diseño de aplicaciones para la Tienda Windows.
Arduino
RTP-MIDI estuvo disponible para la plataforma Arduino en noviembre de 2013, bajo el nombre de "biblioteca AppleMIDI". [ 18 ] El módulo de software puede ejecutarse en módulos Arduino con adaptador Ethernet integrado, como el Intel Galileo, o en el "Ethernet shield".
KissBox fabrica un módulo OEM RTP-MIDI, una placa procesadora de comunicación externa, que se conecta a través de un enlace de bus SPI .
Caja MIDI
En diciembre de 2013, dos miembros del grupo MIDIbox DIY comenzaron a trabajar en una versión inicial de MIOS (MIDIbox Operating System) que incluía soporte para RTP-MIDI a través de un enlace SPI rápido. Para simplificar la integración, se decidió utilizar una placa procesadora de red externa que gestionara toda la pila de protocolos. Una primera versión beta se publicó la segunda semana de enero de 2014. [ 19 ] El primer software oficial se publicó durante la primera semana de marzo de 2014.
El protocolo utilizado en el enlace SPI entre el procesador MIOS y el procesador de red se basa en el mismo formato que USB, utilizando palabras de 32 bits que contienen un mensaje MIDI completo, y se ha propuesto como un estándar abierto para la comunicación entre módulos de procesador de red y placas de aplicación MIDI.
Axolote
Axoloti es un sintetizador de hardware de código abierto basado en un procesador ARM STM32F427. Este sintetizador es totalmente programable mediante un concepto de parche virtual, similar a Max/MSP , e incluye soporte MIDI completo. Se ha desarrollado una extensión de Node.js para permitir la conexión RTP-MIDI de Axoloti con cualquier dispositivo RTP-MIDI. [ 20 ] El hardware de Axoloti también puede equiparse con un coprocesador externo RTP-MIDI , conectado a través del bus SPI disponible en el puerto de expansión del núcleo de Axoloti. El enfoque es el mismo que el descrito para Arduino y MIDIbox.
Biblioteca multiplataforma MIDIKit
MIDIKit es una biblioteca de código abierto y multiplataforma que proporciona una API MIDI unificada para las diversas API MIDI disponibles en el mercado (Core MIDI, Windows MME, Linux ALSA, etc.). MIDIKit admite el protocolo RTP-MIDI, incluido el sistema de registro. Los puertos RTP-MIDI se consideran dentro de MIDIKit como puertos complementarios (no dependen del controlador rtpMIDI), añadidos a los puertos MIDI nativos del sistema [ 21 ].
Uso sin conductor
Dado que RTP-MIDI se basa en UDP/IP, cualquier aplicación puede implementar el protocolo directamente, sin necesidad de controladores. Estos solo son necesarios cuando se desea que los puertos MIDI de red se comporten como puertos MIDI estándar. Por ejemplo, algunos objetos de Max/MSP y complementos VST se han desarrollado siguiendo esta metodología.
RTP-MIDI sobre AVB
AVB es un conjunto de estándares técnicos que definen las especificaciones para servicios de transmisión de latencia extremadamente baja a través de redes Ethernet. Las redes AVB pueden proporcionar latencias de hasta una muestra de audio en toda la red. RTP-MIDI es compatible de forma nativa con las redes AVB, como cualquier otro protocolo IP, ya que los conmutadores AVB (también conocidos como "conmutadores IEEE 802.1") gestionan automáticamente la prioridad entre las transmisiones de audio/vídeo en tiempo real y el tráfico IP. El protocolo RTP-MIDI también puede utilizar las capacidades en tiempo real de AVB si el dispositivo implementa la carga útil RTCP descrita en el documento IEEE-1733. [ 22 ] Las aplicaciones RTP-MIDI pueden entonces correlacionar la marca de tiempo de "presentación", proporcionada por el reloj maestro IEEE-802.1, con la marca de tiempo RTP, asegurando una distribución temporal precisa a nivel de muestra de los eventos MIDI.
Protocolo
Los RFC 4695 y 6295 dividen la implementación de RTP-MIDI en distintas partes. La única obligatoria, que define el cumplimiento de la especificación RTP-MIDI, es el formato de la carga útil. El registro de transacciones es opcional, pero los paquetes RTP-MIDI deben indicar que tienen un registro vacío, por lo que este siempre está presente en el paquete, incluso si está vacío. La parte de inicio/gestión de sesión es puramente informativa. Apple no la utilizó, ya que creó su propio protocolo de gestión de sesiones.
Formato de encabezado
Sesiones
Las sesiones RTP-MIDI se encargan de crear una ruta virtual entre dos dispositivos RTP-MIDI y, desde el punto de vista de la aplicación, aparecen como un par MIDI IN/MIDI OUT. El RFC 6295 propone el uso de SIP (Protocolo de Iniciación de Sesión) y SDP (Protocolo de Descripción de Sesión), pero Apple decidió crear su propio protocolo de gestión de sesiones. El protocolo de Apple vincula las sesiones con los nombres utilizados en Bonjour y, además, ofrece un servicio de sincronización de reloj.

Una sesión se crea siempre entre dos participantes, y solo entre dos, y se utiliza para detectar posibles pérdidas de mensajes entre ellos. Sin embargo, un controlador de sesión puede abrir varias sesiones en paralelo, lo que permite funciones como la división, la fusión o una matriz de conexiones distribuida. En el diagrama que se muestra aquí, el dispositivo 1 tiene dos sesiones abiertas simultáneamente: una con el dispositivo 2 y otra con el dispositivo 3. Para el usuario final, ambas sesiones en el dispositivo 1 se presentan como la misma interfaz MIDI virtual.
Sesiones frente a puntos finales
Un error común es la incongruencia entre los puntos finales RTP-MIDI y las sesiones RTP-MIDI, ya que ambos representan un par de puertos MIDI IN / MIDI OUT.
Un punto final se utiliza para intercambiar datos MIDI entre el elemento (software y/o hardware) encargado de decodificar el protocolo de transporte RTP-MIDI y el elemento que utiliza los mensajes MIDI. En otras palabras, solo los datos MIDI son visibles a nivel de punto final. Para dispositivos con conectores MIDI 1.0 DIN, hay un punto final por cada par de conectores; por ejemplo: 2 puntos finales para KissBox MIDI2TR, 4 puntos finales para iConnectivityMIDI4+, etc. Los dispositivos que utilizan otros enlaces de comunicación, como SPI o USB, ofrecen más puntos finales; por ejemplo, un dispositivo que utiliza la codificación de 32 bits de la clase USB MIDI puede representar hasta 16 puntos finales mediante el campo Identificador de cable. Un punto final se representa en el lado RTP-MIDI mediante un puerto UDP emparejado cuando se utiliza el protocolo de sesión AppleMIDI.
Una sesión define la conexión entre dos puntos finales. La entrada MIDI de un punto final se conecta a la salida MIDI del punto final remoto, y viceversa. Un único punto final puede aceptar varias sesiones, según la configuración del software. Cada sesión de un punto final determinado aparece como una sola para el gestor de sesiones remoto. Un gestor de sesiones remoto desconoce si el punto final al que está conectado está siendo utilizado por otras sesiones simultáneamente. Si hay varias sesiones activas para un punto final determinado, los diferentes flujos MIDI que llegan a dicho punto final se combinan antes de que los datos MIDI se envíen a la aplicación. En sentido contrario, los datos MIDI generados por una aplicación se envían a todos los gestores de sesiones conectados al punto final.
Participantes de la sesión de AppleMIDI
La implementación de AppleMIDI define dos tipos de controladores de sesión: iniciadores de sesión y oyentes de sesión. Los iniciadores de sesión se encargan de invitar a los oyentes de sesión y son responsables de la secuencia de sincronización del reloj. Generalmente, los iniciadores de sesión pueden ser oyentes de sesión, pero algunos dispositivos, como los dispositivos iOS, solo pueden ser oyentes de sesión.
fusión MIDI
Los dispositivos RTP-MIDI pueden combinar diferentes flujos MIDI sin necesidad de ningún componente específico, a diferencia de los dispositivos MIDI 1.0 que requieren "combinadores MIDI". Como se puede observar en el diagrama, cuando un controlador de sesión se conecta a dos o más sesiones remotas, combina automáticamente los flujos MIDI provenientes de los dispositivos remotos, sin necesidad de ninguna configuración específica.
División MIDI ("MIDI THRU")
Los dispositivos RTP-MIDI pueden duplicar flujos MIDI de una sesión a cualquier número de sesiones remotas sin necesidad de un dispositivo compatible con "MIDI THRU". Cuando una sesión RTP-MIDI se conecta a dos o más sesiones remotas, todas las sesiones remotas reciben una copia de los datos MIDI enviados desde la fuente.
Concepto de panel de conexiones distribuido
Las sesiones RTP-MIDI también ofrecen la función de "patchbay", que en MIDI 1.0 solo era posible mediante un dispositivo de hardware independiente. Un patchbay MIDI 1.0 es un dispositivo de hardware que permite conexiones dinámicas entre un conjunto de entradas MIDI y un conjunto de salidas MIDI, generalmente en forma de matriz. El concepto de conexión "dinámica" contrasta con el uso clásico de las líneas MIDI 1.0, donde los cables se conectaban de forma "estática" entre dos dispositivos. En lugar de establecer la ruta de datos entre dispositivos mediante un cable, el patchbay se convierte en un punto central donde se conectan todos los dispositivos MIDI. El software del patchbay MIDI se configura para definir qué entrada MIDI corresponde a qué salida MIDI, y el usuario puede cambiar esta configuración en cualquier momento sin necesidad de desconectar los cables MIDI DIN.
Gracias al concepto de sesión, ya no se necesitan los módulos de hardware de "patchbay" con RTP-MIDI. Las sesiones son, por definición, rutas virtuales establecidas en la red entre dos puertos MIDI. No se requiere software específico para realizar las funciones de patchbay, ya que el proceso de configuración define con precisión los destinos de cada flujo MIDI generado por un dispositivo MIDI determinado. Estas rutas virtuales se pueden modificar en cualquier momento simplemente cambiando las direcciones IP de destino utilizadas por cada iniciador de sesión. La configuración de "patch" formada de esta manera se puede almacenar en memoria no volátil para que se regenere automáticamente al encender el sistema, pero también se puede modificar directamente, por ejemplo, con la herramienta de software RTP-MIDI Manager o con los paneles de control de los controladores RTP-MIDI, a nivel de RAM.
Protocolo de sesión de Apple
El documento RFC6295 propone el uso de los protocolos SDP (Session Description Protocol) y SIP (Session Initiation Protocol) para establecer y gestionar sesiones entre socios RTP-MIDI. Sin embargo, la implementación de estos dos protocolos resulta bastante compleja, especialmente en sistemas pequeños, dado que no restringen ninguno de los parámetros enumerados en el descriptor de sesión, como la frecuencia de muestreo, que a su vez define todos los campos relacionados con los datos de temporización tanto en las cabeceras RTP como en la carga útil RTP-MIDI. Además, el documento RFC6295 solo sugiere el uso de estos protocolos, permitiendo el uso de cualquier otro, lo que podría generar incompatibilidades entre proveedores.
Apple decidió crear su propio protocolo, imponiendo todos los parámetros relacionados con la sincronización, como la frecuencia de muestreo. Este protocolo de sesión se denomina "AppleMIDI" en el software Wireshark. La gestión de sesiones con el protocolo AppleMIDI requiere dos puertos UDP: el primero, denominado "Puerto de control", y el segundo, denominado "Puerto de datos". En una implementación multihilo, solo el puerto de datos requiere un hilo en tiempo real; el otro puerto puede ser controlado por un hilo de prioridad normal. Estos dos puertos deben estar ubicados en dos posiciones consecutivas (n / n+1); la primera puede ser cualquiera de los 65536 puertos posibles.
No existe ninguna limitación en el número de sesiones que se pueden abrir simultáneamente en el conjunto de puertos UDP con el protocolo AppleMIDI. Es posible crear un grupo de puertos por gestor de sesiones o utilizar un único grupo para varias sesiones, lo que reduce el consumo de memoria del sistema. En este último caso, la pila IP proporciona recursos para identificar a los socios a partir de su dirección IP y número de puerto. Esta funcionalidad se denomina «reutilización de sockets» y está disponible en la mayoría de las implementaciones IP modernas.
Todos los mensajes del protocolo AppleMIDI utilizan una estructura común de 4 palabras de 32 bits, con una cabecera que contiene dos bytes con valor 255, seguidos de dos bytes que describen el significado del mensaje:
Estos mensajes controlan una máquina de estados relacionada con cada sesión. Por ejemplo, esta máquina de estados prohíbe cualquier intercambio de datos MIDI hasta que la sesión alcance el estado "abierta".
Secuencia de invitación
La apertura de una sesión comienza con una secuencia de invitación. El primer participante (el "Iniciador de la Sesión") envía un mensaje IN al puerto de control del segundo participante. Este responde enviando un mensaje OK si acepta abrir la sesión, o un mensaje NO si no acepta la invitación. Si se acepta una invitación en el puerto de control, la misma secuencia se repite en el puerto de datos. Una vez que se han aceptado las invitaciones en ambos puertos, la máquina de estados entra en la fase de sincronización.
Secuencia de sincronización
La secuencia de sincronización permite que ambos participantes de la sesión compartan información relacionada con sus relojes locales. Esta fase posibilita compensar la latencia generada por la red y también admite el registro de la hora futura (véase la sección "Latencia" más adelante).
El iniciador de la sesión envía un primer mensaje (denominado CK0) al interlocutor remoto, indicando su hora local en 64 bits (tenga en cuenta que no se trata de una hora absoluta, sino de una hora relacionada con una referencia local, generalmente expresada en microsegundos desde el inicio del núcleo del sistema operativo). Esta hora se expresa con una frecuencia de muestreo de 10 kHz (100 microsegundos por incremento). El interlocutor remoto debe responder a este mensaje con un mensaje CK1, que contenga su propia hora local en 64 bits. De esta forma, ambos interlocutores conocen la diferencia entre sus respectivos relojes y pueden determinar el desfase que deben aplicar a los campos Timestamp y Deltatime del protocolo RTP-MIDI.
El iniciador de la sesión finaliza esta secuencia enviando un último mensaje llamado CK2, que contiene la hora local en la que recibió el mensaje CK1. Esta técnica permite calcular la latencia promedio de la red y compensar un posible retraso provocado por un hilo de inicio lento, algo que puede ocurrir en sistemas operativos que no son en tiempo real, como Linux, Windows u OS X.
Apple recomienda repetir esta secuencia varias veces justo después de abrir la sesión, para obtener una mayor precisión de sincronización, en caso de que alguna de ellas se haya retrasado accidentalmente debido a una sobrecarga temporal de la red o a un pico de latencia en la activación de un hilo.
Esta secuencia debe repetirse cíclicamente, entre 2 y 6 veces por minuto, generalmente por el iniciador de la sesión, para mantener la precisión de la sincronización a largo plazo mediante la compensación de la deriva del reloj local y también para detectar la pérdida de comunicación con el interlocutor. Si un interlocutor no responde a varios mensajes CK0, se considerará que el interlocutor remoto está desconectado. En la mayoría de los casos, los iniciadores de sesión cambian su máquina de estados al estado de "Invitación" para restablecer la comunicación automáticamente en cuanto el interlocutor remoto se reconecta a la red. Algunas implementaciones, especialmente en ordenadores personales, también muestran un mensaje de alerta y ofrecen al usuario la opción de intentar una nueva conexión o cerrar la sesión.
Actualización del diario
El mecanismo de registro permite detectar la pérdida de mensajes MIDI y permite al receptor generar los datos faltantes sin necesidad de retransmisión. El registro almacena en memoria "imágenes MIDI" para los diferentes participantes de la sesión en distintos momentos. Sin embargo, no es necesario almacenar en memoria los datos de registro correspondientes a eventos recibidos correctamente por un participante. Cada participante envía cíclicamente al otro el mensaje RS, indicando el último número de secuencia recibido correctamente, es decir, sin intervalos entre dos números de secuencia. El emisor puede entonces liberar la memoria que contiene los datos de registro antiguos si es necesario.
Desconexión del compañero de la sesión
Un participante de la sesión puede solicitar abandonarla en cualquier momento, lo que provocará el cierre de la sesión. Esto se realiza mediante el mensaje BY. Al recibir este mensaje, el participante cierra inmediatamente la sesión con el participante remoto que lo envió y libera todos los recursos asignados a dicha sesión. Este mensaje puede ser enviado por el iniciador de la sesión o por el receptor (el participante invitado). [ 23 ]
Estado latente
La principal preocupación respecto a RTP-MIDI se relaciona con la latencia, un problema común en las estaciones de trabajo de audio digital, principalmente debido a que utiliza la pila IP. Sin embargo, se puede demostrar fácilmente que una aplicación o controlador RTP-MIDI correctamente programado no presenta mayor latencia que otros métodos de comunicación.
Además, RTP-MIDI, tal como se describe en RFC 6295, contiene un mecanismo de compensación de latencia. Un mecanismo similar se encuentra en la mayoría de los complementos, que pueden informar al host de la latencia que agregan a la ruta de procesamiento. El host puede entonces enviar muestras al complemento con anticipación, de modo que las muestras estén listas y se envíen de forma síncrona con otros flujos de audio. El mecanismo de compensación descrito en RFC 6295 utiliza un sistema de marca de tiempo relativa, basado en el deltatime MIDI, como se describe en [ 24 ] . Cada evento MIDI transportado en la carga útil RTP tiene un valor deltatime inicial, relacionado con el origen de tiempo de la carga útil actual, definido por el campo Timestamp en el encabezado RTP.
Cada evento MIDI en la carga útil RTP-MIDI se puede sincronizar estrictamente con el reloj global. La precisión de la sincronización depende directamente de la fuente de reloj definida al abrir la sesión RTP-MIDI. El RFC 6295 proporciona algunos ejemplos basados en un reloj de muestreo de audio para obtener una marca de tiempo precisa de los eventos MIDI. La implementación RTP-MIDI de Apple, al igual que otras implementaciones similares como el controlador rtpMIDI para Windows o los sistemas embebidos KissBox, utiliza una frecuencia de reloj fija de 10 kHz en lugar de una frecuencia de muestreo de audio. La precisión temporal de todos los eventos MIDI es de 100 microsegundos para estas implementaciones.
Los relojes del emisor y del receptor se sincronizan al iniciar la sesión y se mantienen sincronizados durante toda la misma mediante ciclos de sincronización regulares, controlados por los iniciadores de la sesión. Este mecanismo permite compensar cualquier latencia, desde unos pocos cientos de microsegundos, como en las aplicaciones de red local (LAN), hasta segundos. Por ejemplo, puede compensar la latencia introducida por Internet, permitiendo la ejecución en tiempo real de piezas musicales.
Sin embargo, este mecanismo está diseñado principalmente para flujos MIDI pregrabados, como el que proviene de una pista de secuenciador. Cuando se utiliza RTP-MIDI para aplicaciones en tiempo real (por ejemplo, para controlar dispositivos desde un teclado compatible con RTP-MIDI [ 25 ] ), el deltatime se suele establecer en el valor específico de 0, lo que significa que el evento MIDI correspondiente se interpretará en cuanto se reciba. En este caso, no se puede utilizar el mecanismo de compensación de latencia descrito anteriormente.
La latencia que se puede obtener está directamente relacionada con los diferentes componentes de red involucrados en la ruta de comunicación entre los dispositivos RTP-MIDI:
- Tiempo de procesamiento de la aplicación MIDI
- Tiempo de procesamiento de la pila de comunicación IP
- Tiempo de reenvío de paquetes de conmutadores/enrutadores de red
Tiempo de procesamiento de la solicitud
El tiempo de procesamiento de las aplicaciones suele estar estrictamente controlado, ya que las tareas MIDI se ejecutan con frecuencia en tiempo real. En la mayoría de los casos, la latencia proviene directamente de la latencia del hilo, que se puede obtener en un sistema operativo determinado, generalmente de 1 a 2 ms como máximo en Windows y Mac OS. Los sistemas con un núcleo en tiempo real pueden lograr resultados mucho mejores, de hasta 100 microsegundos. Este tiempo puede considerarse constante, independientemente del canal de comunicación (MIDI 1.0, USB, RTP-MIDI, etc.), ya que los hilos de procesamiento operan en un nivel diferente al de los hilos/tareas relacionados con la comunicación.
Tiempo de procesamiento de la pila IP
El tiempo de procesamiento de la pila IP es el más crítico, ya que el proceso de comunicación está bajo el control del sistema operativo. Esto se aplica a cualquier protocolo de comunicación, relacionado o no con IP, puesto que la mayoría de los sistemas operativos, incluidos Windows, Mac OS o Linux, no permiten el acceso directo al adaptador Ethernet. En particular, un error común es confundir los "sockets sin procesar" con el "acceso directo a la red"; los sockets son el punto de entrada para enviar y recibir datos a través de la red en la mayoría de los sistemas operativos. Un "socket sin procesar" es un socket que permite a una aplicación enviar cualquier paquete utilizando cualquier protocolo. La aplicación es entonces responsable de construir el telegrama siguiendo las reglas del protocolo, mientras que el "acceso directo" requeriría acceso a nivel de sistema, restringido al núcleo del sistema operativo. Un paquete enviado mediante un socket sin procesar puede sufrir retrasos por parte del sistema operativo si el adaptador de red está siendo utilizado por otra aplicación. Por lo tanto, un paquete IP puede enviarse a la red antes que un paquete relacionado con un socket sin procesar. Técnicamente hablando, el acceso a una tarjeta de red determinada se controla mediante "semáforos". [ 26 ]
Las pilas IP necesitan correlacionar las direcciones Ethernet (direcciones MAC) con las direcciones IP mediante un protocolo específico llamado ARP. Cuando una aplicación RTP-MIDI desea enviar un paquete a un dispositivo remoto, primero debe localizarlo en la red, ya que Ethernet no entiende conceptos relacionados con IP, para así crear la ruta de transmisión entre los enrutadores/conmutadores. Esto lo realiza automáticamente la pila IP enviando primero una solicitud ARP (Protocolo de Reconocimiento de Direcciones). Cuando el dispositivo de destino reconoce su propia dirección IP en el paquete ARP, envía una respuesta ARP con su dirección MAC. La pila IP puede entonces enviar el paquete RTP-MIDI. Los siguientes paquetes RTP-MIDI ya no necesitan la secuencia ARP, a menos que el enlace se inactive durante unos minutos, lo que borra la entrada ARP de la tabla de enrutamiento del remitente.
Esta secuencia ARP puede tardar unos segundos, lo que puede generar una latencia perceptible, al menos para el primer paquete RTP-MIDI. Sin embargo, la implementación de Apple resolvió este problema de forma elegante mediante el protocolo de control de sesión. Este protocolo utiliza los mismos puertos que el protocolo RTP-MIDI. La secuencia ARP se ejecuta durante la secuencia de inicio de sesión. Cuando la aplicación RTP-MIDI desea enviar el primer paquete, las tablas de enrutamiento del ordenador ya están inicializadas con las direcciones MAC de destino correctas, lo que evita cualquier latencia para dicho paquete.
Además de la secuencia ARP, la pila IP requiere cálculos para preparar las cabeceras de los paquetes, como la cabecera IP, la cabecera UDP y la cabecera RTP. Con los procesadores modernos, esta preparación es extremadamente rápida y solo tarda unos pocos microsegundos, lo cual es insignificante comparado con la latencia de la propia aplicación. Como se describió anteriormente, una vez preparado, un paquete RTP-MIDI solo puede sufrir retrasos al intentar llegar al adaptador de red si este ya está transmitiendo otro paquete, ya sea que el socket sea IP o "raw". Sin embargo, la latencia introducida a este nivel suele ser extremadamente baja, ya que los hilos del controlador encargados de los adaptadores de red tienen una prioridad muy alta. Además, la mayoría de los adaptadores de red tienen búferes FIFO a nivel de hardware, por lo que los paquetes pueden almacenarse para su transmisión inmediata en el propio adaptador de red sin necesidad de que el hilo del controlador se ejecute primero. Un método para ayudar a mantener la latencia relacionada con la "competencia por el acceso al adaptador" lo más baja posible es reservar el adaptador de red exclusivamente para la comunicación MIDI y utilizar un adaptador de red diferente para otros usos de red, como el intercambio de archivos o la navegación por Internet.
Tiempo de enrutamiento de los componentes de red
Los distintos componentes utilizados para transmitir paquetes Ethernet entre ordenadores, independientemente de los protocolos empleados, también introducen latencia. Todos los conmutadores de red modernos utilizan la tecnología de "almacenamiento y reenvío", en la que los paquetes se almacenan en el conmutador antes de enviarlos al siguiente. Sin embargo, los tiempos de conmutación suelen ser insignificantes. Por ejemplo, un paquete de 64 bytes en una red de 100 Mbit/s tarda aproximadamente 5,1 microsegundos en ser reenviado por cada conmutador. Una red compleja con 10 conmutadores en una ruta determinada introduce entonces una latencia de 51 microsegundos.
La latencia, sin embargo, está directamente relacionada con la carga de la red, ya que los conmutadores retrasan la transmisión de un paquete hasta que se transmite el anterior. Calcular o medir la latencia real introducida por los componentes de red puede ser una tarea compleja y requiere casos de uso representativos; por ejemplo, medir la latencia entre dos dispositivos conectados al mismo conmutador de red siempre arrojará resultados excelentes. Como se mencionó en la sección anterior, una solución para limitar la latencia introducida por los componentes de red es utilizar redes separadas. Sin embargo, esto es mucho menos crítico para los componentes de red que para los adaptadores de red en las computadoras.
Latencia esperada para aplicaciones en tiempo real
Como se puede observar, la latencia exacta obtenida para un enlace RTP-MIDI depende de muchos parámetros, la mayoría de ellos relacionados con los propios sistemas operativos. Las mediciones realizadas por los distintos proveedores de RTP-MIDI arrojan tiempos de latencia que van desde unos pocos cientos de microsegundos para sistemas embebidos que utilizan sistemas operativos en tiempo real, hasta 3 milisegundos cuando se trata de ordenadores con sistemas operativos de propósito general.
Mejora de la latencia (latencia inferior a un milisegundo)
La AES creó en 2010 un grupo de trabajo denominado SC-02-12H [ 27 ] con el fin de demostrar la capacidad de utilizar cargas útiles RTP en redes IP para aplicaciones de muy baja latencia. La propuesta preliminar publicada por el grupo en mayo de 2013 demuestra que es posible lograr la transmisión RTP para aplicaciones en directo con una latencia de tan solo 125 microsegundos.
Configuración
Otra preocupación común relacionada con RTP-MIDI es el proceso de configuración, ya que la conexión física de un dispositivo a la red no basta para garantizar la comunicación con otro. Dado que RTP-MIDI se basa en la pila de protocolos IP, es necesario configurar las distintas capas implicadas en la comunicación, como la dirección IP y los puertos UDP. Para simplificar esta configuración, se han propuesto diversas soluciones, siendo la más común el conjunto de tecnologías de " Configuración Cero ", también conocido como Zeroconf.
RFC 3927 [ 28 ] describe un método común para asignar automáticamente direcciones IP, utilizado por la mayoría de los productos compatibles con RTP-MIDI. Una vez conectado a la red IP, dicho dispositivo puede autoasignarse una dirección IP, con resolución automática de conflictos de direcciones IP. Si el dispositivo sigue la recomendación de asignación de puertos de la especificación RTP, se convierte en "Plug&Play" desde el punto de vista de la red. De este modo, es posible crear una red RTP-MIDI sin necesidad de definir ninguna dirección IP ni números de puerto UDP. Sin embargo, estos métodos suelen reservarse para configuraciones pequeñas. La automatización completa de la configuración de red se suele evitar en configuraciones grandes, ya que la localización de dispositivos defectuosos puede resultar compleja, puesto que no existirá una relación directa entre la dirección IP seleccionada por el sistema Zeroconf y la ubicación física del dispositivo. Una configuración mínima consistiría entonces en asignar un nombre al dispositivo antes de conectarlo a la red, lo que anula el concepto de "Plug&Play" real en ese caso.
Cabe destacar que el concepto de "Configuración Cero" se limita a las capas de comunicación de red. Técnicamente, es imposible realizar la instalación completa de cualquier dispositivo en red (relacionado con MIDI o no) simplemente abstraiendo la capa de direccionamiento. Un ejemplo práctico que ilustra esta limitación es un generador de sonido RTP-MIDI que debe controlarse desde un teclado maestro MIDI conectado a una interfaz RTP-MIDI. Aunque el generador de sonido y la interfaz MIDI integren los servicios de "Configuración Cero", no pueden saber por sí mismos que necesitan establecer una sesión, ya que los servicios de configuración IP operan en niveles diferentes. Por lo tanto, cualquier sistema MIDI en red, independientemente del protocolo utilizado para el intercambio de datos MIDI (basado en IP o no), requiere el uso obligatorio de una herramienta de configuración para definir los intercambios que deben tener lugar entre los dispositivos una vez conectados a la red. Esta herramienta de configuración puede ser una herramienta de gestión externa que se ejecuta en un ordenador o estar integrada en el software de aplicación del dispositivo en forma de menú de configuración si el dispositivo integra una interfaz hombre-máquina.
Compatibilidad con MIDI 2.0
La Asociación de Fabricantes MIDI anunció en enero de 2019 que una importante evolución del protocolo MIDI, denominada MIDI 2.0 [ 29 ], estaba entrando en la fase final de creación de prototipos.
MIDI 2.0 depende en gran medida de la extensión MIDI-CI, utilizada para la negociación de protocolos (identificación de dispositivos MIDI 1.0 y MIDI 2.0 para permitir el cambio de protocolo). RTP-MIDI es totalmente compatible con el protocolo MIDI-CI, ya que utiliza MIDI 1.0 System Exclusive incluso en dispositivos MIDI 2.0.
Se ha presentado a la MMA una evolución del protocolo RTP-MIDI que incluye MIDI 2.0 y actualmente se está debatiendo en el grupo de trabajo de MIDI 2.0. El protocolo mejorado admite simultáneamente los formatos de datos MIDI 1.0 y MIDI 2.0 (MIDI 2.0 utiliza paquetes de 32 bits, mientras que MIDI 1.0 utiliza paquetes de 8 bits).
Empresas/Proyectos que utilizan RTP-MIDI
- Apple Computer (controlador RTP-MIDI integrado en Mac OS X e iOS para toda la gama de productos): RTP-MIDI a través de Ethernet y WiFi.
- Yamaha (sintetizadores Motif, adaptador UD-WL01 [ 30 ] ) - RTP-MIDI a través de Ethernet y WiFi
- Behringer (Superficie de control X-Touch) [ 31 ]
- KissBox (interfaz RTP-MIDI con MIDI 1.0, LTC, E/S y ArtNet, plugins VST para control remoto de sintetizadores de hardware)
- Consultoría Tobias Erichsen (Controlador RTP-MIDI gratuito para Windows / Utilidades)
- GRAME (controlador de Linux)
- HRS (Distribución de código de tiempo MIDI en Ethernet / Software de sincronización)
- iConnectivity (interfaces de audio y MIDI con soporte USB y RTP-MIDI)
- Tecnologías fusionadas (Horus, Hapi, Pyramix, Ovation): RTP-MIDI para control LTC/MTC, MIDI DIN y MicPre [ 32 ]
- Zivix PUC (Interfaz inalámbrica RTP-MIDI para dispositivos iOS) [ 33 ]
- Biblioteca Arduino-AppleMIDI [ 34 ]
- MIDIbox [ 35 ]
- Cinara (interfaz MIDI con soporte USB y RTP-MIDI) [ 36 ]
- McLaren Labs rtpmidi para Linux [ 37 ]
- BEB (módulos DSP para sintetizadores modulares basados en la arquitectura RTP-MIDI) [ 38 ]
- Axoloti (Sintetizador de hardware de código abierto con conectividad RTP-MIDI) [ 39 ]
Referencias
- ↑ Un formato de carga útil RTP para MIDI. 117.ª Convención de la Audio Engineering Society, del 28 al 31 de octubre de 2004, San Francisco, California.
- ↑ Formato de carga útil RTP para MIDI - RFC 4695
- ↑ Guía de implementación para RTP MIDI. RFC 4696
- ↑ Formato de carga útil RTP para MIDI - RFC 6295
- ↑ https://www.midi.org/midi-articles/rtp-midi-or-midi-over-networks Página 'Acerca de RTP-MIDI' en el sitio web de MMA
- ↑ Sitio web de Kiss-Box (dispositivos de hardware que utilizan el protocolo RTP-MIDI)
- ↑ Controlador RTP-MIDI para Windows
- ↑ «RtpMIDI | Tobias Erichsen» .
- ↑ "Implementación de una transmisión MIDI sobre RTP" (PDF) . Archivado del original (PDF) el 31/01/2013 . Consultado el 11/05/2013 .
- ↑ "Diario de recuperación y evaluación de propuestas alternativas" (PDF) . Archivado del original (PDF) el 31 de enero de 2013. Consultado el 11 de mayo de 2013 .
- ↑ https://github.com/ravelox/pimidi Implementación RTP-MIDI dedicada a la plataforma Raspberry Pi
- ↑ http://manpages.ubuntu.com/manpages/oneiric/man1/midistream.1.html#contenttoc0 Archivado el 18/05/2015 en Wayback Machine. Manual de usuario del objeto RTP-MIDI llamado "midistream" en Linux Ubuntu.
- ↑ https://github.com/davidmoreno/rtpmidid rtpmidid en github
- ↑ "Página de Apple sobre problemas de conectividad USB MIDI" . support.apple.com
- ↑ "Node RTP Midi" . GitHub . 3 de marzo de 2022.
- ↑ "nmj" . Humatic.de . Consultado el 27 de mayo de 2022 .
- ↑ http://winrtpmidi.codeplex.com Archivado el 21/05/2014 en Wayback Machine. Sitio web del proyecto de código abierto WinRTP-MIDI.
- ↑ Librería RTP-MIDI/AppleMIDI para Arduino
- ↑ Anuncio del foro de MIDIbox sobre la compatibilidad con RTP-MIDI en MIOS
- ↑ https://gist.github.com/DatanoiseTV/6a59fc66517fbd923ed9 Extensión de Node.js para proporcionar conexión RTP-MIDI a Axoloti
- ↑ https://github.com/jpommerening/midikit/blob/master/driver/common/rtpmidi.c Biblioteca MIDI unificada multiplataforma con soporte RTP-MIDI integrado
- ↑ Estándar IEEE para el protocolo de transporte de capa 3 para aplicaciones sensibles al tiempo en redes de área local
- ↑ "Protocolo de controlador de red MIDI" . developer.apple.com . Consultado el 10 de febrero de 2025 .
- ↑ Especificación MIDI 1.0 - Sección 4 - Archivos MIDI estándar
- ↑ "CME - Socio" . Archivado del original el 16 de marzo de 2013. Consultado el 10 de mayo de 2013 .Kit de expansión RTP-MIDI para teclados CME
- ↑ "Semáforos de sistemas operativos" .
- ↑ Grupo de estándares AES para la interoperabilidad de audio a través de redes IP
- ↑ Configuración automática de direcciones IPv4 Link-Local - RFC3927
- ↑ "La Asociación de Fabricantes MIDI (MMA) y la Asociación de la Industria de la Electrónica Musical (AMEI) anuncian el prototipado de MIDI 2.0™ -" . Archivado del original el 10 de febrero de 2019. Consultado el 7 de febrero de 2019 .
- ^ "UD-WL01 - Descripción general - Yamaha EE. UU." .
- ↑ "Behringer: X-TOUCH" . www.behringer.com . Archivado del original el 26 de enero de 2014.
- ↑ "Fusión de tecnologías | Descripción general de productos" .
- ↑ "El producto MIDI WiFi inalámbrico Legacy" .
- ↑ "lathoub/Arduino-AppleMidi-Library" . GitHub . Consultado el 28 de mayo de 2016 .
- ↑ Página principal de MIDIbox
- ↑ Página principal de Cinera
- ↑ Laboratorios McLaren
- ↑ Página principal de HorusDSP
- ↑ "Página principal de Axoloti" . Archivado del original el 31/12/2016 . Consultado el 14/04/2016 .
- MIDI