見出し画像

親指シフトの打鍵判定



1. NICOLA規格の打鍵判定

親指シフトの打鍵判定については、NICOLA 日本語コンソーシアムのサイトにJIS(提案) NICOLA規格があり、「§5.4 同時打けんの判定」に親指シフトの状態遷移図があります。

表にすると比較的簡単なのですが、処理A, B, C, Dが入っていて、しかも2018年に今更の修正が入っています。

注1(初期化):初期化を引き起こす事象として機能キーなどの非文字キーの打鍵や全キーオフなどが考えられる。またかな漢字変換機能の解除や当該ウィンドウから別ウィンドウへ制御がが移ることも初期化の原因となりうる。何をもって初期化と見なすかはこの規約では定めない。
注2(キーオフ): 各状態への遷移への原因となった最後のキーのオフは,「当該キーオフ」と表現する。
注3(タイムアウト): 実装を省略してもよい。その場合, 各イベントに対して、同時打鍵時間内かどうか判定しなければならない。
注4(親指キーのタイムアウト抑制):Oオン状態でタイムアウトになったとき,出力せずに, Oオンの状態にとどまっていてもよい (MAY)。「緩慢な打鍵操作」と呼ぶ。

NICOLA規格 (2018.4)

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)の文字キー

処理A: 最初の図形キーM1オンから親指Oオンまでの時間t1と,親指Oオンから次の図形キーM2オンまでの時間t2とを比較して,
1. t1≧t2 ならば, M1出力, M2セット, S5)へ
2. t1<t2 ならば, M1O出力, M2セット, S2)へ

NICOLA規格

文字キー(M1)から次の文字キー(M2)の間に親指シフトキー(O)が押された場合、どちらの文字キーの親指シフトが有効になるかの判定です。
t1≧t2 ならばM1単独打鍵として、M1出力、M2セット、S5)へ遷移します。

処理A_1 (t1≧t2)

t1<t2 ならば同時打鍵として、M1-O出力、M2セット、S2)へ遷移します。

処理A_2 (t1<t2)

3.2 処理B : 文字キー/親指キー受付中(S5)の親指キー

処理B: 最初の親指キーO1オンから図形キーMオンまでの時間t1と,図形キーMオンから次の親指キーO2オンまでの時間t2とを比較して,
1. t1≧t2 ならば, O1出力, O2セット, S4)へ
2. t1<t2 ならば, MO1出力, O2セット, S3)へ

NICOLA規格

親指キー(O1)から次の親指キー(O2)の間に文字キー(M)が押された場合、どちらの親指キーと文字キーの親指シフトが有効になるかの判定です。
t1≧t2 ならばO1単独打鍵として、O1出力、O2セット、S4)へ遷移します。

処理B_1 (t1≧t2)

t1<t2 ならば同時打鍵として、M-O1出力、O2セット、S3)へ遷移します。

処理B_2 (t1<t2)

3.3 処理C : 親指キー/文字キー受付中(S4)のキーリリース

処理C: (同時打鍵未成立の条件付加) 図形キーオンから親指オンまでの時間t1と親指オンから図形キーオフまでの時間t2について,
1. t1≧t2かつt2<τ (τは実装依存の固定値) のときには, 同時打鍵未成立とみなし, M出力, S3)へ
2. セットされていた図形キー・親指オフは, MO出力, S1)へ
※当該キー以外は, 無視, S4)まま.

NICOLA規格

文字キー(M)の押下からキーリリース前に親指キー(O)が押された場合、文字キー(M)のリリースタイミングで親指シフトが有効になるか否かの判定です。
t1≧t2かつt2<τ (τは実装依存の固定値) のときには、 同時打鍵未成立(M単独打鍵)とみなし、M出力、 S3)へ遷移します。

処理C_1 (t1≧t2かつt2<τ )

上記条件以外は同時打鍵が成立して、セットされていた文字キーと親指キーは、M-O出力、S1)へ遷移します。

処理C_2 (t1<t2またはt2>τ )

τの値はhoboNicolaの80msに設定しています。あまり短いと微妙に親指キーが有効になってしまい、無変換のつもりが直前の文字キーの親指シフトになってしまうことがありました。

3.4 処理D : 文字キー/親指キー受付中(S5)のキーリリース

親指キー(O)の押下からキーリリース前に文字キー(M)が押された場合、親指キー(O)のリリースタイミングで親指シフトが有効になるか否かの判定です。NICOLA規格書に処理Dはありますが、説明はありませんので、処理Cを読み替えています。
t1≧t2かつt2<τ (τは実装依存の固定値) のときには、 同時打鍵未成立(O単独打鍵)とみなし, O出力、 S2)へ遷移します。

処理D_1 (t1≧t2かつt2<τ )

上記条件以外は同時打鍵が成立して、セットされていた親指キーと文字キーは、M-O出力、S1)へ遷移します。

処理D_2 (t1<t2またはt2>τ )

4. まとめ

以上、NICOLAの状態遷移と同時打鍵判定処理を振り返ってみました。同時打鍵判定処理については、タイムチャートにすると明快で納得がゆきます。

現在、B割れUSキーボードキーボード用のQMK firmwareおよびhoboNicolaの状態遷移は、オリジナルからNICOLA規格(2018.4)に合わせて若干変更を加えていますが、打鍵感の違いは 感じません。

使用しているキーボードはNキーロールオーバーに対応し、処理速度も32bit MCUを搭載しているので、いわゆる高級キーボード(笑)と比べて性能は十分だと思います。私の打鍵速度はそれ程早くないので、親指シフトのタイミングに関する問題は出にくいかもしれません。

【付録】

状態遷移図を見ているといろいろ面白いことに気付きます。たとえば親指キーOというのは通常左右2個ですが、状態遷移図では個数の制限はありません。頭がついてゆくかどうかは別にして、表現できる文字は相当拡張できるかもしれません。

また、タイムアウトのイベントが起きるのは稀なので、長押しの機能を割り振ることが出来ます。実際、この例では親指キー単独の長押しで別機能を割り当てています。では文字キーの長押しでも割り当てが出来るか…ということで、スペースバーの長押しを対側シフトに出来ないか試してみました。結果は没ネタですが、いろいろ可能性があって面白いです。



戻る


この記事が気に入ったらサポートをしてみませんか?