Ich habe seit Jahren keine MIDI-Programmierung mehr gemacht, aber Ihre Grundidee ist sehr solide (kein Wortspiel).
MIDI ist ein Strom von "Events" (oder "Messages"), wobei zwei der grundlegendsten "Note On" und "Note Off" sind, die die Notennummer mit sich führen (0 = C, fünf Oktaven unter dem mittleren C, bis 127 = G fünf Oktaven über dem G über dem mittleren C (in Halbtönen). Diese Ereignisse tragen eine "Geschwindigkeits" -Nummer auf Tastaturen, die geschwindigkeitsabhängig ("berührungsempfindlich") sind, mit einer Kraft von (Sie haben es erraten) zwischen 0 und 127.
Ich würde denken, dass Sie zwischen Velocity, Chording und Pedalen eine recht gute "Tipp" -Schnittstelle für die Klaviertastatur finden könnten. Insbesondere das Aufzeichnen könnte eine sehr leistungsfähige Technik sein - wie ich in den Kommentaren erwähnt habe, können einfache Stenographen eine Stenotyp-Maschine verwenden , um stundenlang hintereinander mit den Leuten Schritt zu halten, wenn selbst hochkarätige Schreibkräfte dies nicht tun würden. über normale Tastaturen im Schreibmaschinenstil für längere Zeit nicht möglich sein. Wie bei der Maschinenstenographie benötigen Sie ein "Wörterbuch" der Bedeutungen von Akkorden und Folgen von Akkorden. (Können Sie mir sagen, dass ich früher auf der Softwareseite der Maschinenstenographie gearbeitet habe?)
Dazu sind die grundlegenden Teile:
- MIDI-Eingang empfangen. Versuchen Sie nicht, dies selbst zu tun, sondern verwenden Sie eine Bibliothek. Bearbeiten : Anscheinend unterstützt die Java Sound API MIDI , einschließlich des Empfangs von Ereignissen von MIDI-Controllern. Cool. Diese Seite kann auch nützlich sein.
- Konvertieren dieser Daten in die Tastenanschläge, die Sie senden möchten, z. B. über das oben erwähnte Wörterbuch.
- Ausgabe der Tastenanschläge an den Computer.
Um mit Software bestmöglich kompatibel zu sein, müssen Sie dies als Tastaturgerätetreiber schreiben. Dies ist ein Plug-In für das Betriebssystem, das als Quelle für Tastaturereignisse dient und mit der zugrunde liegenden Hardware (in Ihrem Fall der Klaviertastatur) kommuniziert. Für Windows und Linux möchten Sie wahrscheinlich C dafür verwenden.
Da Sie jedoch nur Tastenanschläge generieren (und nicht versuchen, sie abzufangen, was ich vor Jahren versucht habe), können Sie möglicherweise alle Funktionen des Betriebssystems zum Senden künstlicher Tastenanschläge verwenden. Windows hat eine Schnittstelle dafür (wahrscheinlich mehrere, an die ich denke, SendInput
aber ich weiß, dass es eine "Journal" -Schnittstelle gibt, die etwas Ähnliches tut), und ich bin sicher, dass andere Betriebssysteme dies auch tun. Das könnte für Ihre Zwecke ausreichend sein - hier würde ich anfangen, da die Route des Gerätetreibers umständlich sein wird und Sie wahrscheinlich eine andere Sprache als Java verwenden müssten. (Ich bin ein großer Fan von Java, aber die Schnittstellen, über die Betriebssysteme mit Gerätetreibern kommunizieren, werden in der Regel leichter über C und ähnliches verwendet.)
Update : Mehr zum "Wörterbuch" von Akkorden zu Tastenanschlägen:
Grundsätzlich ist das Wörterbuch ein Versuch (danke, @Adam), den wir mit dem längsten Präfix suchen. Einzelheiten:
Bei der Maschinenstenographie schreibt der Stenograph, indem er mehrere Tasten gleichzeitig auf der Stenotypmaschine drückt und dann alle loslässt. Sie nennen dies einen "Strich" der Tastatur; Es ist, als würde man einen Akkord auf dem Klavier spielen. Striche entsprechen häufig (aber nicht immer) einer Silbe der gesprochenen Sprache. Wie bei Silben hat manchmal ein Strich (Akkord) eine eigene Bedeutung, manchmal hat er nur eine Bedeutung in Kombination mit folgenden Strichen. (Denken Sie "gut" gegen "gut", gefolgt von "tschüss"). Obwohl sie stark von der Schule beeinflusst werden, an der sie studiert haben, hat jeder Stenograph sein eigenes "Wörterbuch" darüber, mit welchen Strichen sie was meinen, ein Wörterbuch, das sie im Laufe ihres Arbeitslebens kontinuierlich verbessern werden. Das Wörterbuch enthält Einträge, bei denen der stenografische Teil (kurz "Steno") einen Strich lang oder mehrere Striche lang ist. Häufig gibt es mehrere Einträge mit demselben Starthub, die sich durch ihre Länge und die nachfolgenden Striche unterscheiden. Zum Beispiel (und ich werde hier kein echtes Steno verwenden, sondern nur Platzhalter) können folgende Einträge vorhanden sein:
A = Alpha
A / B = Alphabet
A / B / C = alphabetisch
A / C = Klimaanlage
B = Biene
B / C = weil
C = Meer
D = Hund
D / D = Dee Dee
(Diese Buchstaben sind nicht als Noten gedacht, sondern nur als abstrakte Markierungen.)
Beachten Sie, dass A
mehrere Einträge gestartet werden und dass die Art und Weise, wie Sie einen C
Strich übersetzen, davon abhängt, ob Sie zuvor einen A
, einen B
oder einen neuen gesehen haben.
Beachten Sie auch, dass es (obwohl in dem sehr kleinen Beispiel oben nicht gezeigt) mehrere Möglichkeiten gibt, dasselbe Wort oder dieselbe Phrase zu "spielen" und nicht nur eine. Stenographen tun dies, um je nach Handposition den Übergang von einem vorhergehenden Wort zum nächsten zu erleichtern. Es gibt dort eine offensichtliche Analogie zur Musik, und Sie könnten diese verwenden, um Ihren Schreibfluss dem Abspielen von Musik ähnlicher zu machen, um zu verhindern, dass sich dies negativ auf Ihr Klavierspiel auswirkt, und um die Wahrscheinlichkeit zu maximieren, dass dies tatsächlich beim RSI hilft.
Bei der Übersetzung von Steno in Standardtext verwenden wir erneut eine Suche nach "Übereinstimmungen mit dem längsten Präfix": Der Übersetzungsalgorithmus beginnt mit dem ersten jemals geschriebenen Strich und sucht nach Einträgen, die mit diesem Strich beginnen. Wenn es nur einen Eintrag gibt und dieser einen Strich lang ist, können wir zuverlässig sagen "das ist der zu verwendende Eintrag", den entsprechenden Text ausgeben und dann mit dem nächsten Strich neu beginnen. Wahrscheinlicher ist jedoch, dass dieser Strich mehrere Einträge unterschiedlicher Länge startet. Wir schauen uns also den nächsten Strich an und sehen, ob es Einträge gibt, die mit diesen beiden Strichen der Reihe nach beginnen. und so weiter, bis wir ein Match bekommen.
Nehmen wir also mit dem obigen Wörterbuch an, wir hätten diese Sequenz gesehen:
ACBBCABCABD
So würden wir es übersetzen:
A
ist der Beginn von drei Einträgen unterschiedlicher Länge; schau auf den nächsten Schlag:C
A/C
stimmt nur mit einem Eintrag überein; "Klimaanlage" ausgeben und mit dem nächsten Hub neu beginnen:B
B
startet zwei Einträge; schau auf den nächsten Schlag:B
B/B
fängt nichts an; nimm das längste vorherige Match ( B
) und gib das aus ("Biene")
- Mit output
B
= "bee" haben wir immer noch einen B
Strich in unserem Puffer. Es werden zwei Einträge gestartet. Schauen Sie sich also den nächsten Strich an:C
B/C
entspricht einem Eintrag; "weil" ausgeben und mit dem nächsten Strich neu beginnen:A
A
startet drei Einträge; schau dir den nächsten Strich an:B
A/B
startet zwei Einträge; schau dir den nächsten Strich an:C
A/B/C
stimmt nur mit einem Eintrag überein; Geben Sie "alphabetisch" aus und beginnen Sie neu mit dem nächsten Strich:A
A
startet drei Einträge; schau auf den nächsten Schlag:B
A/B
startet zwei Einträge; schau auf den nächsten Schlag:D
A/B/D
passt zu nichts, also nimm die längste vorherige Übereinstimmung ( A/B
) und verwende sie, um "Alphabet" auszugeben. Das lässt uns D
noch im Puffer.
D
Startet zwei Einträge, sodass wir normalerweise den nächsten Strich betrachten würden - aber wir haben alle Striche verarbeitet, betrachten Sie ihn also isoliert. Für sich bedeutet es "Hund", also geben Sie das aus.
Aspekte der oben genannten zu beachten:
- Sie haben einen Puffer mit Strichen, die Sie gelesen, aber noch nicht übersetzt haben.
- Sie möchten immer die meisten Striche mit einem einzelnen Eintrag abgleichen, den Sie können.
A/B
sollte als "Alphabet" übersetzt werden, nicht als "Alpha" und "Biene".
- (Oben nicht gezeigt) Möglicherweise haben Sie Strichfolgen, die Sie nicht übersetzen können, da sie mit nichts im Wörterbuch übereinstimmen. (Steno-Leute verwenden das Substantiv "untranslate" - z. B.
E
wären bei unserem Wörterbuch die Striche "untranslate".)
- (Oben nicht gezeigt) Einige Steno-Theorien erlauben, dass derselbe Satz von Strichen mehr als eine Sache bedeutet, basierend auf einem breiteren Kontext. Steno-Leute nennen diese "Konflikte". Sie möchten sie wahrscheinlich in Ihrem Projekt nicht zulassen, und als Steno vom Stenographen manuell übersetzt wurde, waren Konflikte in Ordnung, weil sie genau wussten, wo im Satz sie die richtige Wahl waren, aber mit dem Aufstieg Bei der maschinellen Übersetzung entstanden konfliktfreie Steno-Theorien, um zu vermeiden, dass der resultierende übersetzte Text durchgearbeitet und Konflikte "behoben" werden müssen.
- In Echtzeit zu übersetzen (was Sie tun würden) bedeutet, dass Sie, wenn Sie eine Teilübereinstimmung erhalten, diese beibehalten möchten, während Sie auf den nächsten Akkord warten - aber wahrscheinlich nur bis zu einer Zeitüberschreitung, zu welchem Zeitpunkt Sie dies tun würden Übersetzen Sie das, was Sie im Puffer haben, so gut Sie können. (Oder vielleicht möchten Sie keine Auszeit; es ist Ihr Anruf.)
- Wahrscheinlich am besten einen Schlaganfall mit der Aufschrift "Ignorieren Sie den vorherigen Schlaganfall".
- Wahrscheinlich am besten einen Strich mit der Aufschrift "Löschen Sie den Puffer vollständig, ohne etwas auszugeben".