親指シフトの打鍵判定
1. NICOLA規格の打鍵判定
親指シフトの打鍵判定については、NICOLA 日本語コンソーシアムのサイトにJIS(提案) NICOLA規格があり、「§5.4 同時打けんの判定」に親指シフトの状態遷移図があります。
表にすると比較的簡単なのですが、処理A, B, C, Dが入っていて、しかも2018年に今更の修正が入っています。
QMK firmwareのnicolaはこの表の状態S1)~S5)に従って実装されています。以下、備忘録としてB割れUSキーボードに実装した親指シフトの打鍵判定について書いてみたいと思います。
2. 状態遷移図
下図はB割れUSキーボードキーボードに実装した状態遷移です。NICOLA規格の表に単独打鍵と同時打鍵を分けて記入したので、よりわかり易いと思います(※右クリックで別のタブに画像を表示させると大きくなります)。
(注1) 初期化はシーケンスの途中で文字キー以外(e.g., Fnキー)が押下された場合などが該当します。
(注2) 当該キーリリースは、S2), S3)の場合はその状態に至る要因になったキーです。S4), S5)の場合は単独打鍵の判定でキーのリリースに意味があるので、先に押されたキーと解釈しました。
(注3) タイムアウトは通常キー押下で開始するタイマーを(150ms)、親指キーの場合は(250ms)として実装しています。さほど早くない私のタイプ速度でもタイマーが満了する前にキーリリースしています。
(注4) B割れUSキーボードキーボードでは親指キーそれぞれに単押しと長押しの機能を割り当てています。このためキーリリースとタイムアウトで動作を変えています。
3. 同時打鍵判定のタイミング
NICOLA規格は親指シフトキーを単独で機能するキー、例えば無変換やスペースなどのキーと共用しています。このため、親指キーにも同時打鍵と単独打鍵の判定が必要で、OASYS専用キーボードの頃と較べて状態遷移がより複雑になっています。
3.1 処理A : 親指キー/文字キー受付中(S4)の文字キー
文字キー(M1)から次の文字キー(M2)の間に親指シフトキー(O)が押された場合、どちらの文字キーの親指シフトが有効になるかの判定です。
t1≧t2 ならばM1単独打鍵として、M1出力、M2セット、S5)へ遷移します。
t1<t2 ならば同時打鍵として、M1-O出力、M2セット、S2)へ遷移します。
3.2 処理B : 文字キー/親指キー受付中(S5)の親指キー
親指キー(O1)から次の親指キー(O2)の間に文字キー(M)が押された場合、どちらの親指キーと文字キーの親指シフトが有効になるかの判定です。
t1≧t2 ならばO1単独打鍵として、O1出力、O2セット、S4)へ遷移します。
t1<t2 ならば同時打鍵として、M-O1出力、O2セット、S3)へ遷移します。
3.3 処理C : 親指キー/文字キー受付中(S4)のキーリリース
文字キー(M)の押下からキーリリース前に親指キー(O)が押された場合、文字キー(M)のリリースタイミングで親指シフトが有効になるか否かの判定です。
t1≧t2かつt2<τ (τは実装依存の固定値) のときには、 同時打鍵未成立(M単独打鍵)とみなし、M出力、 S3)へ遷移します。
上記条件以外は同時打鍵が成立して、セットされていた文字キーと親指キーは、M-O出力、S1)へ遷移します。
τの値はhoboNicolaの80msに設定しています。あまり短いと微妙に親指キーが有効になってしまい、無変換のつもりが直前の文字キーの親指シフトになってしまうことがありました。
3.4 処理D : 文字キー/親指キー受付中(S5)のキーリリース
親指キー(O)の押下からキーリリース前に文字キー(M)が押された場合、親指キー(O)のリリースタイミングで親指シフトが有効になるか否かの判定です。NICOLA規格書に処理Dはありますが、説明はありませんので、処理Cを読み替えています。
t1≧t2かつt2<τ (τは実装依存の固定値) のときには、 同時打鍵未成立(O単独打鍵)とみなし, O出力、 S2)へ遷移します。
上記条件以外は同時打鍵が成立して、セットされていた親指キーと文字キーは、M-O出力、S1)へ遷移します。
4. まとめ
以上、NICOLAの状態遷移と同時打鍵判定処理を振り返ってみました。同時打鍵判定処理については、タイムチャートにすると明快で納得がゆきます。
現在、B割れUSキーボードキーボード用のQMK firmwareおよびhoboNicolaの状態遷移は、オリジナルからNICOLA規格(2018.4)に合わせて若干変更を加えていますが、打鍵感の違いは 感じません。
使用しているキーボードはNキーロールオーバーに対応し、処理速度も32bit MCUを搭載しているので、いわゆる高級キーボード(笑)と比べて性能は十分だと思います。私の打鍵速度はそれ程早くないので、親指シフトのタイミングに関する問題は出にくいかもしれません。
【付録】
状態遷移図を見ているといろいろ面白いことに気付きます。たとえば親指キーOというのは通常左右2個ですが、状態遷移図では個数の制限はありません。頭がついてゆくかどうかは別にして、表現できる文字は相当拡張できるかもしれません。
また、タイムアウトのイベントが起きるのは稀なので、長押しの機能を割り振ることが出来ます。実際、この例では親指キー単独の長押しで別機能を割り当てています。では文字キーの長押しでも割り当てが出来るか…ということで、スペースバーの長押しを対側シフトに出来ないか試してみました。結果は没ネタですが、いろいろ可能性があって面白いです。
この記事が気に入ったらサポートをしてみませんか?