Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@kenichiro_ayaki

キーボード配列エミュレーションソフトウエア「紅皿」動作仕様書

1. 適用範囲

  • この文書は、キーボード配列エミュレーションソフトウエア「紅皿」ver.0.1.4.4 の動作仕様を説明するものです。また、この動作仕様書は、親指キーとの同時打鍵を用いる文字出力動作を説明し、同時打鍵を判定する条件について説明します。
  • 本文書は、NICOLAの日本工業規格(提案)を参考としています。URL:http://nicola.sunicom.co.jp/spec/jisdraft.htm
  • 紅皿 ver.0.1.4.4 の実行ファイル:https://osdn.net/projects/benizara/releases/
  • 紅皿 ver.0.1.4.4 のソースコード:https://github.com/k-ayaki/benizara
  • ※ 2021年4月12日に追記しました。

2. 用語の定義

  • この仕様書で用いる用語の定義は、次の通りです。
  • a. 親指キー 同時打鍵時に使用するキー。親指キーには、親指左キーと親指右キーとがあります。
  • b. 文字キー 打鍵により文字情報が出力されるキーです。
  • c. 修飾キー 文字キーを修飾するキーです。シフトキー、コントロールキー、ALTキー、Windowsキーの4つです。
  • d. 単独打鍵 一回の動作で、一つのキーを打鍵することです。
  • e. 同時打鍵 一回の動作で、文字キーと親指キーとの二つのキーを順不同で、ピアノの和音を打鍵するように同時性を意図して打鍵することです。

3. 鍵盤配列

  • 鍵盤の配列は、ローマ字モード6面と、英数モード6面の全12面です。ローマ字モードは、インプット・メソッド(IME)をローマ字入力のひらがな・全角カタカナ・半角カタカナに設定したときのモードであり、英数モードは、インプット・メソッドを全角英数・半角英数・直接入力に設定したときのモードです。

3.1 各配列名とシフト操作との関係

配列名 シフト操作
ローマ字シフト無し シフト無し
ローマ字右親指シフト 右親指キーと共に文字キー打鍵
ローマ字左親指シフト 左親指キーと共に文字キー打鍵
ローマ字小指シフト 小指シフト(ダミー)
ローマ字小指右親指シフト 小指シフトした状態で、右親指キーと共に文字キー打鍵(ダミー)
ローマ字小指左親指シフト 小指シフトした状態で、右親指キーと共に文字キー打鍵(ダミー)
英数シフト無し シフト無し
英数右親指シフト 右親指キーと共に文字キー打鍵
英数左親指シフト 左親指キーと共に文字キー打鍵
英数小指シフト 小指シフト
英数小指右親指シフト 小指シフトした状態で、右親指キーと共に文字キー打鍵
英数小指左親指シフト 小指シフトした状態で、右親指キーと共に文字キー打鍵

3.1.1 ローマ字モード

ローマ字入力モードにおける各配列は、次によります。
2021-04-11 (3).png

3.1.2 英数モード 

英数モードにおける各配列は、次によります。
2021-04-11 (4).png

上記の配列は、紅皿が読み込むキー配列ファイルによって変更することができます。

4. 文字の出力

4.1 ローマ字モードと英字モード

  • ローマ字モードと英字モードの選択は、インプット・メソッドによります。

4.2 英字モードでの配列

Caps Lockモードでない場合

  • シフトキーを押下せずに文字キーを単独打鍵すると、英数シフト無し配列の文字が出力されます。
  • 右親指キーと文字キーを同時打鍵すると、英数右親指シフト配列の文字が出力されます。
  • 左親指キーと文字キーを同時打鍵すると、英数左親指シフト配列の文字が出力されます。
  • シフトキーを押下して、文字キーを単独打鍵すると、英数小指シフト配列の文字が出力されます。
  • シフトキーを押下して、右親指キーと文字キーを同時打鍵すると、英数小指右親指シフト配列の文字が出力されます。
  • シフトキーを押下して、左親指キーと文字キーを同時打鍵すると、英数小指左親指シフト配列の文字が出力されます。

Caps Lockモードの場合、

  • シフトキーを押下せずに文字キーを単独打鍵すると、英数小指シフト配列の文字が出力されます。
  • 右親指キーと文字キーを同時打鍵すると、英数小指右親指シフト配列の文字が出力されます。
  • 左親指キーと文字キーを同時打鍵すると、英数小指左親指シフト配列の文字が出力されます。
  • シフトキーを押下して、文字キーを単独打鍵すると、英数シフト無し配列の文字が出力されます。
  • シフトキーを押下して、右親指キーと文字キーを同時打鍵すると、英数右親指シフト配列の文字が出力されます。
  • シフトキーを押下して、左親指キーと文字キーを同時打鍵すると、英数左親指シフト配列の文字が出力されます。

4.3 ローマ字モードでの文字の出力

Caps Lockモードでない場合

  • シフトキーを押下せずに文字キーを単独打鍵すると、ローマ字シフト無し配列の文字が出力されます。
  • 右親指キーと文字キーを同時打鍵すると、ローマ字右親指シフト配列の文字が出力されます。
  • 左親指キーと文字キーを同時打鍵すると、ローマ字左親指シフト配列の文字が出力されます。
  • シフトキーを押下して、文字キーを単独打鍵すると、ローマ字小指シフト配列の文字が出力されます。
  • シフトキーを押下して、右親指キーと文字キーを同時打鍵すると、ローマ字小指右親指シフト配列の文字が出力されます。
  • シフトキーを押下して、左親指キーと文字キーを同時打鍵すると、ローマ字小指左親指シフト配列の文字が出力されます。

Caps Lockモードの場合、

  • シフトキーを押下せずに文字キーを単独打鍵すると、ローマ字小指シフト配列の文字が出力されます。
  • 右親指キーと文字キーを同時打鍵すると、ローマ字小指右親指シフト配列の文字が出力されます。
  • 左親指キーと文字キーを同時打鍵すると、ローマ字小指左親指シフト配列の文字が出力されます。
  • シフトキーを押下して、文字キーを単独打鍵すると、ローマ字シフト無し配列の文字が出力されます。
  • シフトキーを押下して、右親指キーと文字キーを同時打鍵すると、ローマ字右親指シフト配列の文字が出力されます。
  • シフトキーを押下して、左親指キーと文字キーを同時打鍵すると、ローマ字左親指シフト配列の文字が出力されます。

4.4 同時打鍵の判定

  • 同時打鍵の判定は次によります。但し、親指キーの単独打鍵が無効のときには、親指キー($O$)は出力されません。
  • 零遅延モードにおいては、文字キーの押下と共に先行出力され、以下にて確定したキーと先行出力とを比較します。確定したキーと先行出力とが相違していれば、バックスペースキーを出力したのち、確定したキーを出力します。

(1) 初期状態

  • (1.1) 文字キー($M$)が押下された場合、当該文字キー($M$)をセットして、単独打鍵判定時間($T_{th}*(1-J)/J$)をタイムアウト時間にセットして、文字キー押下状態(S2)へ遷移します。なお、$T_{th}$は、同時打鍵判定時間です。Jは、文字キー(M)の押下後に親指キー(O)が押下された場合に同時打鍵と判定する最少の割合です。
  • - (1.2) 親指キーが押下された場合、当該親指キー($O$)をセットし、単独打鍵判定時間($T_{th}*(1-L)/L$)をタイムアウト時間にセットして、親指キー押下状態(S3)へ遷移します。Lは、親指キー(O)の押下後に文字キー(M)が押下された場合、同時打鍵と判定する最少の割合です。

(2) 文字キー押下状態

  • (2.1) 初期化された場合、セットされている文字($M$)を出力し、初期状態(S1)へ遷移します。
  • (2.2) 文字キー($M_{2}$)が押下された場合、セットされている文字($M_{1}$)を出力し、新しく押下された文字キー($M_{2}$)をセットし、単独打鍵判定時間($T_{th}$*$(1-J)/J$)をタイムアウト時間にセットして、文字キー押下状態(S2)のまま遷移しません。
  • (2.3) 親指キー(O)が押下された場合、当該親指キー(O)をセットし、文字キー(M)が押下されてから親指キー(O)が押下された時までの時間($t_{MO}$)から算出したタイムアウト時間($t_{MO}$*$J/(1-J)$)をセットして、文字キー親指キー押下状態(S4)へ遷移します。
  • (2.4) 当該文字キー(M)がオフとなった場合、セットされている文字(M)を出力し、初期状態(S1)へ遷移します。
  • (2.5) 単独打鍵判定時間($T_{th}*(1-L)/L$)が経過してタイムアウトとなった場合、セットされている文字(M)を出力し、初期状態(S1)へ遷移します。

(3) 親指キー押下状態

  • (3.1) 初期化された場合、セットされている親指キー($O$)を出力し、初期状態(S1)へ遷移します。
  • (3.2) 文字キー($M$)が押下された場合、セットされている親指キー($O$)に加えて当該文字キー($M$)をセットし、親指キー($O$)が押下されてから文字キー($M$)が押下された時までの時間($t_{OM}$)から計算したタイムアウト時間($t_{OM}*L/(1-L)$)をセットし、親指キー文字キー押下状態(S5)へ遷移します。
  • (3.3) 親指キー($O_2$)が押された場合、セットされている親指キー($O_1$)を出力し、新しく押下された当該親指キー($O_2$)をセットし、単独打鍵判定時間($T_{th}*(1-L)/L$)をタイムアウト時間にセットして、親指キー押下状態(S3)のまま遷移しません。
  • (3.4) 当該親指キー($O$)がオフとなった場合、セットされている親指キー($O$)を出力し、初期状態(S1)へ遷移します。
  • (3.5) 親指キー押下状態ではタイムアウトを無視します。但し、単独打鍵が有効であるか、またはスペースキーが親指シフトに設定されていれば、タイムアウトとなった場合、セットされている親指キー($O$)を出力し、初期状態(S1)へ遷移します。

(4) 文字キー親指キー押下状態

  • (4.1) 初期化された場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。
  • (4.2)  処理A(3キー判定)
    文字キー($M_2$)が押下された場合、最初の文字キー($M_1$)が押下されてからセットされている親指キー($O$)が押下された時までの時間($t_{MO}$)と、セットされている親指キー($O$)が押下されてから次の文字キー($M_2$)が押下されるまでの時間($t_{OM}$)とを比較し、次のように文字を出力します。

    • (a) $t_{MO}≧t_{OM}$ならば、セットされている文字($M_1$)を出力し、押下された次の文字キー($M_2$)をセットし、親指キー($O$)が押下されてから文字キー($M_2$)が押下された時までの時間($t_{OM}$)から計算したタイムアウト時間($t_{OM}$*L/(1-L))をセットして、親指キー文字キー押下状態(S5)へ遷移します。
    • (b) $t_{MO}<t_{OM}$ならば、セットされている文字キーのセットされている親指キーに対応する文字($M_1O$)を出力し、押下された次の文字キー($M_2$)をセットし、単独打鍵判定時間($T_{th}*(1-J)/J$)をタイムアウト時間にセットして、文字キー押下状態(S2)へ遷移します。
  • (4.3) 親指キー($O_2$)が押下された場合、セットされている文字キーのセットされている親指キーに対応する文字($M_1O_1$)を出力し、新しく押下された親指キー($O_2$)をセットし、単独打鍵判定時間($T_{th}*(1-L)/L$)をタイムアウト時間にセットして、親指キー押下状態(S3)へ遷移します。

  • (4.4) 処理C (重なり厚み判定)
    当該文字キー($M$)がオフとなった場合、セットされている文字キー($M$)が押下されてからセットされている親指キー($O$)が押下された時までの時間($t_{MO}$)とセットされている親指キー($O$)が押下されてからセットされている文字キー($M$)がオフされるまでの時間($t_{Om}$)とを比較し、次のように文字を出力します。

    • (a) $t_{Om}/(t_{MO}+t_{Om})$<同時打鍵割合Jかつ$t_{Om}<τ$ ($τ$は実装依存の固定値)ならば、同時打鍵未成立と見做し、セットされている文字($M$)を出力し、親指キー(O)の押下を基準に単独打鍵判定時間($T_{th}*(1-L)/L$)をタイムアウト時間にセットして、親指キー押下状態(S3)へ遷移します。
    • (b) $t_{Om}/(t_{MO}+t_{Om})$≧同時打鍵割合Jまたは$t_{Om}≧τ$ならば、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。
    • $τ$は、キーが短時間だけ押下された場合を除外するためと思われます。紅皿 ver.0.1.4.4において、$τ$=400mSECです。
  • (4.5) 当該親指キー($O$)のオフ
    当該親指キー($O$)がオフとなった場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

    • 紅皿 ver.0.1.4.4にて、重なり厚み判定Fを削除。
  • (4.6) タイムアウト
    セットされている時間($t_{MO}$)が経過するとタイムアウトとします。タイムアウトとなった場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

(5)親指キー文字キー押下状態

  • (5.1) 初期化された場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

  • (5.2) 文字キー($M_2$)が押下された場合、セットされている文字キーのセットされている親指キーに対応する文字($M_1O$)を出力し、新しく押下された文字キー($M_2$)をセットし、単独打鍵判定時間($T_{th}$*(1-J)/J)をタイムアウト時間にセットして、文字キー押下状態(S2)へ遷移します。

  • (5.3) 処理B(3キー判定)
    親指キー($O_{2}$)が押下された場合、セットされている親指キー($O_{1}$)が押下されてからセットされている文字キー(M)が押下された時までの時間($T_{OM}$)と、セットされている文字キー(M)が押下されてから次の親指キー($O_{2}$)が押下されるまでの時間($T_{MO}$)とを比較し、次のように文字を出力します。

    • (a) $T_{OM}≧T_{MO}$ならば、セットされている親指キー($O_1$)を出力し、押下された次の親指キー($O_2$)をセットし、時間($T_{MO}$)から計算したタイムアウト時間($T_{MO}$*$J/(1-J)$)をセットして、文字キー親指キー押下状態(S4)へ遷移します。なお、連続モードが設定されている場合には、セットされている親指キー($O_1$)を出力しません。
    • (b) $T_{OM}<T_{MO}$ならば、セットされている文字キーのセットされている親指キーに対応する文字($MO_1$)を出力し、押下された次の親指キー($O_2$)をセットし、単独打鍵判定時間($T_{th}*(1-L)/L$)をタイムアウト時間にセットすると、親指キー押下状態(S3)へ遷移します。
  • (5.4) 文字キー($M$)がオフ

  • 当該文字キー($M$)がオフとなった場合、連続モードか否かに関わらず、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

  • ver.0.1.4.4にて処理E (重なり厚み判定)を削除。

  • (5.5) 処理D (重なり厚み判定)
    当該親指キー(O)がオフされた場合、セットされている文字キーが親指キーのシフト状態の1文字目であるか判定し、更にセットされている親指キー(O)が押下されてからセットされている文字キー(M)が押下された時までの時間($t_{OM}$)とセットされている文字キー(M)が押下されてから親指キー(O)がオフされるまでの時間($t_{Mo}$)とを比較し、次のように文字を出力します。

    • (a) セットされている文字キーが1文字目の文字キーならば、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。
    • (b) $t_{Mo}/(t_{OM}+t_{Mo})$<同時打鍵割合Lかつ$t_{Mo}<τ$ ($τ$は実装依存の固定値)ならば、時間($t_{Mo}$)をタイムアウト時間にセットして、親指キー文字キー押下後親指オフ押下状態(S6)へ遷移します。
    • (c) $t_{Mo}/(t_{OM}+t_{Mo})$≧同時打鍵割合Lまたは$t_{Mo}≧τ$ ($τ$は実装依存の固定値)ならば、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。
    • 紅皿 ver.0.1.4.4以降、文字キーの1文字目を判定。
    • $τ$は、キーが短時間だけ押下された場合を除外するためと思われます。紅皿 ver.0.1.4.4において、$τ$=400mSECです。
  • (5.6) タイムアウト
    セットされている時間($t_{OM}$)が経過するとタイムアウトとします。タイムアウトとなった場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

(6)親指キー文字キー押下後親指オフ状態

  • (6.1) 初期化された場合、セットされている親指キーに対応する文字($O$)を出力し、セットされている文字キーに対応する文字($M$)を出力し、初期状態(S1)へ遷移します。

  • (6.2) 文字キー($M_2$)が押下された場合、セットされている親指キーに対応する文字($O$)を出力し、セットされている文字キーに対応する文字($M_1$)を出力し、新しく押下された文字キー($M_2$)をセットし、単独打鍵判定時間($T_{th}*(1-J)/J$)をタイムアウト時間にセットして、文字キー押下状態(S2)へ遷移します。

  • (6.3) 親指キー($O_2$)が押下された場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、親指キー($O_2$)をセットし、単独打鍵判定時間($T_{th}*(1-L)/L$)をタイムアウト時間にセットすると、親指キー押下状態(S3)へ遷移します。

  • (6.4) 当該文字キー($M$)がオフされた場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

  • (6.5) セットされた時間($t_{Mo}$)が経過してタイムアウトした場合、セットされている親指キーに対応する文字($O$)を出力し、セットされている文字キーに対応する文字($M$)を出力し、初期状態(S1)へ遷移します。

S1) 初期状態 S2) Mオン状態 S3) Oオン状態 S4) M→Oオン状態 S5) O→Mオン状態 S6) O→M→Oオフ状態
初期化 M出力、 S1)へ O出力、 S1)へ MO出力、 S1)へ MO出力、 S1)へ セットされていた O出力、M出力、 S1)へ
文字キー(M)オン Mセット、 S2)へ セットされていたM出力、 新Mセット、 S2)まま Mセット、 S5)へ 処理A (3キー判定) MO出力、 新Mセット、 S2)へ セットされていたMO出力、新Mセット、 S2)へ
親指(O)オン Oセット、 S3)へ Oセット、 S4)へ セットされていた O出力、 新Oセット、 S3)まま MO出力、 新Oセット、 S3)へ 処理B (3キー判定) セットされていた MO出力、 新Oセット、 S3)へ
文字キー (M)オフ 当該Mキーオフの場合、 M出力、 S1)へ 処理C (重なり厚み判定) MO出力、S1)へ セットされていた MO出力、 S1)へ
親指(O)オフ 当該Oオフの場合、 O出力、 S1)へ MO出力、S1)へ 処理D (重なり厚み判定)
タイムアウト $T_{th}$ -- M出力、 S1)へ MO出力、 S1)へ MO出力、 S1)へ セットされていた O出力、 M出力、 S1)へ

注1(初期化):初期化を引き起こす事象は、機能キーなどの非文字キーの打鍵である。
注2(タイムアウト):S2)は、単独打鍵判定時間($T_{th}*(1-J)/J$)、S4)は文字(M)キーオンから親指(O)オンまでの時間から算出、S5)は親指(O)オンから文字キー(M)オンまでの時間から算出、S6)は文字キー(M)オンから親指(O)オフまでの時間
注3(親指キーのタイムアウト抑制):Oオン状態で1文字目の文字キーの場合、タイムアウトになってもOを出力せずに、 Oオンの状態にとどまる。

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kenichiro_ayaki
第1種情報処理技術者 電気通信主任技術者 弁理士

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?