MIDI over WebRTC

supertorpe
#1 por supertorpe el 17/12/2020
Hace unos días empecé a trastear con WebRTC para montar una pequeña prueba de concepto de juego HTML multijugador sin servidor (p2p).

WebRTC es una tecnología que permite crear conexiones p2p entre navegadores. Se suele utilizar para videoconferencia, compartir escritorio, archivos... Entre otras facilidades, proporciona "DataChannels" que permiten enviar datos con baja latencia.

"Sin servidor" entre comillas, porque conviene tener un servidor de señalización (es donde se crearían las salas o el mecanismo que se diseñe para emparejar los nodos), otro servidor STUN/TURN (para descubrir la IP pública y, en su caso, atravesar la NAT).

Todo esto lo tengo montado y un tanto avanzada la prueba de concepto del juego: el próximo paso sería calcular la latencia y estimar la posición actual del otro jugador en función de su última posición y velocidad, etc.

Pues resulta que mientras pensaba en esto, me vino a la cabeza la posibilidad de enviar datos MIDI por un DataChannel, y las posibilidades que daría esto (si además usamos WebMIDI) y he recopilado unos cuantos links:

Can WebRTC help musicians?
PlayMyBand WebRTC real time game
webrtc-piano
P2P MIDI chatroom (WebRTC + Web MIDI)

No tengo ni idea de si voy a tener tiempo para iniciar algún experimento en esta dirección, pero dejo constancia en este hilo para, en caso afirmativo, ir comentando lo que consiga.
Subir
1
pablofcid mod
#2 por pablofcid el 17/12/2020
Me apunto en seguimiento. Supongo que si estás al tanto de rtp (real time protocol) para enviar MIDI por redes.
Subir
supertorpe
#3 por supertorpe el 19/12/2020
pablofcid escribió:
Supongo que si estás al tanto de rtp (real time protocol) para enviar MIDI por redes.


Sí, en su día hice una prueba y publiqué un artículo aquí comentando el experimento. De hecho, RTP es el protocolo de transporte para medios en WebRTC:

https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Intro_to_RTP
https://tools.ietf.org/id/draft-ietf-rtcweb-rtp-usage-11.html#sec-rtp-rtcp
https://www.w3.org/TR/webrtc/#rtp-media-api
Subir
supertorpe
#4 por supertorpe el 28/12/2020
Ya tengo una pequeña prueba de concepto.

El piano envía a "loopMIDI Port 1" que es capturado por el primer navegador. Este, a su vez, lo envía al "loopMIDI Port 2" y al otro peer (el otro navegador).
Archivos adjuntos ( para descargar)
midiwebrtc.gif
Subir
supertorpe
#5 por supertorpe el 29/12/2020
Estaba pensando en algunos casos de uso:

1) Juegos
- acierta las notas: algo como esto (https://sightreading.training) pero multijugador. Se van presentando notas (pueden obtenerse de un catálogo de obras, por dificultad) y los jugadores intentan acertarlas. El acierto da puntos y el fallo los quita. El jugador que más puntos consiga en un tiempo determinado es el ganador. Podrías ir viendo "en tiempo real" por dónde va el otro jugador.
O bien, en modo colaborativo: uno tiene que acertar las notas de la clave de SOL y otro las de la clave de FA. No avanza hasta que ambos acierten.
O bien, uno tiene que tocar unos compases y el otro los siguientes, y así sucesivamente.

2) Enseñanza
- Se puede habilitar un cuadro para videoconferencia
- El profesor toca unas notas/compases o los carga desde un archivo midi. Esta información se le presenta al alumno en partitura, teclado y se reproduce; a continuación tiene que imitar. Puede reproducir de nuevo la interpretación del profesor.
- Si la latencia lo permite, el profesor toca una melodía y el alumno tiene que tocar el acompañamiento; o a la inversa. Si no lo permite, puede hacer como en el caso anterior: el profesor envía el acompañamiento (o melodía) al alumno y este, a continuación, lo puede reproducir mientras toca la melodía (o acompañamiento) y se envía simultáneamente al profesor.

Algunos recursos:

https://www.abcjs.net
https://www.vexflow.com
https://github.com/grimmdude/MidiWriterJS
https://github.com/colxi/midi-parser-js

Alguien ha hecho un experimento muy loco usando websockets: https://www.multiplayerpiano.com
Subir
Klaus Von Hohenfollen
#6 por Klaus Von Hohenfollen el 29/12/2020
supertorpe escribió:
2) Enseñanza
- Se puede habilitar un cuadro para videoconferencia
- El profesor toca unas notas/compases o los carga desde un archivo midi. Esta información se le presenta al alumno en partitura, teclado y se reproduce; a continuación tiene que imitar. Puede reproducir de nuevo la interpretación del profesor.
- Si la latencia lo permite, el profesor toca una melodía y el alumno tiene que tocar el acompañamiento; o a la inversa. Si no lo permite, puede hacer como en el caso anterior: el profesor envía el acompañamiento (o melodía) al alumno y este, a continuación, lo puede reproducir mientras toca la melodía (o acompañamiento) y se envía simultáneamente al profesor.


La idea de hacerlo en tiempo real no se hasta qué punto es interesante porque veo difícil solucionar el tema de la latencia. Pero como "actividad" asíncrona que pueda ser configurada en un LMS podría ser interesante. Es algo que surge de vez en cuando en los foros de Moodle.

https://moodle.org/mod/forum/discuss.php?d=397343

Se pueden hacer ejercicios de ritmo, dictado, interpretación, etc... es algo a lo que le he dado más de una pensada. El profe luego tiene un cuadro con el progreso del alumno en los trabajos que se le han asignado y obviamente puede aprovechar mejor la clase presencial o por videoconferencia en base a ese progreso. Yo diría que tiene bastante potencial.

En realidad no se va tanto de las clases de piano de Garageband (que curiosamente no parecen tener mucho éxito).



... la diferencia es orientar la aplicación al auto-aprendizaje supervisado (o no). Pero claro también tiene su aquel analizar la interpretación que graba el alumno, compararla con la de referencia y mostrar unos resultados aprovechables por el profesor. Así como mostrar partituras en pantalla, no se si esto está resuelto hoy en día.

Desde un punto de vista comercial puede ser muy interesante en tanto con los confinamientos las escuelas de música buscan alternativas y elementos que les den valor añadido. Una plataforma con una colección de lecciones podría ser muy aprovechable. Si hay un momento para lanzar algo así es ahora ;-)
Subir
supertorpe
#7 por supertorpe el 29/12/2020
Sí, la latencia es un problema para tocar ambos al mismo tiempo, pero hay interacciones que pueden ser muy interesantes, sin tener que ser totalmente asíncronas; me refiero a tocar por turnos.
Por ejemplo, lo que comentaba más arriba: una clase online donde el profesor está enseñando, por ejemplo, distintos acordes :
bad9d6449f32642d53a12f47e50bb-4745680.png
El alumno oye en su instrumento y ve en su pantalla exactamente qué está tocando el profesor, con las explicaciones del mismo. Después es el turno del alumno.

...y aún haciendo offtopic en mi propio hilo, pero me ha venido de repente.. ¿no existe un Strava para la música, en lugar de para el ejercicio? El equivalente a los "segmentos" de strava serían secciones de obras. Podrías ver quienes las han estado practicando, el avance sobre la misma obra de otros usuarios, etc.
Subir
Hilos similares
Responder

Regístrate o para poder postear en este hilo