Yıllar boyunca hiçbir MIDI programlaması yapmadım, ama temel fikriniz çok sağlam (pun yok).
MIDI, "olay" (veya "mesajlar") akışıdır; bunlardan en temel olanı, onlarla birlikte not numarasını taşıyan "not açık" ve "not kapalı" dır (0 = C, orta C'nin altında beş oktav, 127 = G yarı tonlarda orta C'nin üzerindeki G'nin üzerinde beş oktav). Bu olaylar, klavyelerde hız duyarlı ("dokunmaya duyarlı"), 0 ile 127 arasında bir kuvvetle (tahmin ettiniz) bir "hız" numarası taşır.
Hız, akor ve pedallar arasında, piyano klavyesi için oldukça iyi bir "yazma" arayüzü bulabileceğinizi düşünüyorum. Özellikle akor çok güçlü bir teknik olabilir - yorumlarda bahsettiğim gibi, rütbe ve dosya stenografları üst düzey daktilocular bile saatlerce konuşan insanlara yetişmek için bir stenotip makinesi kullanabilirler. t Normal daktilo tipi klavyelerle herhangi bir süre boyunca yapabilme. Makine stenografisinde olduğu gibi, akorların ve akor dizilerinin anlamlarının bir "sözlüğüne" ihtiyacınız olacaktır. (Makine stenografisinin yazılım tarafında çalıştığımı söyleyebilir misiniz?)
Bunu yapmak için temel parçalar şunlardır:
- MIDI girişi alınıyor. Bunu kendiniz yapmaya çalışmayın, bir kütüphane kullanın. Düzenleme : Görünüşe göre, Java Sound API MIDI denetleyicilerinden olay alma dahil MIDI destekler . Güzel. Bu sayfa da yararlı olabilir.
- Bu verileri, örneğin yukarıda bahsettiğim sözlük aracılığıyla göndermek istediğiniz tuş vuruşlarına dönüştürme.
- Tuş vuruşlarının bilgisayara çıkışı.
Yazılımla en geniş çapta uyumlu olmak için bunu bir klavye aygıt sürücüsü olarak yazmanız gerekir. Bu, altta yatan donanımla (sizin durumunuzda piyano klavyesi) konuşurken, klavye olayları için bir kaynak görevi gören işletim sistemine bir eklentidir. Windows ve Linux için muhtemelen bunun için C kullanmak isteyeceksiniz.
Ancak, sadece tuş vuruşları ürettiğiniz için (onları yıllar önce yapmaya çalıştığım, onları engellemeye çalışmıyorum), işletim sisteminin yapay tuş vuruşları göndermek için sahip olduğu tüm özellikleri kullanabilirsiniz. Windows bunu yapmak için bir arayüze sahiptir (muhtemelen birkaç tane, düşündüğüm SendInput
şeydir , ancak benzer bir şey yapan bazı "günlük" arayüzü olduğunu biliyorum) ve eminim diğer işletim sistemleri de yapıyor. Bu sizin amaçlarınız için yeterli olabilir - burada başlıyorum, çünkü aygıt sürücüsü rotası garip olacak ve muhtemelen bunun için Java'dan farklı bir dil kullanmanız gerekecektir. (Ben Java'nın büyük bir hayranıyım, ancak işletim sistemlerinin aygıt sürücüleri ile konuşmak için kullandığı arabirimler C ve benzeri aracılığıyla daha kolay tüketiliyor.)
Güncelleme : Tuş vuruşlarının akorlarının "sözlüğü" hakkında daha fazla bilgi:
Temelde, sözlük bir olan tray biz en uzun önek eşleme ile arama ki (teşekkürler, @Adam). Detaylar:
Makine stenografisinde stenograf, stenotip makinesinde aynı anda birden fazla tuşa basıp hepsini serbest bırakarak yazar. Buna klavyenin "vuruşu" derler; piyanoda bir akor çalmak gibi. Vuruşlar sık sık (ancak her zaman değil) bir hece konuşma diline karşılık gelir. Hecelerde olduğu gibi, bazen bir vuruşun (akor) tek başına bir anlamı vardır, diğer zamanlarda sadece aşağıdaki vuruşlarla birleşik bir anlamı vardır. ("İyi" ve "iyi" ve ardından "güle güle" düşünün). Çalıştıkları okuldan büyük ölçüde etkilenecek olsalar da, her stenografın, ne demek için kullandıkları vuruşların kendi "sözlüğüne" sahip olacakları, çalışma hayatları boyunca sürekli olarak bilecekleri bir sözlük. Sözlük, stenografik bölümün (kısaca "steno") bir vuruş uzunluğunda veya birden çok vuruş uzunluğunda olduğu girişlere sahip olacaktır. Sıklıkla, aynı başlangıç strokuna sahip, uzunluklarına ve sonraki stroklara göre farklılaşan birkaç giriş olacaktır. Örneğin (ve burada gerçek steno kullanmam, sadece yer tutucular), bu girişler olabilir:
A = alfa
A / B = alfabe
A / B / C = alfabetik
Klima = klima
B = arı
B / C = çünkü
C = deniz
D = köpek
D / D = Dee Dee
(Bu harfler müzik notası değil, sadece soyut işaretler.)
Not A
birden fazla giriş başlar ve aynı zamanda çevirmek nasıl bir dikkat C
inme Daha önce bir gördüm bağlıdır A
, bir B
veya başlıyoruz taze.
Ayrıca (yukarıdaki çok küçük örnekte gösterilmemesine rağmen) aynı kelimeyi veya kelime öbeğini tek bir kelimeden ziyade "oynatmanın" birçok yolu olabileceğini unutmayın. Stenograflar, el konumuna bağlı olarak önceki bir kelimeden diğerine akmayı kolaylaştırmak için bunu yaparlar. Orada müziğe açık bir benzetme var ve bunu hem piyano çalmayı olumsuz yönde etkilemeyi hem de RSI ile gerçekten yardımcı olma olasılığını en üst düzeye çıkarmak için yazma akışınızı müzik çalmaya benzer hale getirmek için kullanabilirsiniz.
Steno'yu standart metne çevirirken yine "en uzun önek eşleşmesi" aramasını kullanıyoruz: Çeviri algoritması şimdiye kadar yazılmış ilk konturla başlar ve bu konturla başlayan girdileri arar. Sadece bir giriş varsa ve bu bir kontur uzunluğundaysa, o zaman güvenilir bir şekilde "kullanılacak giriştir" diyebilir, ilgili metni çıkarabilir ve ardından bir sonraki konturla yeni başlayabiliriz. Ancak daha büyük olasılıkla, bu kontur çeşitli uzunluklarda birden fazla giriş başlatır. Bu yüzden bir sonraki vuruşa bakarız ve bu iki vuruşla başlayan girişler olup olmadığını görürüz; ve bir maç bulana kadar devam eder.
Yukarıdaki sözlükle bu diziyi gördüğümüzü varsayalım:
ACBBCABCABD
Bunu nasıl çevireceğiz:
A
değişen uzunluklarda üç girişin başlangıcıdır; sonraki vuruşa bak:C
A/C
yalnızca bir girişle eşleşir; "klima" çıkışı ve sonraki vuruş ile taze başlayın:B
B
iki giriş başlatır; sonraki vuruşa bak:B
B/B
hiçbir şey başlatmaz; önceki en uzun maçı ( B
) alır ve çıktısını alır ("arı")
- Çıktı
B
= "arı" olan tamponumuzda hala bir B
vuruş var . İki giriş başlatır, bu yüzden sonraki vuruşa bakın:C
B/C
bir girişle eşleşir; "çünkü" çıktısını alın ve sonraki konturla yeni başlayın:A
A
üç giriş başlatır; sonraki vuruşa bak:B
A/B
iki giriş başlatır; sonraki vuruşa bak:C
A/B/C
sadece bir girişle eşleşir; "alfabetik" çıktısını alın ve sonraki konturla yeni başlayın:A
A
üç giriş başlatır; sonraki vuruşa bak:B
A/B
iki giriş başlatır; sonraki vuruşa bak:D
A/B/D
hiçbir şeyle eşleşmediğinden, önceki en uzun eşleşmeyi ( A/B
) alın ve "alfabe" çıktısı için kullanın. Bu bizi D
hala tamponda bırakır .
D
iki giriş başlatır, bu yüzden normalde bir sonraki vuruşa bakarız - ancak tüm vuruşları işledik, bu yüzden tek başına düşünün. İzole olarak, "köpek" olarak çevirir böylece çıktı.
Aşağıdakilerin notları:
- Okuduğunuz, ancak henüz çevirmediğiniz bir tampon tamponunuz var.
- Her zaman en çok konturu yapabileceğiniz tek bir girişle eşleştirmek istersiniz.
A/B
"alfa" ve "arı" değil, "alfabe" olarak çevrilmelidir.
- (Yukarıda gösterilmiyor) Tercüme edemediğiniz kontur dizileri olabilir, çünkü sözlükteki hiçbir şeyle eşleşmezler. (Steno insanlar "tercüme edilmez" ismini kullanır - örneğin, sözlüğümüzde, vuruşlar
E
"tercüme edilmez" olacaktır.)
- (Yukarıda gösterilmemiştir) Bazı steno teorileri, aynı kontur kümesinin daha geniş bir bağlama dayanarak birden fazla şey ifade etmesine izin verir. Steno halkı buna "çatışma" diyor. Muhtemelen projenizde onlara izin vermemek istiyorsunuz ve aslında steno stenograf tarafından manuel olarak tercüme edildiğinde, çatışmalar iyiydi, çünkü sadece cümlenin neresinde doğru seçim olduğunu biliyorlardı, ancak yükselişle birlikte makine çevirisi, çatışmasız steno teorileri ortaya çıkan tercüme edilmiş metinden geçmek ve "düzeltmek" çatışmalarını önlemek için özellikle ortaya çıktı.
- Gerçek zamanlı olarak çevirmek (yapacağınız), kısmi bir eşleşme alırsanız, bir sonraki akoru beklerken tutunmasını isteyeceksiniz - ancak muhtemelen sadece bir zaman aşımına kadar, hangi noktada arabellekte olanı olabildiğince iyi çevir. (Ya da belki bir zaman aşımı istemiyorsunuz; bu sizin çağrınız.)
- Muhtemelen "önceki konturu dikkate almayın" yazan bir kontur olması en iyisidir
- Muhtemelen en iyisi "hiçbir şey çıkarmadan arabelleği tamamen temizle" konturuna sahip olmak