puertos protocolo modelo listado ejemplos caracteristicas capa aplicacion networking unity3d midi

networking - modelo - protocolo udp caracteristicas



MIDI sobre TCP/IP/UDP para ser recibido enUnity3D con C#/. NET (2)

He hecho algo similar en el pasado. Lo que podrías hacer es:

Instale un dispositivo de loopback Midi (controlador) en su computadora. Hay muchos de ellos, por ejemplo: http://www.tobias-erichsen.de/software/loopmidi.html

A continuación, diseñe una aplicación simple que escuche en el puerto Midi Virtual desde el dispositivo Loopback y convierta todo lo recibido desde el puerto Virtual MIDI a paquetes de datos que se envían a través de una conexión TCP / IP. La conexión TCP / IP finalizará en su Unity Script u otra cosa que admita TCP / IP y pueda reproducir MIDI. El protocolo es bastante simple: 3 bytes: nota activada, número de nota, volumen. (generalmente el Volumen 0 significa nota desactivada). Es sobre cómo podrías implementar esto.

Espero que esto ayude...

Estoy trabajando en Unity3D Standard Edition. Para aquellos que no lo saben, es un motor de juegos en 3D que admite la creación de scripts C # / .NET (por lo que tiene acceso a la API de .NET 2.0).

He creado mi propio sintetizador. (Actualmente está respondiendo a los eventos de Note-ON generados por un secuenciador MIDI que mastica un archivo MIDI).

Ahora deseo capturar los eventos de Note-ON desde un teclado MIDI.

Tengo la intención de implementar mi aplicación en iOS como mínimo, espero que otros sistemas operativos sigan. Entonces los escenarios objetivo son:

  • alguien que ejecuta mi aplicación en un iPhone, tienen un teclado MIDI conectado a su máquina con Windows
  • alguien que ejecuta mi aplicación en una tableta Android, tienen un teclado MIDI que se conecta a su máquina Linux
  • alguien que ejecuta mi aplicación en OS X, tienen un teclado MIDI conectado a OS X

La última es la situación en la que estoy, así que si alguien tiene una solución para esa que no se extiende, todavía estoy muy interesado en ella, eso al menos me permitiría obtener un prototipo funcional juntos.

Existe un activo, MIDI Unified , que se conectará con un dispositivo MIDI. Sin embargo, requiere la versión PRO. Esto se debe a que la versión PRO permite complementos nativos.

Creo que debería ser posible llevar MIDI a Unity sin usar plug-ins nativos, sino a través de la conexión de red.

(Tenga en cuenta que no estoy diciendo conexión a Internet, conexión Ethernet, TCP / IP, UDP, HTTP, ya que no estoy completamente seguro de cuál sería el término correcto para usar).

Parece que hay utilidades para enviar señales MIDI a través de redes: ipMIDI hará esto para Windows y OS X. Probablemente hay algo para hacerlo en Linux.

OSX tiene una utilidad " Audio MIDI setup " que me han dicho que permita que las señales MIDI se canalicen desde el dispositivo a localhost. (Tal vez esta es la razón por la cual ipMIDI para OS X es gratis?)

EDITAR: Acabo de descubrir que la configuración de Audio MIDI implementa RTP MIDI , que parece ser el mejor estándar para transmitir MIDI a través de una red (hace frente a redes con pérdidas).

Así que estoy bastante seguro de que la tarea se convierte en: ¿cómo implementar RTP MIDI en C # /. NET?

Pero tal vez haya alguna solución más fácil (pero menos poderosa), por ejemplo, alguna solución que solo funcione y reciba mensajes MIDI Note-ON de localhost en OSX.

Me gustaría mucho poder obtener una solución básica para la primera generación de mi aplicación, y luego reemplazarla con un componente robusto cuando tenga los medios.

Así que eso es todo lo que tengo, ¿alguien puede arreglar todo esto?

π

EDITAR: http://u3d.as/content/sta-blockhead/websocket-sharp-for-unity/4X4 ¿Podría ayudar esto?


Python es realmente maravilloso!

Esta secuencia de comandos envía un paquete UDP cada vez que se activa o desactiva una nota MIDI. Puedo capturar los paquetes UDP en Unity3D.

#!/usr/bin/python # https://github.com/superquadratic/rtmidi-python/ import rtmidi_python as rtmidi import time import socket def callback( data, time_stamp ): event, note, vel = data if event == 144: # note on/off endpoint = ( "127.0.0.1", 6500 ) MESSAGE = "%d, %f" % ( note, float(vel) / 127.0 ) print MESSAGE udp_socket = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) udp_socket.sendto( MESSAGE, endpoint ) def main( ): midi_in = rtmidi.MidiIn( ) midi_in.callback = callback midi_in.open_port( 0 ) # do something else here (but don''t quit) while True: time.sleep( 0.001 ) if __name__ == ''__main__'': main()