2020年11月24日

【自キ】ファームウェアで何ができるか

キーボードのファームウェアって? 役割とその仕組みを知ると自作キーボードがもっと楽しくなる
https://www.itmedia.co.jp/news/spv/2011/24/news029_0.html#utm_term=share_sp

大体なんでもできる(容量の問題はあるが)けど、
その前に知っておいたほうがいい基礎知識。


キーボードのキーには二種類ある。
普通のキーと、修飾キー(モデファイア)だ。

普通のキーは、押した瞬間に挙動が発生する。
離しの瞬間はどうでもいい。
そのキーを一回離さないと、もう一度同じキーを入力できないだけの話だ。
(今、キーリピートは一切考えないとする)

これがゆえに、
「ABCを順番に押し、離しは問わない」という、
ロールオーバー入力が可能になる。
ロールオーバーは高速入力の要だ。
qwerty配列のJIなどは高速ロールオーバーの代表例で、
我々は10本指で打つため、
最大10キーのロールオーバーが出来ることになる。
(足の指が使えれば20、鼻や舌を使えばもっと?)

楽器のドラムのように、
「叩いた瞬間鳴る」がイメージだろうか。

一方、修飾キーは、
押した瞬間には何もなく、
「押しながら他のキーを押した瞬間、機能が発動」
する仕様だ。
Shift、Ctrlがその代表で、
Alt、Winは、
「単押しキーと、モデファイアを兼ねたキー」だ。

また、修飾キーは押しっぱなしている限り、
複数の入力に効く。
Shift+fuckですべて大文字になるわけだね。


さて本題。
ファームウェアで何が出来るか?

大きく4つある。

1. 好きなキーを好きなキーに定義できる
(狭義のリマップ)
2. マクロをつくれる
3. 自分定義のモデファイアがつくれる
4. レイヤーを明示的に定義して、恒久的に切り替える


1は誰でもわかると思う。
CapsLockのある自作キーボードはほとんどない。
こんなもん駆逐だ。
その位置にCtrlを持ってくるのは、
リマップのほとんど初手だよね。
あるいは親指のいい位置に、
IMEのオンオフを、Macライクに持ってくることも人気。
配列道の人は、DvorakやEucalynにアルファベットを入れ替えるだろう。

2は、たとえば「Ctrl+Z」「Alt+`」なんかを1キーに定義できるわけだ。
僕がよく使うのは「記号+エンター」。
?!「」()などの日本語記号を入力即確定させられるぞ。
もちろん長い文字列や複雑な操作を1キーにコマンド化することもできる。

3は、モデファイアを新造できるということ。
あるキーを第二シフトキーと定義して、
それを押している間は別のキーになる
(記号、ショートカットマクロ、テンキーなど)ように、
組むことができる。

この新造モデファイアは、
自作キーボードではよく、Lower、Raise、Adjustキーと呼ばれる。
Meta、Hyper、Superの組みもたまに見る。
タイプライター時代は、記号はFigというキーを押しながらだった。
べつにShift2、Shift3、Special、Preniumとかでもいいぞ。
ネーミングは好きにすればいい。

これはつまり、
そのキーを押している間だけ、
キーボードが別のキーボードになるイメージで、
「レイヤーを持つ」という風に考える。
あるモデファイアが、別のレイヤーに一時的に切り替えるわけだ。
(離すと元に戻る)

Ctrlというモデファイアは、
それを押している間だけCtrl+A〜Zショートカットマクロのレイヤーに切り替えているわけだ。
Shiftというモデファイアは、
それを押している間だけ、大文字と記号レイヤーに切り替えるわけだ。


僕はRaiseレイヤーにはテンキーと記号、
Lowerレイヤーには制御系のキーと左手ショートカットを入れている。

こうした、
「自分の使いやすいモデファイアとレイヤーを考えること」が、
広義のキーリマップだと思われる。


さて、
レイヤーは一時的にも切り替えられるし、
恒久的な切り替えも可能だ。それが4。

たとえばqwertyレイヤーをデフォにしておき、
IMEオンキーを、オン+カナレイヤー切り替えマクロに定義して、
カナ配列レイヤーに切り替え、
IMEオフキーを、オフしてqwertyに戻る、
なんてことも可能だ。

あるいは、
qwertyとショートカットキーレイヤーを切り替えて、
ある作業中はその作業専用キーボードになるような使い方もあり得るだろう。



ちなみにQMKはc++で記述されるので、
c++でできることは全てできる。
変数を定義し、条件分岐させるのも簡単だ。
キーのオン(押された瞬間)とオフ(離した瞬間)を検知できるため、
これを検知して条件分岐させることはよくやる。

キー入力バッファをためて、
離した瞬間に同時押しを検知させたり、
同時押しが定義されていない部分は普通にロールオーバー扱いするように組んでも良い。
(QMK薙刀式はそのように組まれている。僕の理解があってれば)

あるいは、
「あるキーを押したときに限り、
そのあとの1文字入力だけ別レイヤーを適用」
という月配列にもってこいの関数もあるよ。
レイヤー操作に関しては、デフォルトの関数がたくさん用意されている。
トグルでレイヤーにしたり、
同時押しの検知msを操作したり、
任意msにn回押し(ダブルクリック、タップダンス)を検知することもできる。

カナ配列でいうところの、
同時押しや連続シフトなどもいくらでも組めるので、
あとはc++が読み書きできればいかようにもできる。



これらを色々組み合わせて、
自分のキーボードをベストのキーの組み合わせにしていくのが、
キーリマップ沼だ。

一回変えられるとわかってしまったら、
「ちょっと配置変えてみよ」がすぐできるため、
いくらでも試行錯誤が可能で、
すぐに手応えが返ってくるのがおもしろい。

僕は「台所の道具配置」にたとえているが、
そのうち煮詰まってきてベスト配置に落ち着いてくると思う。


キーの印字?
無刻印のほうが圧倒的に試行錯誤がはええよ。
現在のキーマップを紙にメモっとくほうが速い。
決まったらそのときに印字を考えればいいけど、
その頃には無刻印で打てるようになってるので、
大抵問題ない。

ということで、
刻印キーキャップを使う人は、
まだキーリマップをファームウェアで弄ってない人か、
ごりごりに弄ってるのでどうでもいいやと諦めた人の、
二種類いる。

僕は無刻印派だけど、
イベント用のオシャレキーキャップをつくろうかな、
なんてことも考えている。
「ほほう、そんなキーマップですか」と話すのも、
キーボードイベントの醍醐味だからね。
posted by おおおかとしひこ at 15:59| Comment(0) | カタナ式 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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