2012-06-01 9 views
5

He estado jugando con la creación de sonidos usando funciones de onda matemáticas en C. El siguiente paso en mi proyecto está recibiendo la entrada del usuario desde un teclado controlador MIDI con el fin de modular las ondas a diferentes lanzamientos.C Linux dispositivo de programación - Lectura Directamente desde/dev

Mi primera idea era que esto sería relativamente simple y que Linux, siendo Linux, me permitiría leer el flujo de datos en bruto desde mi dispositivo como lo haría con cualquier otro archivo.

Sin embargo, la investigación abrumadoramente aconseja que escribo un controlador de dispositivo para el controlador MIDI. La idea general es que, aunque el archivo del dispositivo esté presente, el kernel no sabrá qué llamadas al sistema ejecutar cuando mi aplicación llame a funciones como read() y write().

A pesar de estas advertencias, hice un experimento. Conecté el controlador MIDI y recibí el archivo del dispositivo "/ dev/midi1". Apareció un flujo constante de caracteres nulos, y cuando presioné una tecla en el controlador MIDI, aparecieron varios bytes correspondientes a los fragmentos de mensajes esperados que debería emitir un dispositivo MIDI. MIDI Protocol Info

Así que mis preguntas son:

¿Por qué la corriente cat'ed se comportan de esta manera?

¿Esto significa que ya hay un controlador de dispositivo plug-and-play instalado en mi sistema?

¿Debo seguir adelante y escribir un controlador de dispositivo, o puedo salir con la lectura como un archivo?

Gracias de antemano por compartir su sabiduría en estas áreas.

+0

en lugar de hacerlo, le recomendaría que lea() el dispositivo de un programa 'C'. Dice que está viendo datos "válidos", ¿por qué no está seguro? Por cierto, ya debe haber un controlador de dispositivo allí, de lo contrario no tendrías un archivo de dispositivo, ni habría una manera de acceder a él. – KevinDTimm

Respuesta

5

¿Por qué la secuencia cat'ed se comporta de esta manera?

Porque es presumiblemente la información MIDI sin formato que está recibiendo el controlador. Los bytes nulos son probablemente una especie de tic de sincronización.

¿Esto significa que ya hay un controlador de dispositivo Plug and Play instalado en mi sistema?

Sí.

Sin embargo, la investigación abrumadoramente informa que escribo un controlador de dispositivo para el controlador MIDI. La idea general es que, aunque el archivo del dispositivo esté presente, el kernel no sabrá qué llamadas al sistema ejecutar cuando mi aplicación llame a funciones como read() y write().

< ...>

¿Debo seguir adelante y escribir un controlador de dispositivo, o puedo salir con la lectura como un archivo?

No estoy seguro de lo que estás leyendo o de cómo llegas a esta conclusión, pero está mal. :) Ya tienes un controlador perfectamente bueno instalado para tu controlador MIDI: ¡sigue adelante y úsalo!

2

¿Seguro que está leyendo NUL bytes? Y no 0xf8 bytes? Porque 0xf8 es el estado de marca de tiempo MIDI y generalmente se envía periódicamente para mantener los instrumentos sincronizados.Trate de leer el dispositivo utilizando od:

od -vtx1 /dev/midi1 

Si usted está viendo un montón de 0xF8, está bien. Si no necesita la información de tempo enviada por su controlador MIDI, desactívela en su controlador o ignore esos bytes de estado 0xf8.

Además, para MIDI, tenga en cuenta que el estado MIDI actual generalmente se envía una vez (para guardar en bytes) y luego los bytes de la carga siguen durante el tiempo que sea necesario. Por ejemplo, el estado de inflexión de tono es byte 0xeK (donde K es el número de canal, es decir, de 0 a 15) y su carga útil es de 7 bits del byte menos significativo seguido de 7 bits de los bytes más significativos. Por lo tanto, tal vez tengas un controlador raro y veas solo cargas repetidas de algún estado, pero cualquier controlador que no sea estúpido no repetirá lo que no necesita.

Ahora para el controlador: eche un vistazo a dmesg cuando conecte su controlador MIDI. Ahora si su OSS /dev/midi1aparece cuando conecta su dispositivo (udev está haciendo este trabajo), y dmesg no dispara ningún error, no necesita nada más. El protocolo MIDI es aún otro protocolo en serie que tiene una velocidad de transmisión fija y transmite/recibe bytes. No hay nada complicado en eso ... solo lea o escriba en el dispositivo y listo.

El único problema es que hacer cola en algún lugar podría provocar una mala latencia de audio (si está utilizando los comandos MIDI para controlar el audio en vivo, que creo que es lo que está haciendo). Parece que esos dispositivos están hechos principalmente para mensajes exclusivos del sistema, es decir, por ejemplo, descargar algunos parches/presets para un sintetizador en línea y cargarlos en el dispositivo usando MIDI. La latencia realmente no importa en esta situación.

También eche un vistazo a ALSA way de jugar con MIDI en Linux.

1

Si no está desarrollando un nuevo hardware de controlador MIDI, no debe preocuparse por escribir un controlador para ello. Es la preocupación del usuario la instalación de su hardware y la obligación del proveedor de suministrar los controladores.

En Linux, acaba de leer el archivo. Ahora para interpretar y hacer cosas útiles con los datos.

Cuestiones relacionadas