Nie robiłem żadnego programowania MIDI od lat, ale twoja podstawowa idea jest bardzo dobra (bez gry słów).
MIDI to strumień „zdarzeń” (lub „komunikatów”), z których dwa najbardziej podstawowe to „uwaga włączona” i „uwaga wyłączona”, które niosą ze sobą numer nuty (0 = C pięć oktaw poniżej środkowego C, przez 127 = G pięć oktaw powyżej G powyżej środkowego C, w półtonach). Te zdarzenia niosą liczbę „prędkości” na klawiaturach wrażliwych na prędkość („wrażliwych na dotyk”), z siłą (zgadłeś) między 0 a 127.
Pomiędzy prędkością, akordowaniem i pedałami, pomyślałem, że możesz wymyślić całkiem niezły interfejs do pisania na klawiaturze fortepianu. W szczególności nagrywanie może być bardzo potężną techniką - jak wspomniałem w komentarzach, dlatego stenografowie szeregowi mogą używać maszyny do stenotypii, aby nadążać za rozmowami przez wiele godzin z rzędu, nawet jeśli maszyniści z najwyższej półki nie chcieli być w stanie przez dowolny czas za pomocą zwykłych klawiatur w stylu maszyny do pisania. Podobnie jak w przypadku stenografii maszynowej, potrzebny byłby „słownik” znaczeń akordów i ich sekwencji. (Czy możesz powiedzieć, że pracowałem po stronie oprogramowania do stenografii maszynowej?)
Aby to zrobić, podstawowe elementy to:
- Odbieranie wejścia MIDI. Nie próbuj tego zrobić sam, skorzystaj z biblioteki. Edycja : Najwyraźniej Java Sound API obsługuje MIDI , w tym odbieranie zdarzeń od kontrolerów MIDI. Fajne. Ta strona może być również przydatna.
- Konwertowanie tych danych na naciśnięcia klawiszy, które chcesz wysłać, np. Poprzez słownik, o którym wspomniałem powyżej.
- Przesyłanie naciśnięć klawiszy do komputera.
Aby być jak najbardziej kompatybilnym z oprogramowaniem, musisz napisać to jako sterownik urządzenia klawiatury. Jest to wtyczka do systemu operacyjnego, która służy jako źródło zdarzeń na klawiaturze, rozmawiając z podstawowym sprzętem (w twoim przypadku z klawiaturą fortepianu). W systemach Windows i Linux prawdopodobnie będziesz chciał użyć do tego C.
Ponieważ jednak generujesz tylko naciśnięcia klawiszy (nie próbując ich przechwytywać, co próbowałem zrobić lata temu), możesz być w stanie korzystać z wszystkich funkcji systemu operacyjnego do wysyłania sztucznych naciśnięć klawiszy. Windows ma do tego interfejs (prawdopodobnie kilka, myślę o tym, SendInput
ale wiem, że jest jakiś interfejs „dziennika”, który robi coś podobnego), i jestem pewien, że robią to również inne systemy operacyjne. To może być wystarczające dla twoich celów - od tego chciałbym zacząć, ponieważ trasa sterownika urządzenia będzie niezręczna i prawdopodobnie będziesz musiał użyć innego języka niż Java. (Jestem wielkim fanem Javy, ale interfejsy używane przez systemy operacyjne do komunikowania się ze sterownikami urządzeń są zwykle łatwiejsze do użycia przez C i podobne).
Aktualizacja : Więcej informacji na temat „słownika” akordów po naciśnięciu klawisza:
Zasadniczo słownik jest trie (dzięki, @Adam), który wyszukujemy z najdłuższym dopasowaniem prefiksu. Detale:
W stenografii maszynowej stenograf pisze przez jednoczesne naciśnięcie wielu klawiszy na maszynie stenotypowej, a następnie zwolnienie ich wszystkich. Nazywają to „uderzeniem” klawiatury; to jak grać akord na pianinie. Pociągnięcia często (ale nie zawsze) odpowiadają sylabie języka mówionego. Podobnie jak sylaby, czasami jedno uderzenie (akord) ma znaczenie samo w sobie, innym razem ma znaczenie jedynie w połączeniu z kolejnymi pociągnięciami. (Pomyśl „dobry” vs. „dobry”, a następnie „pa”). Chociaż będzie pod dużym wpływem szkoły, w której studiowali, każdy stenograf będzie miał własny „słownik”, jakich uderzeń używają, co znaczy, słownik, który będą stale doskonalili w ciągu życia zawodowego. Słownik będzie zawierał wpisy, w których część stenograficzna (w skrócie „steno”) ma długość jednego pociągnięcia lub wiele pociągnięć. Często będzie kilka wpisów o tym samym skoku początkowym, które różnią się długością i kolejnymi pociągnięciami. Na przykład (i nie użyję tutaj prawdziwego steno, tylko symbole zastępcze), mogą występować następujące wpisy:
A = alfa
A / B = alfabet
A / B / C = alfabetycznie
A / C = klimatyzacja
B = pszczoła
B / C = ponieważ
C = morze
D = pies
D / D = Dee Dee
(Te litery nie mają być nutami, a jedynie abstrakcyjnymi znacznikami).
Pamiętaj, że A
rozpoczyna się wiele wpisów, a także, jak tłumaczysz C
obrys, zależy od tego, czy wcześniej widziałeś A
, a B
, czy zaczynasz od nowa.
Zauważ też, że (chociaż nie pokazano tego w bardzo małej próbce powyżej), może istnieć wiele sposobów „odtwarzania” tego samego słowa lub frazy, a nie tylko jednego. Stenografowie robią to, aby ułatwić przejście od poprzedniego słowa do następnego, w zależności od pozycji ręki. Istnieje oczywista analogia do muzyki i możesz jej użyć, aby Twój przepływ pisania był bardziej zbliżony do grania muzyki, aby zarówno zapobiec negatywnemu wpływowi na grę na pianinie, jak i zmaksymalizować prawdopodobieństwo, że rzeczywiście pomoże to w RSI.
Podczas tłumaczenia steno na tekst standardowy ponownie używamy wyszukiwania „dopasowanie najdłuższego prefiksu”: algorytm tłumaczenia rozpoczyna się od pierwszego napisanego skoku i szuka wpisów zaczynających się od tego skoku. Jeśli jest tylko jeden wpis i jego długość jest jednym pociągnięciem, możemy rzetelnie powiedzieć „to jest wpis do użycia”, wypisać odpowiedni tekst, a następnie zacząć od nowa od następnego pociągnięcia. Ale bardziej prawdopodobne, że obrys rozpoczyna wiele wpisów o różnej długości. Więc patrzymy na następny skok i sprawdzamy, czy są wpisy, które zaczynają się od tych dwóch pociągnięć w kolejności; i tak dalej, aż dostaniemy dopasowanie.
Załóżmy, że w powyższym słowniku widzimy następującą sekwencję:
ACBBCABCABD
Oto jak byśmy to przetłumaczyli:
A
jest początkiem trzech wpisów o różnej długości; spójrz na następny skok:C
A/C
dopasowuje tylko jeden wpis; wyjdź „klimatyzacja” i zacznij od nowa od następnego skoku:B
B
rozpoczyna dwa wpisy; spójrz na następny skok:B
B/B
nic nie uruchamia; weź najdłuższy poprzedni match ( B
) i wypisz, że („bee”)
- Mając output
B
= „bee”, nadal mamy B
uderzenie w buforze. Rozpoczyna dwa wpisy, więc spójrz na następny skok:C
B/C
pasuje do jednego wpisu; wypisz „ponieważ” i zacznij od nowa od następnego pociągnięcia:A
A
rozpoczyna trzy wpisy; spójrz na następny skok:B
A/B
rozpoczyna dwa wpisy; spójrz na następny skok:C
A/B/C
pasuje tylko do jednego wpisu; wypisz „alfabetycznie” i zacznij od nowa od następnego pociągnięcia:A
A
rozpoczyna trzy wpisy; spójrz na następny skok:B
A/B
rozpoczyna dwa wpisy; spójrz na następny skok:D
A/B/D
nic nie pasuje, więc weź najdłuższy poprzedni match ( A/B
) i użyj go do wypisania „alfabetu”. Pozostaje nam to D
nadal w buforze.
D
rozpoczyna dwa wpisy, więc normalnie patrzymy na następny skok - ale przetworzyliśmy wszystkie uderzenia, więc rozważ to osobno. W izolacji tłumaczy się to jako „pies”, więc wyprowadza to.
Aspekty powyższego, na które należy zwrócić uwagę:
- Masz bufor pociągnięć, które przeczytałeś, ale jeszcze nie tłumaczyłeś.
- Zawsze chcesz dopasować jak najwięcej uderzeń do jednego wpisu, jaki możesz.
A/B
należy tłumaczyć jako „alfabet”, a nie „alfa” i „pszczoła”.
- (Nie pokazano powyżej) Możesz mieć sekwencje pociągnięć, których nie możesz przetłumaczyć, ponieważ nie pasują one do niczego w słowniku. (Ludzie Steno używają rzeczownika „nieprzetłumaczone” - np. W naszym słowniku pociągnięcia
E
byłyby „nieprzetłumaczone”.)
- (Nie pokazano powyżej) Niektóre teorie steno pozwalają, aby ten sam zestaw uderzeń oznaczał więcej niż jedną rzecz w oparciu o szerszy kontekst. Ludzie Steno nazywają te „konflikty”. Prawdopodobnie chcesz je odrzucić w swoim projekcie, a w rzeczywistości, gdy stenograf był tłumaczony ręcznie przez stenografa, konflikty były w porządku, ponieważ wiedziałyby, gdzie w zdaniu są właściwym wyborem, ale wraz ze wzrostem tłumaczenia maszynowego, bezkonfliktowe teorie steno powstały specjalnie po to, aby uniknąć konieczności przeglądania powstałego przetłumaczonego tekstu i rozwiązywania konfliktów.
- Tłumaczenie w czasie rzeczywistym (co robisz) oznacza, że jeśli otrzymasz częściowe dopasowanie, będziesz chciał go przytrzymać, czekając na następny akord - ale prawdopodobnie tylko do limitu czasu, w którym to momencie przetłumacz to, co masz w buforze, najlepiej jak potrafisz. (A może nie chcesz mieć limitu czasu; to twój telefon.)
- Prawdopodobnie najlepiej mieć udar, który mówi „zignoruj poprzedni udar”
- Prawdopodobnie najlepiej mieć obrys, który mówi „całkowicie wyczyść bufor bez wysyłania czegokolwiek”