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

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

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

#3. 鍵盤配列
- 鍵盤の配列は、ローマ字モード６面と、英数モード６面の全１２面です。ローマ字モードは、インプット・メソッド（IME）をローマ字入力のひらがな・全角カタカナ・半角カタカナに設定したときのモードであり、英数モードは、インプット・メソッドを全角英数・半角英数・直接入力に設定したときのモードです。

##3.1 各配列名とシフト操作との関係
| 配列名|シフト操作|
|:-----|:--------|
|ローマ字シフト無し	|シフト無し|
|ローマ字右親指シフト	|右親指キーと共に文字キー打鍵|
|ローマ字左親指シフト	|左親指キーと共に文字キー打鍵|
|ローマ字小指シフト	|小指シフト（ダミー）|
|ローマ字小指右親指シフト	|小指シフトした状態で、右親指キーと共に文字キー打鍵（ダミー）|
|ローマ字小指左親指シフト	|小指シフトした状態で、右親指キーと共に文字キー打鍵（ダミー）|
|英数シフト無し		|シフト無し|
|英数右親指シフト		|右親指キーと共に文字キー打鍵|
|英数左親指シフト		|左親指キーと共に文字キー打鍵|
|英数小指シフト		|小指シフト|
|英数小指右親指シフト	|小指シフトした状態で、右親指キーと共に文字キー打鍵|
|英数小指左親指シフト	|小指シフトした状態で、右親指キーと共に文字キー打鍵|
###3.1.1　ローマ字モード
ローマ字入力モードにおける各配列は、次によります。
![2021-04-11 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266273/b972d1e7-a986-8ff3-875b-6360405e603a.png)

###3.1.2　英数モード　
英数モードにおける各配列は、次によります。
![2021-04-11 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266273/346eebe8-9d0c-c972-dde6-5c9e6c62eda8.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)と文字同時打鍵の判定時間($T_s$*(1-N)/N)のうち大きい方をタイムアウト時間にセットします。最大同時打鍵数Ｓが１を超えているならば、タイムアウト時間を無限大とします。そして、文字キー押下状態(S2)へ遷移します。
- (1.2)　親指キーが押下された場合、当該親指キー(O)をセットし、単独打鍵判定時間($T_{th}$*(1-L)/L)をタイムアウト時間にセットして、親指キー押下状態(S3)へ遷移します。

###(2) 文字キー押下状態(M)
- (2.1)　初期化された場合、セットされている文字($M$)を出力し、初期状態(S1)へ遷移します。
- (2.2)　処理G（組み合わせ判定）
第２文字キー($M_2$)が押下された場合、最大同時打鍵数Sと同時打鍵の有無を判定します。
	- (a)	第２文字キー($M_2$)の最大同時打鍵数Sが１か、または最大同時打鍵数Sが２で文字($M_1$)と文字($M_2$)の組み合わせの同時打鍵パターンがなければ、セットされている文字($M_1$)を出力し、文字キー($M_2$)をセットします。そして、セットした文字の最大同時打鍵数Ｓが１以下ならば、親指シフトの判定時間($T_{th}$*(1-J)/J)と文字同時打鍵の判定時間($T_{s}$*(1-N)/N)のうち大きい方をタイムアウト時間にセットします。最大同時打鍵数Ｓが１を超えているならば、タイムアウト時間を無限大とします。そして、文字キー押下状態(S2)のまま遷移しません。
	- (b)	第２文字キー($M_2$)の最大同時打鍵数Sが３か、または最大同時打鍵数Sが２で文字($M_1$)と文字($M_2$)の組み合わせの同時打鍵パターンがあれば、文字キー($M_1$)と文字キー($M_2$)をセットします。セットした文字の最大同時打鍵数Ｓが２以下ならば、タイムアウト時間を同時打鍵判定時間($T_{s}$)にセットします。セットした文字の最大同時打鍵数Ｓが２を超えているならば、タイムアウト時間を無限大とします。そして、文字キー２押下状態(S7)へ遷移します。
- (2.3)　親指キー($O$)が押下された場合、当該親指キー($O$)をセットし、文字キー($M$)が押下されてから親指キー($O$)が押下された時までの時間($t_{MO}$)から算出したタイムアウト時間($t_{MO}$*J/(1-J))をセットして、文字キー親指キー押下状態(S4)へ遷移します。
- (2.4)　当該文字キー($M$)がオフとなった場合、セットされている文字($M$)を出力し、初期状態(S1)へ遷移します。
- (2.5)　タイムアウト時間が経過するとタイムアウトとします。タイムアウトとなった場合、セットされている文字($M$)を出力し、初期状態(S1)へ遷移します。

###(3) 親指キー押下状態（O）
- (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) 文字キー親指キー押下状態（MO）
- (4.1)　初期化された場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。
- (4.2)　 処理A（３キー判定）
文字キー($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.8において、$τ$=400mSECです。
- (4.5)　当該親指キー($O$)のオフ
当該親指キー($O$)がオフされた場合、セットされている文字キー($M$)が押下されてからセットされている親指キー(O)が押下された時までの時間($t_{MO}$)とセットされている親指キー($O$)が押下されてからセットされている親指キー($O$)がオフされるまでの時間($t_{Oo}$)から重なり厚みを算出し、次のように文字を出力します。
	- (a)　重なり厚みが同時打鍵の最小割合未満ならば、同時打鍵未成立と見做し、セットされている文字($M$)を出力し、セットされている親指キー($O$)を出力して、初期状態(S1)へ遷移します。
	- (b)　 重なり厚みが同時打鍵の最小割合以上ならば、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。
- (4.6)　タイムアウト
セットされている時間が経過するとタイムアウトとします。タイムアウトとなった場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

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

- (5.2)　文字キー($M_2$)が押下された場合、最大同時打鍵数Sと同時打鍵の有無を判定します。
	- (a)	第２文字キー($M_2$)の最大同時打鍵数Sが１か、または最大同時打鍵数Sが２で文字($M_1$)と文字($M_2$)の組み合わせの同時打鍵パターンがなければ、セットされている文字キーのセットされている親指キーに対応する文字($M_1O$)を出力し、新しく押下された文字キー($M_2$)をセットします。そして、セットした文字の最大同時打鍵数Ｓが１以下ならば、単独打鍵判定時間($T_{th}$*(1-J)/J)をタイムアウト時間にセットします。セットした文字の最大同時打鍵数Ｓが１以下ならば、タイムアウト時間を無限大とします。そして、文字キー押下状態(S2)へ遷移します。
	- (b)	第２文字キー($M_2$)の最大同時打鍵数Sが３か、または最大同時打鍵数Sが２で文字($M_1$)と文字($M_2$)の組み合わせの同時打鍵パターンがあれば、３キー判定を行います。
		- (α) $T_{OM}$＜$T_{12}$ならば、セットされている文字キーのセットされている親指キーに対応する文字($M_1O$)を出力し、新しく押下された文字キー($M_2$)をセットします。そして、セットした文字の最大同時打鍵数Ｓが１以下ならば、単独打鍵判定時間($T_{th}$*(1-J)/J)をタイムアウト時間にセットします。セットした文字の最大同時打鍵数Ｓが１以下ならば、タイムアウト時間を無限大とします。そして、文字キー押下状態(S2)へ遷移します。
		- (β) $T_{OM}$≧$T_{12}$ならば、セットされている親指キー($O$)を出力し、新しく押下された文字($M_2$)をセットします。そして、セットした文字の最大同時打鍵数Ｓが１以下ならば、タイムアウト時間を同時打鍵判定時間($T_s$)にセットします。セットした文字の最大同時打鍵数Ｓが２を超えているならば、タイムアウト時間を無限大とします。そして、文字キー２押下状態(S7)に遷移します。

- (5.3)　処理B（３キー判定）
親指キー($O_2$)が押下された場合、セットされている親指キー($O_1$)が押下されてからセットされている文字キー(M)が押下された時までの時間($T_{OM}$)と、セットされている文字キー(M)が押下されてから次の親指キー($O_2$)が押下されるまでの時間($T_{MO}$)とを比較し、次のように文字を出力します。
	- (a)  $T_{OM}$≧$T_{MO}$か、または連続モードならば、セットされている親指キーに対応する文字($MO_1$)を出力し、押下された次の親指キー($O_2$)をセットし、単独打鍵判定時間($T_{th}$*(1-J)/J)をタイムアウト時間にセットして、親指キー押下状態(S3)へ遷移します。
	- (b)  $T_{OM}$＜$T_{MO}$ならば、セットされている親指キー($O_1$)を出力し、押下された次の親指キー($O_2$)をセットし、時間$t_{MO}$から算出したタイムアウト時間($t_{MO}$*J/(1-J))をセットして、文字キー親指キー押下状態(S4)へ遷移します。
- (5.4)　文字キー($M$)がオフ
- 当該文字キー($M$)がオフされた場合、連続モードか否かに関わらず、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

- (5.5)　当該親指キー($O$)オフ
当該親指キー($O$)がオフされた場合、連続モードがオンならば、セットされている文字キーが親指キーの当該シフト状態における１文字目であるか判定し、更にセットされている文字キー($M$)が押下されてから親指キー($O$)がオフされるまでの重なり時間($t_{Mo}$)を親指シフトの判定時間$T_{th}$と比較します。
	- (a)	セットされている文字キーが当該シフト状態での１文字目か、または重なり時間が判定時間$T_{th}$以上ならば、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。
	- (b)	上記以外ならば、親指キーがオフされた時間から重なり時間($t_{Mo}$)が経過したときをタイムアウト時間にセットして、親指キー文字キー押下後親指オフ状態(S6)へ遷移します。
	- τは、キーが短時間だけ押下された場合を除外するためと思われます。紅皿 ver.0.1.4.8において、τ=400mSECです。
	- ※紅皿 ver.0.1.4.4以降、文字キーが当該シフト状態での１文字目かを判定。

- (5.6)　タイムアウト
セットされている時間が経過するとタイムアウトとします。タイムアウトとなった場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

###(6)親指キー文字キー押下後親指オフ状態（OMo）
- (6.1)　初期化された場合、セットされている親指キーに対応する文字($O$)を出力し、セットされている文字キーに対応する文字($M$)を出力し、初期状態(S1)へ遷移します。

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

- (6.3)　親指キー($O_2$)が押下された場合、セットされている親指キー($O$)を出力し、新しく押下された親指キー($O_2$)をセットし、文字キー($M$)が押下されてから親指キー($O$)が押下された時までの時間($t_{MO}$)から算出したタイムアウト時間($t_{MO}$*J/(1-J))をセットして、文字キー親指キー押下状態(S4)へ遷移します。
- (6.4)　当該文字キー($M$)がオフされた場合、セットされている文字キーのセットされている親指キーに対応する文字($MO$)を出力し、初期状態(S1)へ遷移します。

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

###(7)文字キー２押下状態（MM）
- (7.1)　初期化された場合、同時打鍵パターンを判定します。
	- (a)	セットされていた文字($M_1$)($M_2$)の組み合わせの同時打鍵パターンが有れば、同時打鍵($M_{12}$)を出力し、初期状態(S1)へ遷移します。
	- (b)	セットされていた文字($M_1$)($M_2$)の組み合わせの同時打鍵パターンがなければ、セットされている文字($M_1$)と文字($M_2$)を順次出力し、初期状態(S1)へ遷移します。
- (7.2)　処理H（組み合わせ判定と３キー判定）
第３文字キー(M3)が押下された場合、同時打鍵パターンを判定します。
	- (a)	セットされていた文字($M_1$)($M_2$)と文字($M_3$)の組み合わせの同時打鍵パターンが有れば、文字キー($M_3$)をセットして、同時打鍵($M_{123}$)を出力すると、初期状態(S1)へ遷移します。
	- (b)	セットされていた文字($M_1$)($M_2$)と文字($M_3$)の組み合わせの同時打鍵パターンがなければ、組み合わせ判定と３キー判定を行います。
		- (α) 文字($M_{12}$)の組み合わせがあり、かつ$T_{12}$＜$T_{23}$ならば、同時打鍵($M_{12}$)を出力して、文字($M_3$)をセットして、親指シフトの判定時間($T_{th}$*(1-J)/J)と文字同時打鍵の判定時間($T_s$*(1-N)/N)のうち大きい方をタイムアウト時間にセットして、文字キー($M_1$)押下状態(S2)へ遷移します。
		- (β) 文字($M\_{12}$)の組み合わせがないか、または$T\_{12}$≧$T\_{23}$ならば、文字($M_1$)を出力して、セットされていた文字($M_2$)を($M_1$)とし、文字キー($M\_3$)を($M\_2$)にセットして、タイムアウト時間を同時打鍵判定時間($T_s$)にセットすると、文字キー２押下状態(S7)のまま遷移しません。
- (7.3)　処理J（親指キー($O$)押下時の組み合わせ判定と３キー判定）
親指キー($O$)が押下された場合、同時打鍵パターンを判定します。
	- (a)	セットされていた文字($M_1$)と文字($M_2$)の組み合わせの同時打鍵パターンがなければ、文字キー($M_1$)を出力して、当該親指キー($O$)をセットし、文字キー($M_2$)が押下されてから親指キー($O$)が押下された時までの時間($t_{MO}$)から算出したタイムアウト時間($t_{MO}$*J/(1-J))をセットして、文字キー親指キー押下状態(S4)へ遷移します。
	- (b)	セットされていた文字($M_1$)と文字($M_2$)の組み合わせの同時打鍵パターンが有れば、３キー判定を行います。
		- (α) 文字キー($M_1$)が押下されてから文字キー($M_2$)が押下された時までの時間($t_{12}$)が、文字キー($M_2$)が押下されてから親指キー($O$)が押下された時までの時間($t_{MO}$)よりも小さいならば、同時打鍵($M_{12}$)を出力します。そして親指キー($O_2$)をセットし、単独打鍵判定時間($T_{th}$*(1-L)/L)をタイムアウト時間にセットすると、親指キー押下状態(S3)へ遷移します。
		- (β) 文字キー($M_1$)が押下されてから文字キー($M_2$)が押下された時までの時間($t_{12}$)が、文字キー($M_2$)が押下されてから親指キー($O$)が押下された時までの時間($t_{MO}$)以上ならば、文字キー($M_1$)を出力して、当該親指キー($O$)をセットし、文字キー($M_2$)が押下されてから親指キー($O$)が押下された時までの時間($t_{MO}$)から算出したタイムアウト時間($t_{MO}$*J/(1-J))をセットして、文字キー親指キー押下状態(S4)へ遷移します。

- (7.4)　処理I（重なり厚み判定）
第１文字キー($M_1$)がオフされた場合、文字($M_{12}$)の組み合わせがあるか否かを判定します。
	- (a)	セットされていた文字($M_1$)と文字($M_2$)の組み合わせの同時打鍵パターンが無ければ、セットされていた文字($M_1$)を出力して、文字($M_2$)を($M_1$)に置き換えます。そして、セットした文字の最大同時打鍵数Ｓが１以下ならば、文字($M_1$)オンから、親指シフトの判定時間($T_{th}$*(1-J)/J)と文字同時打鍵の判定時間($T_s$*(1-N)/N)のうち大きい方だけ経過したときをタイムアウト時間にセットします。最大同時打鍵数Ｓが１を超えているならば、タイムアウト時間を無限大とします。そして、文字キー押下状態(S2)へ遷移します。

	- (b)	セットされていた文字($M_1$)と文字($M_2$)の組み合わせの同時打鍵パターンが有れば、第２文字キー($M_2$)が押下されて第１文字キー($M_1$)がオフされるまでの打鍵の重なり時間($T_{2_1}$)を、第１文字キー($M_1$)が押下されてオフされるまでの時間($T\_{1_1}$)で除算して、重なり厚みを算出します。

		- (α) 重なり厚みが同時打鍵時間の最小割合N以上か、または重なり時間($T_{2_1}$)が判定時間以上ならば、同時打鍵($M_{12}$)を出力して、初期状態(S1)へ遷移します。
		- (β) 重なり厚みが同時打鍵時間の最小割合N未満、かつ重なり時間($T_{2_1}$)が判定時間未満ならば、文字($M_1$)オフから、判定時間($T_{2_1}$(1-N)/N)だけ経過したときをタイムアウト時間にセットすると、文字キー($M_1$)($M_2$)オン($M_1$)オフ状態状態(S8)へ遷移します。

- (7.5)　文字キー($M_2$)オフ
第２文字キー($M_2$)がオフされた場合、同時打鍵パターンを判定します。
	- (a)	セットされている文字($M_1$)($M_2$)の組み合わせの同時打鍵パターンが有れば、文字($M_1$)($M_2$)の同時打鍵($M_{12}$)を出力し、初期状態(S1)へ遷移します。

	- (b)	セットされている文字($M_1$)($M_2$)の組み合わせの同時打鍵パターンがなければ、文字($M_1$)と文字($M_2$)を順次出力し、初期状態(S1)へ遷移します。

- (7.6)　タイムアウト
同時打鍵判定時間($T_s$)が経過してタイムアウトすると、同時打鍵パターンを判定します。
	- (a)	セットされている文字($M_1$)($M_2$)の組み合わせの同時打鍵パターンが有れば、同時打鍵($M_{12}$)を出力し、初期状態(S1)へ遷移します。

	- (b)	セットされている文字($M_1$)($M_2$)の組み合わせの同時打鍵パターンがなければ、セットされている文字($M_1$)と文字($M_2$)を順次出力し、初期状態(S1)へ遷移します。

###(8) 文字キー(M1)(M2)オン(M1)オフ状態（MMm）
- (8.1)　初期化された場合、同時打鍵($M_{12}$)を出力し、初期状態(S1)へ遷移します。
- (8.2)　文字キー($M_3$)オン：処理H2

第３文字キー($M_3$)が押下された場合、処理H2として組み合わせ判定と３キー判定を行います。
	- (α) $T_{12}$＜$T_{23}$ならば、同時打鍵($M_{12}$)を出力して、文字($M_3$)をセットします。セットした文字の最大同時打鍵数Ｓが１以下ならば、タイムアウト時間を単独打鍵判定時間($T_s$*(1-L)/L)にセットします。最大同時打鍵数Ｓが１を超えているならば、タイムアウト時間を無限大とします。そして、文字キー押下状態(S2)へ遷移します。
	- (β) $T_{12}$≧$T_{23}$ならば、文字($M_1$)を出力して、セットされていた文字($M_2$)を($M_1$)とし、文字キー($M_3$)を($M_2$)にセットします。セットした文字の最大同時打鍵数Ｓが２以下ならば、タイムアウト時間を同時打鍵判定時間($T_s$)にセットします。セットした文字の最大同時打鍵数Ｓが２を超えているならば、タイムアウト時間を無限大とします。そして、文字キー２押下状態(S7)に遷移します。

- (8.3)　 親指キー(O)が押下された場合、処理J2として３キー判定を行います。
	- (α) 文字キー($M_1$)が押下されてから文字キー($M_2$)が押下された時までの時間($t_{12}$)が、文字キー($M_2$)が押下されてから親指キー($O$)が押下された時までの時間($t_{MO}$)よりも小さいならば、同時打鍵($M_{12}$)を出力します。そして親指キー($O_2$)をセットし、単独打鍵判定時間($T_{th}$*(1-L)/L)をタイムアウト時間にセットすると、親指キー押下状態(S3)へ遷移します。
	- (β) 文字キー($M_1$)が押下されてから文字キー($M_2$)が押下された時までの時間($t_{12}$)が、文字キー($M_2$)が押下されてから親指キー($O$)が押下された時までの時間($t_{MO}$)以上ならば、文字キー($M_1$)を出力して、当該親指キー($O$)をセットし、文字キー($M_2$)が押下されてから親指キー($O$)が押下された時までの時間($t_{MO}$)から算出したタイムアウト時間($t_{MO}$*J/(1-J))をセットして、文字キー親指キー押下状態(S4)へ遷移します。

- (8.3)　文字キー($M_2$)オフ：処理I2

第２文字キー($M_2$)がオフされた場合、第２文字キー($M_2$)が押下されて第１文字キー($M_1$)がオフされるまでの打鍵の重なり時間($T_{2_1}$)を、第２文字キー($M_2$)が押下されてからオフされるまでの時間($T_{2_2}$)で除算して、重なり厚みを算出します。
	- (a) 重なり厚みが同時打鍵時間の最小割合Lよりも小さいならば、セットされていた文字($M_1$)と文字($M_2$)を順次出力して、初期状態(S1)へ遷移します。
	- (b) 重なり厚みが同時打鍵時間の最小割合L以上ならば、セットされている文字($M_1$)($M_2$)の同時打鍵($M_{12}$)を出力し、初期状態(S1)へ遷移します。

- (8.4)　タイムアウト

タイムアウトすると、セットされている文字($M_1$)と($M_2$)を順次出力し、初期状態(S1)へ遷移します。


|  |S1) 初期状態|S2) Mオン状態|S3) Oオン状態|S4) M→Oオン状態|S5) O→Mオン状態|S6) O→M→Oオフ状態|S7) MMオン状態|S8) MMオンMオフ状態|
|:-----------------|:-----------------:|:------------------:|:-----------------:|:------------------:|:-----------------:|:------------------:|--:|--:|
| 初期化|－|M出力、 S1)へ|O出力、 S1)へ|MO出力、 S1)へ|MO出力、 S1)へ|セットされていた O出力、M出力、 S1)へ|セットされていた2文字出力,S1)へ|セットされていた2文字を順次出力,S1)へ|
|文字キー(M)オン|Mセット、 S2)へ|処理G(組合せ判定)|Mセット、 S5)へ|処理A (3キー判定)|MO出力、 新Mセット、 S2)へ|セットされていたMO出力、新Mセット、 S2)へ|処理H(組合せ判定と3キー判定)|処理H2(組合せ判定と3キー判定)|
|親指(O)オン|Oセット、 S3)へ|Oセット、 S4)へ|セットされていた O出力、 新Oセット、 S3)まま|MO出力、 新Oセット、 S3)へ|処理B (3キー判定)|セットされていた MO出力、 新Oセット、 S3)へ|処理J(3キー判定)|処理J2(3キー判定)|
|文字キー (M)オフ|－|当該Mキーオフの場合、 M出力、 S1)へ|－|処理C (重なり厚み判定)|MO出力、S1)へ|セットされていた MO出力、 S1)へ|処理I(重なり厚み判定)|処理I2(重なり厚み判定)|
|親指(O)オフ|－|－|当該Oオフの場合、 O出力、 S1)へ|MO出力、S1)へ|処理D (重なり厚み判定)|－|ー|ー|
|タイムアウト $T_{th}$|--|M出力、 S1)へ|－|MO出力、 S1)へ|MO出力、 S1)へ|セットされていた O出力、 M出力、 S1)へ|セットされていた2文字出力,S1)へ|セットされていた2文字を順次出力,S1)へ|

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