前回は自作キーボードキット「Iris」を組み立て、機能させるためのデフォルトキーマップを書き込んだところで終わった。だがこれでは自作キーボードとしては画竜点睛を欠いた状態。自作キーボードの完成は、自分に合ったカスタムキーマップ(キー配列)を盛り込んだファームウェアを書き込むまで終わらないのだ。
キーボードのキーマップのカスタマイズと言われても、あまりピンと来ないかもしれない。市販のキーボードだとせいぜいAの左にCapsではなくCtrlを置くとか、Winキーを無効化するくらいのものだろう。
だが自作キーボードでは、いかに快適かつ合理的に操作できるかを考えながらキーマップを考える必要がある。どこにCtrlやAltキーを置くかだけではなく、自分がキーボードを頻用するアプリでどう使いたいか……を考えるのだ。
キーマップの作り込みとは、つまるところ“自分がどうPCを操作したいか”を見つめ直す作業になる。例えばAキーの左にCrtlを置くのは、Ctrlキーを使ったショートカットを押しやすくするためだが、そこから1歩踏み込むと、多用するショートカットキーを打鍵しやすい場所に登録すれば、ショートカットはもっと簡単に発動できる。
日本語入力時に小指でShiftキーを押しながら左右キーを押して範囲を調整する作業も、もっと押しやすい位置のキーに割り当てた方が楽に行える。
そこで今回は、Irisのキーマップをカスタマイズし、それを新たなファームウェアとして自作キーボードに書き込む初歩的な手順やQMKの機能の一部を解説する。
ビルド環境を作る
自作キーボードのファームウェアは、オープンソースの「QMK Firmware」が広く使われている。QMKの他にも「TMK(QMKとは親戚関係にある)」、「kiibohd」などがあるが、対応キーボードや機能ではQMKがダントツな存在である。
QMKは完全フリーで提供されているが、Github(https://Github.com/qmk/qmk_firmware)でソースを手に入れ、自分のキーボードで動作するファームウェアを生成(ビルド)する作業が必要になる。まずはQMKファームウェアのビルド環境作りが必要だ。
今回はQMKのソース一式をローカルに展開して、その上で自分用にカスタマイズしていく一番イージーな方法を解説する。まずはQMKのソース一式をGithubからダウンロードしよう。
ソースの次はビルド環境だ。これもすべてフリーで手に入るものばかりだが、Unix環境で動作するツールになる。Linuxマシンがあるならともかく、Windows上でビルド環境を整えるならUnixとビルド用ツールを集めるための環境作りから始めよう。
Windowsなら、VirtualBoxでUbuntuなどが動く仮想マシンを準備し、その上でビルド環境を構築する、あるいはDockerを導入、Windows 10のWindows Subsystem For Linuxを使う(ただしこれはお勧めしない)するなどの方法があるが、手軽さと手堅さの面で「MSYS2」の導入がオススメだ。
MSYS2を導入したら、MSYS2のターミナル上でQMKのソースを展開したフォルダー(今回はC:\git)内部にあるMSYS環境構築用のスクリプト(util/msys2_install.sh)を起動する。何回か質問されるが「全て」や「はい」と答えていけば上手くいく。初回なので少し時間がかかるが、気長に攻略しよう。
==テキストエディターで
ファームウェアを自作==
ビルド環境整備が終わったら、今度はソースを編集する環境、すなわちテキストエディターを準備する。QMKのソースはプレーンテキストなのでその気になればメモ帳でも編集可能だが、プログラム向けのエディタを導入した方が作業がはかどるからだ。
無料で使るプログラミング定番エディターとして「Atom」や「Visual Studio Code」が挙げられるが、なじんだ環境があればそれを使うのもよいだろう。今回はAtomを使っての作業を解説しよう。
ゼロからキーマップを作るのは現実的でないので、まずは既存のものをコピーしてそれを編集するとしよう。各キーボードの「Keymaps」フォルダーがあり、その中にカスタムファームウェアをビルドするためのファイルが格納されている。まずはここから叩き台となるキーマップをコピーするのだ。
Keymapsフォルダーの中には標準キーマップを示す「defalut」フォルダーのほかに、ユーザーが作ったキーマップのフォルダーが収録される。今回は無難なdefaultをコピーしたが、他のユーザーが作ったキーマップをお手本にするのもいいだろう。
ここまでできたらファームウェアのビルドと書き込みもやってみよう。とりあえず今複製したキーマップ(先の例ではktu)でもいいし、Irisの他のキーマップでもいい。
ビルドするにはMSYS2 MinGWのターミナルを使う。まずビルドするコマンド「make」に続け、「対象のキーボード名:キーマップのフォルダ名:ターゲット」と3つの情報をコロンで連結して入力する。
今回キーボードがIris、キーマップのフォルダ名が“ktu”だ。ターゲットというのはキーボードに書き込む処理を行うツールのことで、Arduino Pro Microを使っているキーボードの場合“avrdude”となる。すなわち、入力すべきビルド用コマンドは「make iris:ktu:avrdude」となる。
ビルドが終わると「reset your controller now...」の表記が出るので、キーボードのリセットボタンを押す(特定のキーマップにリセット機能を持たせてあれば、そのキーでも可)。
あとはカスタマイズしたキーボードを使う→Atomでkeymap.cを編集する→ファームウェアをビルドして書き込む→……を繰り返す。一発では理想のファームウェアは生まれない。トライ&エラーを繰り返し最高のファームウェアを作り出すのだ。
==キーマップのカスタマイズ
keymap.cを攻略する==
QMKのビルド環境や大まかな作業サイクルが分かったところで、ファームウェアの肝といえるキーマップのカスタマイズに入ろう。
先程複製したキーマップ(ktu)のフォルダ内には「keymap.c」「config.h」「rules.mk」の3つのファイルが入っている。config.hとrules.mkはキーボードに装備されたUnderglow LEDの有無やNキーロールオーバーといった機能的な側面を定義するファイルなので、直接編集する頻度は低い。カスタマイズで最も重要なのはキーマップが記述される「keymap.c」なのだ。
だがいきなりkeymap.cに挑んでも、最初はよく分からないはず。そこでここではkeymap.cの見かたをまとめてみた。
1)ヘッダー部分
keymap.cの序盤はさまざまな定義を記述する部分だ。ショートカットキーを短縮表記して後に続くキーマップの可読性を上げるためにも使われるほか、レイヤーやマクロを使う下準備エリアでもある。以降のスクリーンショットは、Irisのデフォルトキーマップのkeymap.cを解説している。
2)キーマップ
36行めの「const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {」より94行めの「};」までが実際のキーマップの記述となる。Irisのデフォルトキーマップ作者は結構マメな性格なのか、ビジュアル的にキーの位置を把握しやすいよう記述しているので読みやすい。
通常QMKでキーを表現する“キーコード”は「KC_ENTER」のように頭に「KC_」を付けて表記するが、Irisのdefaultのkeymap.cでは全てKC_は省略できるようになっている(19行目の記述がポイント)。
まずは38行め、デフォルトレイヤーとなる「_QWERTY」のキーマップを眺めてみよう。3~4文字コードの部分を除けば、普通のQWERTY配列になっていることがわかる。LSFTやBSPCといった独特なキーワードはQMKのキーコード(https://docs.qmk.fm/keycodes.html)を参照すれば、具体的にどのキーに対応するのか分かる。QMKのキーコード表は一通り読んでおくといいだろう。
3)プログラム的な部分
キーマップの下には、これまでの部分よりももっとプログラミング的な何かが記述されている。この部分はキーの押下判定時などに何かする、という処理が書かれていることが多い。Irisのデフォルトキーマップでは、レイヤーを切り替える2つのキー(LOWRとRASE)を両方押し込むと別のレイヤー(_ADJUST)へ飛ぶための記述が書かれている。とりあえずはこの辺はいじらず、キーマップだけに集中するといいだろう。
配列を作り込む
まずは_QWERTYレイヤーからキーマップをテコ入れしていこう。筆者の考えはこうだ……デフォルトのキーマップだと、親指で押すキーがSPC(Space)とENT(Enter)に2つとも割り当てられているし、ESCが左上でやや遠い。
右上のBSPC(BackSpace)キーの下がDELなのは、誤爆が多くて使いづらいと感じた。KinesisやErgodoxに合わせて左手親指にBSPC、右手親指にSPCを移動させたい。Aキー左もCtrlにしたい……。こんな感じでキーを“置いていく”のだ。
単一キーマップでは網羅しきれないキーが山のように出てくる。上の例では「Alt」だが、他にもカーソルキーなど省略せざるを得ないキーが山のようにある。これを解決するのが「デュアルロールキー」と「レイヤー」。特に前者は自作キーボードの真骨頂といえる機能だ。
デュアルロールキーとは名前の通り2つの機能を1キーに持たせるということ。具体的には“タップ(短押し)”時と“ホールド(長押し)”時で違うキーとして利用できる。例えばタップでTabキー、ホールドでAltキーとすれば、2つのキーが1つに統合できる。これを利用して修飾キーを左右に設置しておくと非常に便利なのだ。
今回の例では、以下のようなデュアルロールキーを作っている。LGUIが多いのは、筆者がMac環境でも使うことを想定しているためである。
タップでBSPC(BackSpace)、ホールドでLGUI(左Win)
タップでTAB、ホールドでLALT(左Alt)
タップでSLSH(スラッシュ)、ホールドでLGUI(左Win)
タップでDOT(ピリオド)、ホールドでLALT(左Alt)
だがデュアルロールが有効なキーはそう多くないので、レイヤーを活用しよう。Irisのデフォルトキーマップを叩き台にしているなら_LOWERと_RAISEの2レイヤーから調整しよう。
カーソルキーは右手の一等地(J/K/L/;)に←↓↑→の順番で置くことで、ホームポジションから極力指を動かさずにカーソル制御を行ないたい……などなど、自分の理想を詰め込んでいこう。
レイヤーの切り替えキーもデュアルロールにすることも可能だ。今回の例ではEnterキーやSpaceキーを右手親指側に配置しているが、これらをホールドした時に_LOWERレイヤーに切り替わるようになれば、大抵のショートカットが親指+任意のキーという形で発動できるのだ。
ここまでのキーマップは基本的に両手を使って文字入力をするためのものだが、Excelで数字を集中的に入力するには使いにくい。そこで数字入力特化のレイヤー「_NUMPAD」を追加してみよう。このレイヤーは一度切り替えたら、手を離してもそのままの状態を保持するようにしておきたい。
……と、こんな感じでさらにQMKならではの機能を用いて、便利なキーを追加していく。「ホールド時だけレイヤー切り替え」になるキーと「ダブルタップしたらレイヤーへ切り替え」という2つのやり方をチェックする
まだまだ改善の余地はある
かなりのテキスト量を使ってキーマップのカスタマイズ例を解説してきたが、まだQMKには面白い機能がある。これをすべて解説することはできない。Githubにはさまざまなユーザーが作ったキーマップがアップされているので、それを見て参考にするといいだろう。
筆者のキーマップも試行錯誤を重ねつつ常に変化している。一度変えたらしばらく使ってみて、駄目なら戻すの繰り返しになることも多いが、やはり自分の究極の環境を作り上げていく楽しさは普通のキーボードではなかなか味わえない。
まるっきり無経験からだと相当難しそうに思うかもしれないが、チャレンジする価値は十分にある。ぜひ読者の皆さんも自分なりのendgameキーボードを目指していただきたい。