2021年03月03日

【薙刀式】「同時押し」の整理

自作キーボードの記事などを見ていると、
違うもののことを同時押しと言ってたりして、
用語の混乱がまだあるようだ。

広義の「同時押し」と、
狭義の同時押しを整理しておく。


広義の同時押し
【通常シフト】
【ワンショットモデファイア】
【Mod Tap】
【ロールオーバー】
【前置シフト】

狭義の同時押し
【タイマー同時押し】
【重なり判定での同時押し】
【相互シフト】
【同時かつ連続シフト】

といったところか。
名称は揺れがあるが、一般的なものとした。



【通常シフト】
先押し○ 先離し○ キーリピートB 連続○ 単キー×

「Aを押しながらBを押すとXになる」もの。
Aは先押し、少なくともBが押されている瞬間は、
Aは押されていなくてはならない。
離しの順は問わない。
Shift、Ctrlが代表的。

ロジック的には、
「Bが押された瞬間、Aも押されているか」で判定するのが多いだろう。
カーソルキーなど、Bはリピート対応が一般的。
また、「Aを押しながらBCD…と押してXYZを出す」
と、連続して効かせることが可能。

このキーはシフト専用で、Aを押して離しても何も起こらない。
起こるものは次のワンショットモデファイア扱い。

QMKでMod Tapを制御するときは、
#define PERMISSIVE_HOLD
を使うと、単キー押し(Tap)でも強制的にHold扱いできるよ。
#define IGNORE_MOD_TAP_INTERRUPT
だと、Aの先離しはTapと定義でき、
ロールオーバー対応が可能になるよ。


【ワンショットモデファイア】
先押し○ 先離し○ キーリピートB 連続○ 単キー○

通常シフトに加えて、
「他に何も押さずA単独で押したときはAにする」
と、単キーと兼ねるシフトキー。
Alt、Winなど。

Macの英数、かなをLower、Raiseにする例はよく見るよね。
30%キーボードなどでは制御キーが足りないので、
ZXCVなどのマイナー文字キーを、
ワンショットモデファイアにする例をよく見る。
古典的にはSandS(Space and Shift)という、
スペースキーとシフトキーの兼用がよく使われた。
「スペースキーを押して、離す前に何かを押せばシフトキー扱い、
単に離せばスペースキー扱い」である。

QMKでは一旦Hold扱いになったとしても、
#define RETRO_TAPPING
を定義すると、
どんなに長押ししても離したら単キー押し扱いにすることができるよ。

また、Aキーのリピートをオフしたいときは、
#define TAPPING_FORCE_HOLD_PER_KEY
で各キーを定義すると良い。


【Mod Tap】
先押し○ 先離し× キーリピートB 連続○ 単キー○

QMK特有のもの。
「Aを押して○ms以内に離せば単キー押し、
Aを押して○ms以降は通常シフトキーの扱い」
というもの。
○のデフォルトは200ms(1/5sec)。
一見良さげなんだけど、
「ちょっと待つ」の具合のコントロールが意外と難しい。

僕は、上にあげたオプションを使い分けて制御している。


【ロールオーバー】
先押し○ 先離し○ キーリピートAB 連続× 単キー○

厳密には同時押し狙いではないが、
「同時押しのように2キーをロールオーバーすると最速でタイピングできる」
ため、重要だと思い取り上げた。

つまり、同時押し系を定義しているキーAと、
Bをロールオーバーしたときに、
Xと判定するのか、
ABのロールオーバーと判定するのか、
という問題がある。

ABのロールオーバーのつもりなのにXに化けたり、
Xを出したつもりなのにABに化けたりしないように、
うまく調整しなければならない、やっかいなやつ。

離しを意識しなくて良いから、
バリバリとロールオーバーできる配列は気持ちが良い。


【前置シフト】
先押し○ 先離し○ キーリピート× 連続× 単キー×

これも同時押しではないが、まとめてあげておく。
「AのあとにBを打った時のみX」になるパターン。
A単押しには対応しない。
メリットは、
上のようなロールオーバーなのかシフトなのか、
何も考える必要がなくただロールオーバーでシフトを打てること。
qwertyローマ字のトップタイパーは、
14子音の前置シフト5キー配列を使っていて、
ロールオーバーバリバリだから速い、という説がある。

デメリットは、
打鍵数が増えて負担が大きいことと、
シフトキーAに単押し機能を定義できないこと、
Aを打ったあとキャンセルキーがないこと、
だろうか。
月配列系に使われ、高速性能の根拠となる部分だ。


これらは同時押しじゃないんだけど、
言葉の綾で「通常シフトみたいなやつ」と説明するのが面倒なので、
「レイヤーキーと同時押しで…」みたいに誤用されることがとても多い。
しかしいずれもAを先押ししなければならない制約がある。

狭義の同時押しは、
「ABを同時に押す(順番は問わない)」だ。



【タイマー同時押し】
先押し× 先離し○ キーリピート× 連続× 単キー○

「AとBの押された時間が○ms以内だと同時押し、
以上だとロールオーバー」
という単純なロジックで判定するもの。
初心者は120〜80ms程度、中級者は70〜50程度、
上級者は40以下でも同時押し精度がある。

メリットは実装が比較的楽なこと。
デメリットはタイマーの設定をいくつにするべきか個人差があること、
ロールオーバーのためには一瞬待つべきなところか。


【重なり判定での同時押し】
先押し× 先離し○ キーリピート× 連続× 単キー○

「AとBの押してから離すまでの、重なりが○%以上あれば同時押し、
以下ならロールオーバー」
と判定する。
同時押しを押すときは大抵同時近くで離すだろう、
ロールオーバーなら、先押した方を先に離すだろう、
という「人間の押し方の癖」を反映させたもの。

メリットはタイマー同時押しより直感的な判定になること。
デメリットは実装の難しさと、
離した瞬間に判定があるため、モッサリすることかな。


【相互シフト】
先押し× 先離し○ キーリピート× 連続○ 単キー○

「AとBが同時に押されている瞬間さえあれば同時とみなし、
重なりが0なら同時ではない」
という判定。上のものを1と0に二値化したもの。
AもBもどちらもシフトキー扱い、という意味。

メリットは使う人間にとって、
ミスタイプした原因が分かりやすく、
打鍵を修正しやすいこと。
連続シフトにも対応する。
デメリットは、離し入力を意識しないといけないので、
ロールオーバーほど高速に行けないこと。


【同時かつ連続シフト】
先押し× 先離し○ キーリピート× 連続○ 単キー○

重なり判定での同時押しは、
連続シフトを許容する場合としない場合がある。
本来は許容しない(シフトはひとつにしかかからない)ものを、
複数連続シフトできるように許容した場合は、
特別に「同時連続シフト」とわざわざ言うことがある。

飛鳥配列が採用していることで有名だけど、
飛鳥以外の後続が出てきてないのは不思議だね。
メリットは、連続シフトのままアルペジオを仕込めること。
デメリットは離すタイミングを意識しなければならないこと。



薙刀式は、
スペースキーを【通常シフト】にしてシフト面をひとつ増やし、
文字領域、主に人差し指と【相互シフト】にすることで、
最大3キーの【相互シフト】で濁音、半濁音、小書き、拗音、外来音を打つ配列だ。
(なおQMK版はスペースキーを【相互シフト】にオプションで変更可能)

親指シフトは、
親指の2キーを【タイマー同時押し】で、
同手同時でシフト面を打ち、
逆手同時で濁音面を打つ、3面配列である。
(実装によっては【相互シフト】【重なり判定での同時押し】もある)

飛鳥は、
親指の2キーを【同時連続シフト】で、
通常面、左親指面、右親指面の3面を使い分ける配列である。

新下駄は、
逆手の中指と薬指を、【ワンショットモデファイア】として、
【重なり判定での同時押し】(実装によっては【タイマー同時押し】)で、
3面および拗音半面×2を使い分ける同時押し配列だ。

月配列は、
DまたはKを【前置シフト】専用キーにして、
単打面とシフト面の2面を使う配列だ。

新JISは、
スペースキーを【通常シフト】に使い、
単打面とシフト面の2面を使う配列である。
(設計はスペースキーだったが、
メーカーの実装は小指のシフトキーだったという不遇事件がある)

JISカナは、
小指のシフトキーを【通常シフト】に使い、
小書き、句読点、「を」を出す配列。

英語タイピングは、
小指のシフトキーを【通常シフト】に使い、
大文字、":?!などの記号を出す。

qwertyローマ字は、
小指のシフトキーを【通常シフト】に使うと、
アルファベットの大文字を打てる。



薙刀式、親指シフト、飛鳥、新下駄などは、
同じ同時押しという言葉を使っていても、
その内容が微妙に異なることが多い。

そして最近自作キーボードでも、
広義の同時押し(Mod Tapの解説など)をよく使うので、
誤用を避けるために知る限りをまとめておいた。


参考にされたい。
間違ってたら正してください。
posted by おおおかとしひこ at 14:53| Comment(0) | カタナ式 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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