Я не робив жодного програмування MIDI протягом багатьох років, але ваша основна ідея дуже обгрунтована (не каламбур).
MIDI - це потік "подій" (або "повідомлень"), два найважливіші - "примітка до" та "примітка", які несуть із собою номер ноти (0 = C на п'ять октав нижче середнього C, через 127 = G на п’ять октав над G вище середнього С, напівтонами). Ці події мають "швидкісні" цифри на клавіатурах, які чутливі до швидкості ("чутливі до дотику") із силою (ви здогадалися) між 0 і 127.
Між швидкістю, акордом і педалями, я думаю, ви могли б придумати досить хороший інтерфейс для набору клавіш для фортепіано. Зокрема, акордування може бути дуже потужною технікою - як я вже згадував у коментарях, саме тому рядові стенографи можуть використовувати стенотипову машину, щоб не відставати від людей, що розмовляють годинами поспіль, коли навіть машиністи з вищого польоту не хочуть ' не зможете будь-який проміжок часу користуватися звичайними клавіатурами в машинці. Як і в машинній стенографії, вам знадобиться "словник" значень акордів і послідовностей акордів. (Чи можете ви сказати, що я працював у програмній частині машинної стенографії?)
Для цього основними елементами є:
- Отримання входу MIDI Не намагайтеся робити це самостійно, використовуйте бібліотеку. Редагувати : Мабуть, Java Sound API підтримує MIDI , включаючи отримання подій від MIDI-контролерів. Класно. Ця сторінка також може бути корисною.
- Перетворення цих даних у натискання клавіш, які ви хочете надіслати, наприклад, через згадуваний вище словник.
- Виведення натискань клавіш на комп'ютер.
Щоб максимально сумісна з програмним забезпеченням, вам доведеться писати це як драйвер клавіатури. Це плагін до операційної системи, який служить джерелом подій на клавіатурі, розмовляючи з базовим обладнанням (у вашому випадку клавіатурою фортепіано). Для Windows та Linux, ймовірно, ви хочете використовувати для цього C.
Однак, оскільки ви просто генеруєте натискання клавіш (не намагаючись їх перехопити, що я намагався зробити років тому), ви, можливо, зможете використовувати будь-які функції операційної системи для надсилання штучних натискань клавіш. У Windows є інтерфейс для цього (можливо, декілька, про який я думаю, SendInput
але я знаю, що є якийсь "журнальний" інтерфейс, який робить щось подібне), і я впевнений, що це роблять і інші операційні системи. Це може бути достатньо для ваших цілей - саме там я б почав, оскільки маршрут драйвера пристрою буде незручним, і вам, мабуть, доведеться використовувати іншу мову, ніж Java. (Я великий шанувальник Java, але інтерфейси, які операційні системи використовують для розмови з драйверами пристроїв, як правило, легше споживаються через C та подібні.)
Оновлення : докладніше про "словник" акордів до натискань клавіш:
По суті, словник - це трійка (спасибі, @Adam), яку ми шукаємо із збігом найдовших префіксів. Деталі:
У машинній стенографії стенограф пише одночасно натисканням декількох клавіш на стенотипній машині, потім випускаючи їх усіх. Вони називають це "обведенням" клавіатури; це як грати акорд на фортепіано. Штрихи часто (але не завжди) відповідають складові розмовної мови. Як і склади, іноді один штрих (акорд) має значення сам по собі, в іншому випадку він має лише значення в поєднанні з наступними штрихами. (Подумайте "добре" проти "добре", а потім "побачення"). Хоча на них буде сильно впливати школа, в якій вони навчалися, у кожного стенографа буде свій власний "словник" того, якими штрихами вони користуються для позначення чого, словником, який вони будуть постійно відточувати протягом свого трудового життя. У словнику будуть записи, де стенографічна частина ("коротко", коротко) - одна штриха або кілька штрихів. Часто буде кілька записів з однаковим початковим штрихом, які диференціюються за їх довжиною та наступними штрихами. Наприклад (і я тут не використовуватиму справжній стено, просто заповнювачі), можуть бути такі записи:
А = альфа
A / B = алфавіт
A / B / C = алфавітний
A / C = кондиціонер
В = бджола
B / C = тому що
С = море
D = собака
D / D = Ді Ді
(Ці букви не мають бути музичними нотами, а лише абстрактними маркерами.)
Зауважте, що A
починається кілька записів, а також зауважте, що спосіб перекладу C
штриха залежить від того, ви раніше бачили A
, a B
чи ви починаєте свіжим.
Також зауважте, що (хоча це не показано в дуже маленькому зразку вище), може бути кілька способів "відтворити" одне слово або фразу, а не лише один. Стенографи роблять це, щоб полегшити перехід від попереднього слова до наступного залежно від положення руки. Існує очевидна аналогія з музикою, і ви можете використовувати її, щоб зробити свій потік набору тексту більш схожим на відтворення музики, щоб запобігти негативному впливу на гру на фортепіано та збільшити ймовірність того, що це справді допоможе RSI.
Перекладаючи стено в стандартний текст, ми знову використовуємо пошук "збігу найдовших префіксів": алгоритм перекладу починається з першого написаного штриха, який коли-небудь написано, і шукає записи, починаючи з цього обведення. Якщо є лише один запис, і він триває один штрих, то ми можемо з упевненістю сказати "це запис, який потрібно використовувати", виведіть відповідний текст, а потім почніть свіжим із наступного обведення. Але ймовірніше, що інсульт запускає кілька записів різної тривалості. Отже, ми дивимось на наступний штрих і бачимо, чи є записи, які починаються з цих двох штрихів в порядку; і так далі, поки не отримаємо сірник.
Отже, зі словником вище, припустимо, ми побачили цю послідовність:
ACBBCABCABD
Ось як ми це переклали:
A
- початок трьох записів різної довжини; подивіться на наступний штрих:C
A/C
відповідає лише одному запису; виведіть "кондиціонер" і почніть свіжим із наступного обведення:B
B
починає два записи; подивіться на наступний штрих:B
B/B
не починає нічого; візьміть найдовший попередній збіг ( B
) і виведіть, що ("бджола")
- Маючи результат
B
= "бджола", ми все ще маємо B
обведення у своєму буфері. Він починає два записи, тому подивіться на наступний штрих:C
B/C
відповідає одному запису; виведіть "тому що" і почніть свіжим із наступного обведення:A
A
починає три записи; подивіться на наступний штрих:B
A/B
починає два записи; подивіться на наступний штрих:C
A/B/C
відповідає лише одному запису; виведіть "алфавіт" і почніть свіжим із наступного обведення:A
A
починає три записи; подивіться на наступний штрих:B
A/B
починає два записи; подивіться на наступний штрих:D
A/B/D
нічого не відповідає, тому візьміть найдовший попередній збіг ( A/B
) і використовуйте його для виведення "алфавіту". Це залишає нас із D
ще в буфері.
D
починається два записи, тому ми зазвичай дивимось на наступний штрих - але ми обробили всі штрихи, тому розглянемо це окремо. Окремо це перекладається як "собака", щоб вивести, що.
Аспекти зазначеного вище:
- У вас буфер штрихів, які ви прочитали, але ще не переклали.
- Ви завжди хочете співставити найбільш обриси проти одного запису, який можете.
A/B
слід перекладати як «алфавіт», а не «альфа» та «бджола».
- (Не показано вище) Можливо, у вас є послідовності штрихів, які ви не можете перекласти, оскільки вони нічого не відповідають словнику. (Стіно люди використовують іменник "неперекладений" - наприклад, у нашому словнику штрихи
E
були б "неперекладеними".)
- (Не показано вище) Деякі теорії стено дозволяють одному й тому ж штриху означати більше ніж одне, спираючись на більш широкий контекст. Люди стено називають ці "конфлікти". Ви, мабуть, хочете заборонити їх у своєму проекті, а насправді, коли стенограф використовував стенограф вручну, конфлікти були нормальні, оскільки вони могли знати, де саме в реченні вони були правильним вибором, але зі зростанням машинного перекладу, безконфліктні теорії стено виникли спеціально, щоб уникнути необхідності переглядати отриманий перекладений текст та «виправляти» конфлікти.
- Переклад у режимі реального часу (що ви б робили) означає, що якщо ви отримаєте часткову відповідність, ви захочете затриматися на ньому, чекаючи наступного акорду, але, ймовірно, лише до тайм-ауту, в який момент ви б перекладіть все, що є у буфері, якнайкраще. (Або, можливо, ви не хочете, щоб очікувати час; це ваш дзвінок.)
- Напевно, найкраще мати інсульт, який говорить про "зневагу до попереднього інсульту"
- Напевно, найкраще мати інсульт, який говорить "повністю очистити буфер, не виводячи нічого"