2019年04月20日

【薙刀式】同時打鍵ロジックまとめ

キーには、押す(D)と離す(U)があるから、
話がややこしくなるんだなあ。


AとBの二つのキーについて、

1. D時間の重なりが○%以上なら同時と判定
2. DからDまでが○ミリ秒以内なら同時と判定
3. Aを押しながらBまたはその逆(双方シフト)

の三つのアルゴリズムがある。

僕が使用しているDvorakJでは2がメインだろう。
かえうちややまぶきRでは1だ。

薙刀式では、おそらく他に実装例がないだろう、
3で実装している。
(DvorakJでは、「真の同時押し」と呼ばれる+で定義できるはずだが、
キーの組み合わせによっては同時に判定されないことがある。バグかも。
なので、薙刀式ファイルでは双方向にシフトで定義することで実装)


そもそも同時打鍵というのは、
どちらが先か分からない。
どっちを先に打ったかということに関わらず同時と判定しなければならないわけだ。


2の利点は、実装が楽なこと。
それはつまりプログラムが簡単にかけて、
実行も速いということだ。
キーの判定はDUの二回行われているが、
Dだけ監視すればいいことになるからだ。

この方式のデメリットは、
「AB同時打鍵と、2キーの逐次打鍵を区別するのに、
待つか待たないかで区別しなければならない」
ことである。
これは入力側にコントロール力がいる。
書く速度というのはノリによって変化する。
経験でいうと、120でも問題ない時もあったし、
30でも大丈夫なときがあった。
80ぐらいが妥当なラインっぽいのだが、
次の問題が出てくる。

Aが入力された時、
最大○ミリ秒待ってAを発行する。
○ミリ秒以内にBが押されたら同時文字Cを出す。
同時打鍵定義のないDが押されたらDを発行。

のような処理をすることになる。
ここで問題は、
文字が遅延して出力されるように見えることだ。
一文字押すごとに発行を最大○ミリ秒待つわけだから、
そこがなんだかモッサリするんだよね。

僕は薙刀式の同時押しを最初はこれで定義してたのだが、
なんだかモッサリして30くらいで使っていた。
そうしないと、発行が遅れてくる感じがする。
しかし30だと同時がシビアすぎて、
その辺りをずっとうろうろすることになり、
「他のやり方はないのか」と思い立った。

ガガガって書きたい人には向いてないロジックかもしれない。
反面、配列学習の初期とか、慣れてない環境下で使うときとか、
普及にはいいかもしれない。
ちなみにQMKのデフォは200。
外人、同時押し苦手説。

とくに高速打鍵になってくると、
秒あたりの打数が増えてくる。
qwertyでは秒10打も珍しいことではない。
その時に、待つ/待たないの使い分けが難しいので、
「同時打鍵配列は究極では不利かも」
という説の根拠になっている。
(僕は平均秒5打くらいなので、まだ困っていないが、
QMKの想定ではこれ以上は200を変えない限り対処できないことになる。
ちなみに、TAPPING_TERMの変更で可能)

なお、多少アルゴリズムを変えることが出来る。

Aを押したら即Aを発行して、
次のキーが押されたら、
○ミリ秒以内かつ同時押し定義があれば、BSして文字、
そうでない文字ならその文字を発行

のようにすれば、
一々出る文字がうっとうしくなければ、
遅延の感じはなくなるだろう。
AutoHotKeyで組めると思う。
ローマ字入力では一旦子音を発行して、
母音が押されたらそれを消してカナに書き換えるのを、
OSレベルで実行してるわけだが、
それと同じと考えれば煩雑でないかも。
ただ僕は押したカナがそのまま出る方が好きだなあ。

ただ、これにしたとしても、
同時押しのABと逐次のABを打ち分けるには、
待たないか待つかをコントロールしなければならない。


1.のアルゴリズムは、
DからUまでを比較し、
○%以上なら同時、それ以下なら逐次と判定する。
ロールオーバーなどにも考慮があるが、
問題は、
「Uの瞬間に判定がある」ことで、
「離し入力」になってしまうこと。

qwertyなどのデフォルトでは、
「押した時に文字が出る」だ。
だから遅延があるとイライラする。
この方式ではさらに離した時まで待たないといけない。
それが嫌いな人はこの方式は使いづらいことになる。

そもそも爽快に打ちたいことが理由だろうから、
難しい問題だ。
慣れればわりと慣れるんだけど、
慣れない人は慣れないだろうなあ。


3.のアルゴリズムは、
「同時に押されている瞬間があればOK」
という、打つ人に優しいアルゴリズムだ。
双方シフトなので、どれだけ片方が遅れても、
もう一方を押していればセーフ、
という変わった打鍵も許容する。
今のところ薙刀式だけ?で使われている。

欠点は実装がややこしいことだが、
できてしまえば3キー同時打鍵がとても押すのが楽になる。
(たとえば薙刀式では「ぴょ」は、
Xひ、M半濁点、Iよの、XMI同時押しだが、
MIを一気に打たずに、
「XMを押しながらI」などのように打って良い。
ぴょの出現率から、このムチャな配置でも良しとした)

さらにこれもU時に確定するのがデメリット。
離し入力が嫌いな人はこれも受け入れられないかもしれない。

これも同様に、

Aが押されたら即Aを発行、
U前に何かが押されたら、
同時押し定義がある場合BSとその文字を発行、
ない場合は即文字を発行

と定義すればチラチラする以外は快適に使えるはず。

ただ薙刀式の場合3キー同時押しまであるので、
判定がネストになり、
非常に複雑な判定を書かねばならず、
試しに3キーくらいの薙刀式をAutoHotKeyで書いてみたが挫折。
面倒なのと、
需要あんのかこれ?という疑問で、
そこまでして作る意味がないなあ、
と思って中断した。
(スペースキーあたりが難しい…)

あとデメリットとしてあるのは、
DvorakJにバグがあり、
「高速打鍵中にシフトが入りっぱなしになる現象」
にたまに遭遇すること。
DvorakJだけでなく、
AutoHotKeyでの打鍵中にもなることがあるので、
AutoHotKeyのバグ(DvorakJはAutoHotKeyで書かれている)
だと思われる。
お手上げなので、
「そのシフトを含む同時打鍵をもう一度打つと戻る」
という経験則で対処している。


あともうひとつデメリットがあるとすれば、
「シフトをレイヤーで処理している場合、
レイヤー数だけでいうと100を超えてしまう」こと。
かえうちもQMKもレイヤーが32なので、
全然現実的ではない。
(かえうちに関しては、レイヤーを共用したバージョンが存在する。
しかし高速打鍵すると意図しない文字が出ることがある
(別のレイヤーが反応する)ため、
使い勝手がそんなによくなくて、最近使ってない)



ちなみにQMKだと、
comboが2のロジックで、
LT()が3のロジック。
LTでは無理なので、comboで組もうとしているが、
3のロジックの便利さにかなわないので、
自作キーボード上に薙刀式を乗せる動機がイマイチ。

やはりQMKは英語基準だから、
モデファイヤが単純なものが多く、
複雑にした途端ソースがややこしくなってしまう。
日本語のカナ入力でのノウハウが生きてこない。

qwertyと切り替えにして、
Winで使うときはqwertyをDvorakJで薙刀式へ、
Macで使うときは劣化版薙刀式、
とすればいいのかもなあ。
そうなれば、俺のキーボードを接続するだけで、
どこでも薙刀式が使えるという夢は叶う。

今のところカタナ式でそれを勉強しながら実装中ではある…
posted by おおおかとしひこ at 15:58| Comment(0) | カタナ式 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。