Saya sudah bertahun-tahun tidak melakukan pemrograman MIDI, tetapi ide dasar Anda sangat bagus (tidak ada kata-kata).
MIDI adalah aliran "peristiwa" (atau "pesan"), dua yang paling mendasar adalah "note on" dan "note off" yang membawa serta nomor note (0 = C lima oktaf di bawah C tengah, melalui 127 = G lima oktaf di atas G di atas C tengah, dalam semi-nada). Peristiwa ini membawa nomor "kecepatan" pada keyboard yang peka terhadap kecepatan ("peka sentuhan"), dengan kekuatan (Anda dapat menebaknya) antara 0 dan 127.
Antara kecepatan, chording, dan pedal, saya pikir Anda bisa membuat antarmuka "mengetik" yang bagus untuk keyboard piano. Chording khususnya bisa menjadi teknik yang sangat kuat - seperti yang saya sebutkan di komentar, itu sebabnya stenograf peringkat-dan-file dapat menggunakan mesin stenotipe untuk bersaing dengan orang-orang yang berbicara selama berjam-jam berturut-turut, ketika bahkan juru ketik papan atas tidak akan t dapat untuk waktu yang lama melalui keyboard gaya-mesin tik normal. Seperti halnya stenografi mesin, Anda membutuhkan "kamus" tentang arti akor dan urutan akor. (Dapatkah Anda memberi tahu saya dulu bekerja di sisi perangkat lunak stenografi mesin?)
Untuk melakukan ini, bagian mendasarnya adalah:
- Menerima input MIDI. Jangan mencoba melakukan ini sendiri, gunakan perpustakaan. Sunting : Rupanya, Java Sound API mendukung MIDI , termasuk menerima acara dari pengontrol MIDI. Keren. Halaman ini mungkin juga bermanfaat.
- Mengubah data itu menjadi penekanan tombol yang ingin Anda kirim, misalnya melalui kamus yang saya sebutkan di atas.
- Mengeluarkan penekanan tombol ke komputer.
Agar kompatibel dengan perangkat lunak secara luas, Anda harus menulis ini sebagai driver perangkat keyboard. Ini adalah plug-in ke sistem operasi yang berfungsi sebagai sumber untuk acara keyboard, berbicara dengan perangkat keras yang mendasarinya (dalam kasus Anda, keyboard piano). Untuk Windows dan Linux, Anda mungkin ingin menggunakan C untuk itu.
Namun, karena Anda hanya menghasilkan penekanan tombol (tidak mencoba mencegatnya, yang saya coba lakukan bertahun-tahun yang lalu), Anda mungkin dapat menggunakan fitur apa pun yang dimiliki sistem operasi untuk mengirim penekanan tombol buatan. Windows memiliki antarmuka untuk melakukan itu (mungkin beberapa, yang saya pikirkan adalah SendInput
tetapi saya tahu ada beberapa antarmuka "jurnal" yang melakukan hal serupa), dan saya yakin sistem operasi lain juga melakukannya. Itu mungkin cukup untuk tujuan Anda - di sinilah saya mulai, karena rute driver perangkat akan menjadi canggung dan Anda mungkin harus menggunakan bahasa yang berbeda untuk itu daripada Jawa. (Saya penggemar berat Java, tetapi antarmuka yang digunakan sistem operasi untuk berbicara dengan driver perangkat cenderung lebih mudah dikonsumsi melalui C dan sejenisnya.)
Perbarui : Lebih lanjut tentang "kamus" akor untuk penekanan tombol:
Pada dasarnya, kamus adalah trie (terima kasih, @Adam) yang kami cari dengan pencocokan awalan terlama. Detail:
Dalam stenografi mesin, stenografer menulis dengan menekan beberapa tombol pada mesin stenotype secara bersamaan, lalu melepaskan semuanya. Mereka menyebut ini "stroke" dari keyboard; itu seperti memainkan akor pada piano. Stroke sering (tetapi tidak selalu) sesuai dengan suku kata bahasa yang diucapkan. Seperti suku kata, terkadang satu pukulan (akor) memiliki makna sendiri, di lain waktu hanya memiliki makna yang dikombinasikan dengan stroke berikut. (Pikirkan "baik" vs "baik" diikuti oleh "selamat tinggal"). Meskipun mereka akan sangat dipengaruhi oleh sekolah tempat mereka belajar, stenografer masing-masing akan memiliki "kamus" mereka sendiri dari apa stroke yang mereka gunakan untuk berarti apa, kamus mereka akan terus mengasah selama masa kerja mereka. Kamus akan memiliki entri di mana bagian stenografis ("steno", singkatnya) panjangnya satu pukulan, atau panjang beberapa kali pukulan. Seringkali, akan ada beberapa entri dengan stroke awal yang sama yang dibedakan oleh panjangnya dan oleh stroke berikutnya. Misalnya (dan saya tidak akan menggunakan steno nyata di sini, hanya placeholder), mungkin ada entri ini:
A = alpha
A / B = alfabet
A / B / C = alfabet
A / C = AC
B = lebah
B / C = karena
C = laut
D = anjing
D / D = Dee Dee
(Surat-surat itu tidak dimaksudkan sebagai catatan musik, hanya penanda abstrak.)
Perhatikan bahwa A
mulai banyak entri, dan juga perhatikan bahwa cara Anda menerjemahkan C
stroke tergantung pada apakah Anda sebelumnya melihat A
, a B
, atau Anda baru mulai.
Perhatikan juga bahwa (walaupun tidak ditunjukkan dalam sampel sangat kecil di atas), mungkin ada beberapa cara untuk "memainkan" kata atau frasa yang sama, daripada hanya satu. Stenografer melakukan itu untuk membuatnya lebih mudah mengalir dari kata sebelumnya ke yang berikutnya tergantung pada posisi tangan. Ada analogi yang jelas dengan musik di sana, dan Anda bisa menggunakannya untuk membuat alur pengetikan Anda lebih mirip dengan bermain musik, untuk mencegah hal ini memengaruhi secara negatif pada bermain piano Anda dan untuk memaksimalkan kemungkinan ini benar-benar membantu RSI.
Saat menerjemahkan steno ke teks standar, sekali lagi kami menggunakan pencarian "pencocokan awalan terpanjang": Algoritma penerjemahan dimulai dengan stroke pertama yang pernah ditulis, dan mencari entri yang dimulai dengan stroke itu. Jika hanya ada satu entri, dan panjangnya satu stroke, maka kita dapat dengan andal mengatakan "itulah entri untuk digunakan", mengeluarkan teks yang sesuai, dan kemudian mulai dengan stroke berikutnya. Tetapi lebih mungkin, bahwa stroke mulai beberapa entri dengan panjang yang berbeda-beda. Jadi kita melihat stroke berikutnya dan melihat apakah ada entri yang dimulai dengan dua pukulan secara berurutan; dan seterusnya sampai kita mendapatkan korek api.
Jadi dengan kamus di atas, misalkan kita melihat urutan ini:
ACBBCABCABD
Begini cara kami menerjemahkannya:
A
adalah awal dari tiga entri dengan panjang yang berbeda-beda; lihat stroke berikutnya:C
A/C
hanya cocok dengan satu entri; Output "AC" dan mulai segar dengan stroke berikutnya:B
B
mulai dua entri; lihat stroke berikutnya:B
B/B
tidak memulai apa pun; ambil pertandingan terlama sebelumnya ( B
) dan hasilkan itu ("lebah")
- Memiliki output
B
= "bee", kami masih memiliki B
stroke di buffer kami. Itu mulai dua entri, jadi lihat stroke berikutnya:C
B/C
cocok dengan satu entri; Output "karena" dan mulai segar dengan stroke berikutnya:A
A
mulai tiga entri; lihat stroke berikutnya:B
A/B
mulai dua entri; lihat stroke berikutnya:C
A/B/C
hanya cocok dengan satu entri; output "alfabet" dan mulai segar dengan goresan berikutnya:A
A
mulai tiga entri; lihat stroke berikutnya:B
A/B
mulai dua entri; lihat stroke berikutnya:D
A/B/D
tidak cocok dengan apa pun, jadi ambil kecocokan terlama sebelumnya ( A/B
) dan gunakan untuk menghasilkan "alfabet". Itu membuat kita D
masih dalam buffer.
D
memulai dua entri, jadi kami biasanya akan melihat stroke berikutnya - tetapi kami telah memproses semua stroke, jadi pertimbangkanlah secara terpisah. Dalam isolasi, itu diterjemahkan sebagai "anjing" sehingga menghasilkan itu.
Aspek-aspek di atas yang perlu diperhatikan:
- Anda memiliki buffer stroke yang Anda baca tetapi belum diterjemahkan.
- Anda selalu ingin mencocokkan paling banyak pukulan dengan satu entri yang Anda bisa.
A/B
harus diterjemahkan sebagai "alfabet", bukan "alfa" dan "lebah".
- (Tidak diperlihatkan di atas) Anda mungkin memiliki urutan goresan yang tidak dapat Anda terjemahkan, karena mereka tidak cocok dengan apa pun di kamus. (Orang Steno menggunakan kata benda "untranslate" - mis., Dengan kamus kami, stroke
E
akan menjadi "untranslate".)
- (Tidak diperlihatkan di atas) Beberapa teori steno memungkinkan serangkaian stroke yang sama berarti lebih dari satu hal, berdasarkan konteks yang lebih luas. Orang Steno menyebut ini "konflik". Anda mungkin ingin melarang mereka dalam proyek Anda, dan pada kenyataannya ketika steno digunakan untuk diterjemahkan secara manual oleh stenographer, konflik baik-baik saja karena mereka tahu hanya di mana dalam kalimat itu adalah pilihan yang tepat, tetapi dengan naiknya tentang terjemahan mesin, teori steno bebas konflik muncul secara khusus untuk menghindari keharusan membaca teks terjemahan yang dihasilkan dan konflik "memperbaiki".
- Menerjemahkan secara real time (yang akan Anda lakukan) berarti bahwa jika Anda menerima kecocokan sebagian, Anda ingin memegangnya sambil menunggu chord berikutnya - tetapi mungkin hanya sampai batas waktu, pada titik mana Anda akan terjemahkan apa yang Anda miliki di buffer sebaik mungkin. (Atau mungkin Anda tidak ingin waktu habis; itu panggilan Anda.)
- Mungkin yang terbaik untuk mengalami stroke yang mengatakan "abaikan stroke sebelumnya"
- Mungkin yang terbaik untuk mengalami stroke yang mengatakan "hapus buffer sepenuhnya tanpa mengeluarkan apa pun"