No he hecho ninguna programación MIDI en años, pero su idea fundamental es muy sólida (sin juego de palabras).
MIDI es una secuencia de "eventos" (o "mensajes"), dos de los más fundamentales son "note on" y "note off" que llevan consigo el número de nota (0 = C cinco octavas por debajo de C central, hasta 127 = G cinco octavas por encima de la G por encima de la C central, en semitonos). Estos eventos llevan un número de "velocidad" en los teclados que son sensibles a la velocidad ("sensibles al tacto"), con una fuerza de (lo adivinó) entre 0 y 127.
Entre la velocidad, los acordes y los pedales, creo que podrías encontrar una interfaz de "tipeo" bastante buena para el teclado del piano. El cordaje en particular podría ser una técnica muy poderosa: como mencioné en los comentarios, es por eso que los taquígrafos de base pueden usar una máquina de estenotipos para mantenerse al día con las personas que hablan durante horas seguidas, cuando incluso los mecanógrafos de alto nivel no lo harían No podrá hacerlo por ningún período de tiempo a través de teclados de estilo de máquina de escribir normales. Al igual que con la estenografía de máquina, necesitaría un "diccionario" de los significados de los acordes y secuencias de acordes. (¿Puedes decir que solía trabajar en el lado del software de la estenografía de máquina?)
Para hacer esto, las piezas fundamentales son:
- Recibiendo entrada MIDI. No intentes hacer esto tú mismo, usa una biblioteca. Editar : Aparentemente, la API de sonido Java admite MIDI , incluida la recepción de eventos desde controladores MIDI. Frio. Esta página también puede ser útil.
- Convertir esos datos en las pulsaciones de teclas que desea enviar, por ejemplo, a través del diccionario que mencioné anteriormente.
- Salida de las pulsaciones de teclas a la computadora.
Para ser más ampliamente compatible con el software, tendría que escribir esto como un controlador de dispositivo de teclado. Este es un complemento para el sistema operativo que sirve como fuente para los eventos del teclado, hablando con el hardware subyacente (en su caso, el teclado del piano). Para Windows y Linux, probablemente querrás usar C para eso.
Sin embargo, dado que solo está generando pulsaciones de teclas (no tratando de interceptarlas, lo que intentaba hacer hace años), es posible que pueda usar cualquier función que tenga el sistema operativo para enviar pulsaciones de teclas artificiales. Windows tiene una interfaz para hacerlo (probablemente varias, la que estoy pensando es, SendInput
pero sé que hay una interfaz de "diario" que hace algo similar), y estoy seguro de que otros sistemas operativos también lo hacen. Eso puede ser suficiente para sus propósitos: es donde comenzaría, porque la ruta del controlador del dispositivo será incómoda y probablemente tenga que usar un lenguaje diferente al de Java. (Soy un gran admirador de Java, pero las interfaces que utilizan los sistemas operativos para comunicarse con los controladores de dispositivos tienden a consumirse más fácilmente a través de C y similares).
Actualización : Más sobre el "diccionario" de acordes a pulsaciones de teclas:
Básicamente, el diccionario es un trie (gracias, @Adam) que buscamos con la coincidencia de prefijo más largo. Detalles:
En la estenografía de la máquina, el taquígrafo escribe presionando varias teclas en la máquina de estenotipos al mismo tiempo, luego soltándolas todas. Llaman a esto un "golpe" del teclado; Es como tocar un acorde en el piano. Los trazos con frecuencia (pero no siempre) corresponden a una sílaba del lenguaje hablado. Al igual que las sílabas, a veces un trazo (acorde) tiene significado por sí solo, otras veces solo tiene un significado combinado con los siguientes trazos. (Piense "bueno" versus "bueno" seguido de "adiós"). Aunque estarán fuertemente influenciados por la escuela en la que estudiaron, cada taquígrafo tendrá su propio "diccionario" de los trazos que usan para decir qué, un diccionario que perfeccionarán continuamente a lo largo de su vida laboral. El diccionario tendrá entradas en las que la parte estenográfica ("steno", para abreviar) tiene una longitud de un trazo o múltiples trazos. Con frecuencia, habrá varias entradas con el mismo trazo de inicio que se diferencian por su longitud y por los trazos posteriores. Por ejemplo (y no usaré steno real aquí, solo marcadores de posición), puede haber estas entradas:
A = alfa
A / B = alfabeto
A / B / C = alfabético
A / C = aire acondicionado
B = abeja
B / C = porque
C = mar
D = perro
D / D = Dee Dee
(Esas letras no están destinadas a ser notas musicales, solo marcadores abstractos).
Tenga en cuenta que A
comienza varias entradas, y también tenga en cuenta que la forma en que traduce un C
trazo depende de si ha visto previamente un A
, un B
o si está comenzando de nuevo.
También tenga en cuenta que (aunque no se muestra en la pequeña muestra anterior), puede haber múltiples formas de "reproducir" la misma palabra o frase, en lugar de solo una. Los taquígrafos hacen eso para facilitar el flujo de una palabra anterior a la siguiente según la posición de la mano. Hay una analogía obvia con la música allí, y podría usarla para hacer que su escritura fluya más parecida a la reproducción de música, a fin de evitar que esto afecte negativamente su piano y maximizar la probabilidad de que esto realmente ayude con el RSI.
Cuando traducimos steno en texto estándar, nuevamente utilizamos una búsqueda de "coincidencia de prefijo más largo": el algoritmo de traducción comienza con el primer trazo escrito y busca entradas que comiencen con ese trazo. Si solo hay una entrada, y es un trazo largo, entonces podemos decir "esa es la entrada a usar", generar el texto correspondiente y luego comenzar de nuevo con el siguiente trazo. Pero lo más probable es que ese trazo inicie múltiples entradas de diferentes longitudes. Así que miramos el siguiente trazo y vemos si hay entradas que comienzan con esos dos trazos en orden; y así sucesivamente hasta que tengamos una coincidencia.
Entonces, con el diccionario anterior, supongamos que vimos esta secuencia:
ACBBCABCABD
Así es como lo traduciríamos:
A
es el comienzo de tres entradas de diferentes longitudes; mira el siguiente golpe:C
A/C
solo coincide con una entrada; salida "aire acondicionado" y comenzar de nuevo con el siguiente golpe:B
B
comienza dos entradas; mira el siguiente golpe:B
B/B
no comienza nada; tomar la coincidencia anterior más larga ( B
) y generar esa ("abeja")
- Tener salida
B
= "abeja", todavía tenemos un B
trazo en nuestro búfer. Comienza dos entradas, así que mira el siguiente trazo:C
B/C
coincide con una entrada; salida "porque" y comenzar de nuevo con el siguiente golpe:A
A
comienza tres entradas; mira el siguiente golpe:B
A/B
comienza dos entradas; mira el siguiente golpe:C
A/B/C
solo coincide con una entrada; salida "alfabético" y comenzar de nuevo con el siguiente trazo:A
A
comienza tres entradas; mira el siguiente golpe:B
A/B
comienza dos entradas; mira el siguiente golpe:D
A/B/D
no coincide con nada, así que toma la coincidencia anterior más larga ( A/B
) y úsala para generar "alfabeto". Eso nos deja con D
todavía en el búfer.
D
comienza dos entradas, por lo que normalmente miraríamos el siguiente trazo, pero hemos procesado todos los trazos, así que considérelo de forma aislada. En forma aislada, se traduce como "perro", por lo que da como resultado.
Aspectos de lo anterior a tener en cuenta:
- Tiene un búfer de trazos que ha leído pero que aún no ha traducido.
- Siempre desea hacer coincidir la mayor cantidad de golpes contra una sola entrada que pueda.
A/B
debe traducirse como "alfabeto", no "alfa" y "abeja".
- (No se muestra arriba) Es posible que tenga secuencias de trazos que no puede traducir, porque no coinciden con nada en el diccionario. (La gente de Steno usa el sustantivo "no traducir" - por ejemplo, con nuestro diccionario, los trazos
E
serían un "no traducir").
- (No se muestra arriba) Algunas teorías de steno permiten que el mismo conjunto de trazos signifique más de una cosa, según un contexto más amplio. La gente de Steno llama a estos "conflictos". Probablemente desee no permitirlos en su proyecto, y de hecho, cuando steno solía ser traducido manualmente por el taquígrafo, los conflictos estaban bien porque sabían exactamente en qué parte de la oración eran cuál era la opción correcta, pero con el aumento de la traducción automática, surgieron teorías de steno libres de conflictos específicamente para evitar tener que pasar por el texto traducido resultante y "solucionar" los conflictos.
- La traducción en tiempo real (que estaría haciendo) significa que si recibe una coincidencia parcial, querrá retenerla mientras espera el próximo acorde, pero probablemente solo hasta un tiempo de espera, momento en el que traduce lo que tienes en el búfer lo mejor que puedas. (O tal vez no quieres un tiempo de espera; es tu decisión).
- Probablemente sea mejor tener un derrame cerebral que diga "ignorar el derrame cerebral anterior"
- Probablemente sea mejor tener un trazo que diga "borrar completamente el búfer sin generar nada"