Je n'ai pas fait de programmation MIDI depuis des années, mais votre idée fondamentale est très saine (sans jeu de mots).
Le MIDI est un flux d '"événements" (ou "messages"), deux des plus fondamentaux étant "note on" et "note off" qui portent avec eux le numéro de note (0 = C cinq octaves en dessous du do moyen, jusqu'à 127 = G cinq octaves au-dessus du G au-dessus du do moyen, en demi-tons). Ces événements portent un numéro de "vélocité" sur les claviers sensibles à la vélocité ("tactile"), avec une force (vous l'avez deviné) comprise entre 0 et 127.
Entre la vélocité, les accords et les pédales, je pense que vous pourriez trouver une assez bonne interface de "frappe" pour le clavier de piano. Les accords en particulier pourraient être une technique très puissante - comme je l'ai mentionné dans les commentaires, c'est pourquoi les sténographes de rang peuvent utiliser une machine à sténotypes pour suivre les gens qui parlent pendant des heures d'affilée, alors que même les dactylographes de haut niveau ne le feraient pas '' t être en mesure de n'importe quelle durée via des claviers de style machine à écrire normaux. Comme pour la sténographie machine, vous auriez besoin d'un "dictionnaire" des significations des accords et des séquences d'accords. (Pouvez-vous dire que je travaillais dans le domaine logiciel de la sténographie de la machine?)
Pour ce faire, les pièces fondamentales sont:
- Réception d'une entrée MIDI. N'essayez pas de le faire vous-même, utilisez une bibliothèque. Modifier : Apparemment, l'API Java Sound prend en charge le MIDI , y compris la réception d'événements des contrôleurs MIDI. Cool. Cette page peut également être utile.
- Conversion de ces données dans les frappes que vous souhaitez envoyer, par exemple via le dictionnaire que j'ai mentionné ci-dessus.
- Sortie des frappes sur l'ordinateur.
Pour être le plus largement compatible avec les logiciels, vous devez l'écrire en tant que pilote de périphérique clavier. Il s'agit d'un plug-in pour le système d'exploitation qui sert de source pour les événements de clavier, parlant au matériel sous-jacent (dans votre cas, le clavier de piano). Pour Windows et Linux, vous voudrez probablement utiliser C pour cela.
Cependant, comme vous ne faites que générer des frappes (sans essayer de les intercepter, ce que j'essayais de faire il y a des années), vous pouvez peut-être utiliser toutes les fonctionnalités du système d'exploitation pour envoyer des frappes artificielles. Windows a une interface pour le faire (probablement plusieurs, celle à laquelle je pense, SendInput
mais je sais qu'il existe une interface "journal" qui fait quelque chose de similaire), et je suis sûr que d'autres systèmes d'exploitation font de même. Cela pourrait bien être suffisant pour vos besoins - c'est là que je commencerais, car la route du pilote de périphérique va être maladroite et vous devrez probablement utiliser un langage différent pour Java que Java. (Je suis un grand fan de Java, mais les interfaces que les systèmes d'exploitation utilisent pour parler aux pilotes de périphériques ont tendance à être plus facilement consommées via C et similaires.)
Mise à jour : En savoir plus sur le "dictionnaire" des accords aux frappes:
Fondamentalement, le dictionnaire est un trie (merci, @Adam) que nous recherchons avec la correspondance du préfixe le plus long. Détails:
Dans la sténographie machine, le sténographe écrit en appuyant simultanément sur plusieurs touches de la machine sténotype, puis en les relâchant toutes. Ils appellent cela un "coup" du clavier; c'est comme jouer un accord au piano. Les coups correspondent souvent (mais pas toujours) à une syllabe de la langue parlée. Comme les syllabes, parfois un trait (accord) a un sens à lui tout seul, d'autres fois il n'a qu'un sens combiné avec les traits suivants. (Pensez "bien" vs "bien" suivi de "au revoir"). Bien qu'ils soient fortement influencés par l'école dans laquelle ils ont étudié, chaque sténographe aura son propre "dictionnaire" des coups qu'ils utilisent pour signifier quoi, un dictionnaire qu'ils perfectionneront continuellement au cours de leur vie professionnelle. Le dictionnaire aura des entrées où la partie sténographique ("sténo", pour faire court) est longue d'un trait ou longue. Fréquemment, il y aura plusieurs entrées avec le même coup de départ qui sont différenciées par leur longueur et par les coups suivants. Par exemple (et je n'utiliserai pas de véritable sténo ici, juste des espaces réservés), il peut y avoir ces entrées:
A = alpha
A / B = alphabet
A / B / C = alphabétique
A / C = climatisation
B = abeille
B / C = parce
C = mer
D = chien
D / D = Dee Dee
(Ces lettres ne sont pas censées être des notes de musique, juste des marqueurs abstraits.)
Notez que A
démarre plusieurs entrées, et notez également que la façon dont vous traduisez un C
trait dépend de si vous avez déjà vu un A
, un B
ou un nouveau départ.
Notez également que (bien que cela ne soit pas illustré dans le très petit exemple ci-dessus), il peut y avoir plusieurs façons de "jouer" le même mot ou la même phrase, plutôt qu'une seule. Les sténographes font cela pour faciliter le passage d'un mot précédent au suivant selon la position de la main. Il y a une analogie évidente avec la musique, et vous pouvez l'utiliser pour rendre votre flux de frappe plus proche de la lecture de musique, afin à la fois d'éviter que cela n'affecte négativement votre jeu de piano et de maximiser la probabilité que cela aide réellement avec le RSI.
Lors de la traduction de sténo en texte standard, nous utilisons à nouveau une recherche de «correspondance du préfixe le plus long»: l'algorithme de traduction commence par le premier trait jamais écrit et recherche les entrées commençant par ce trait. S'il n'y a qu'une seule entrée et qu'elle est longue d'un trait, alors nous pouvons dire de manière fiable "c'est l'entrée à utiliser", sortir le texte correspondant, puis recommencer à zéro avec le trait suivant. Mais plus probablement, ce trait démarre plusieurs entrées de longueurs variables. Nous regardons donc le coup suivant et voyons s'il y a des entrées qui commencent par ces deux coups dans l'ordre; et ainsi de suite jusqu'à ce que nous obtenions un match.
Donc, avec le dictionnaire ci-dessus, supposons que nous ayons vu cette séquence:
ACBBCABCABD
Voici comment nous le traduirions:
A
est le début de trois entrées de longueurs variables; regardez le coup suivant:C
A/C
correspond à une seule entrée; sortie "climatisation" et recommencez à zéro avec le coup suivant:B
B
démarre deux entrées; regardez le coup suivant:B
B/B
ne démarre rien; prendre la correspondance précédente ( B
) la plus longue et la sortie ("abeille")
- Ayant output
B
= "bee", nous avons encore un B
trait dans notre tampon. Il démarre deux entrées, alors regardez le coup suivant:C
B/C
correspond à une entrée; sortir "parce que" et recommencer à zéro avec le coup suivant:A
A
commence trois entrées; regardez le coup suivant:B
A/B
démarre deux entrées; regardez le coup suivant:C
A/B/C
ne correspond qu'à une entrée; sortie "alphabétique" et recommencez avec le coup suivant:A
A
commence trois entrées; regardez le coup suivant:B
A/B
démarre deux entrées; regardez le coup suivant:D
A/B/D
ne correspond à rien, alors prenez la plus longue correspondance précédente ( A/B
) et utilisez-la pour sortir "alphabet". Cela nous laisse D
encore dans le tampon.
D
commence deux entrées, donc nous devrions normalement regarder le coup suivant - mais nous avons traité tous les coups, alors considérez-le isolément. Isolément, cela se traduit par "chien", donc sortez cela.
Aspects de ce qui précède à noter:
- Vous avez un tampon de traits que vous avez lu mais que vous n'avez pas encore traduit.
- Vous voulez toujours faire correspondre le plus de coups à une seule entrée possible.
A/B
devrait être traduit par "alphabet", pas "alpha" et "abeille".
- (Non illustré ci-dessus) Vous pouvez très bien avoir des séquences de traits que vous ne pouvez pas traduire, car ils ne correspondent à rien dans le dictionnaire. (Les personnes sténo utilisent le nom "non traduit" - par exemple, avec notre dictionnaire, les traits
E
seraient un "non traduit".)
- (Non illustré ci-dessus) Certaines théories du sténo permettent à un même ensemble de traits de signifier plus d'une chose, en fonction d'un contexte plus large. Les Sténon appellent ces «conflits». Vous voulez probablement les interdire dans votre projet, et en fait, lorsque sténo était traduit manuellement par le sténographe, les conflits allaient bien car ils savaient exactement par où, dans la phrase, ils étaient le bon choix, mais avec la montée en puissance de la traduction automatique, des théories sans conflit sur la sténographie sont apparues spécifiquement pour éviter d'avoir à parcourir le texte traduit et à "résoudre" les conflits.
- La traduction en temps réel (ce que vous feriez) signifie que si vous recevez une correspondance partielle, vous voudrez la conserver en attendant le prochain accord - mais probablement seulement jusqu'à un délai d'attente, auquel moment vous traduisez le mieux possible ce que vous avez dans le tampon. (Ou peut-être que vous ne voulez pas de délai d'attente; c'est votre appel.)
- Il est probablement préférable d'avoir un accident vasculaire cérébral qui dit "ne pas tenir compte de l'accident vasculaire cérébral précédent"
- Il est probablement préférable d'avoir un trait qui dit "effacer complètement le tampon sans rien sortir"