見出し画像

Claw44であそぼ。③(Tap Dance編)

はじめに

一日で一番手に触れているものはキーボードという思い込みから、不便さを克服することにより得られる快楽を毎日満喫するために小さなキーボードの導入を思い立ち、2022年12月にClaw44の購入を決意。プログラミングと自作キーボードの知識ゼロから始めた自作キーボード素人によるClaw44カスタマイズの奮闘記を綴っていきたいと思います。

Tap Danceとは

タップダンスとは自作キーボードに搭載されるQMK Firmwareの機能のひとつで、ひとつのキーにタップ(短押し)、ホールド(長押し)の機能を割り当てることを可能にします。例えば、通常のキーボードであれば文字入力は、アルファベットキーや数字キーをタップすることで入力し、Shiftキー・ Fn キーやCtrl・ Alt・Winキーといった修飾キーはホールドして利用します。ここでもひとつのキーに対して、タップとホールドの両方を割り当てるだけであればRemapでも簡単に実現できます。この辺りのかゆいところに手が届く便利機能をデフォルトで対応してくれているのは、キーボード入門者にとって非常にありがたいところです。猫山王のClaw44の右手の親指キーには、ホールドでレイヤー4(ファンクションキーを配置)に、タップでEnterを入力するという機能を割り当てています。

また、40%以下のキーボード利用者の多くはキー数少ない問題への対応の第一歩としてレイヤーをフル活用することで不便さの克服に挑戦することになるでしょう。前回にもお伝えした通りレイヤーというものは中毒性が非常に高く一種の麻薬のようなもので、Num Pad用のレイヤーや右手デバイス用のレイヤーなど作ってみたりその最大数を追い求めてしまった結果、レイヤー移動するために割り当てるキーが足りない問題という本末転倒な状況に陥ってしまいます。そんな猫山王もレイヤー移動するために割り当てるキーが足りない問題に直面したひとりといえます。また、ひとつのキーに色んな機能を割り当てることで、キー数少ない問題の不便さの克服に挑戦しようとする者もいます。ここで、タップとホールドのみであれば、Remapでも簡単に対応できますが、何故自作キーボード利用者はタップダンスを追い求めるのでしょうか。この問題の本質を理解するためにもタップダンスの機能そのもののを理解する必要があるでしょう。タップダンスの真骨頂ともいうべき醍醐味である、ダブルタップ(2回連続の短押し)やタップ&ホールド(短押し後にすばやく長押し)を使いたいという不便さの克服のために普通のキーボードでは決して到達しえない高みの世界への果敢な挑戦の歴史がそこにあります。
タップダンスは、タップ、ホールド、ダブルタップ、タップ&ホールドをひとつのキーに割り当てることができる魔法の機能で、この魔法の機能への依存が高まれば高まるほどに自分のキーボードからは決して離れられなくなってしまう非常に危険な悪魔のささやきといえるでしょう。タップダンス界においては、ダブルタップやタップ&ホールドではもう満足できなくなってしまった方も多く存在し(していると思います)、トリプルタップ(3回連続の短押し)やダブルタップ&ホールド(2回連続の短押し後にすぐに長押し)、さらにはQMKの無限の可能性を模索すべく連打回数を闇雲に増やすことでタップダンス界の絶対王を目指す強者もいます(いると思います)。そんな猫山王はダブルタップとタップ&ホールドまでしか設定していないタップダンス界においてはまだまだ生まれたてのひよこちゃんです。ちなみにタップダンス界のひよこちゃんのピヨピヨ仕様のタップダンス利用例としては以下になります。
・ダブルタップにNum Padレイヤーや右手デバイスレイヤーへの固定を可能とする、いわゆるTO(layer)の割り当て
・タップ&ホールドにホールドと異なるレイヤーへの移動を可能とする、いわゆるMO(layer)の割り当て

Tap Danceの使い方

タップダンスという魔法を使うためには、ソースコードを書き換えるという呪文の書き換えが必要になります。Remapの新機能のファームウェアビルド機能を利用した、タップ、ホールド、ダブルタップ、タップ&ホールドに対応した呪文の書き換えをお伝えしますので、タップダンス界の絶対王を目指される方にとって今回学習する呪文を参考に黒魔法の技術を高めていただき、絶対王になるための黒魔法の習得に努めていただければと思います。タップダンスの魔法を使うために変更が必要なファイルは、Keymapフォルダ下のrules.mkファイルとkeymap.cファイルの2つです。それぞれのファイルを書き換える方法については、ひとつひとつ解説していきたいと思います。まずは「Claw44であそぼ②(レイヤー数拡大編)」の3.ファームウェアビルド機能のファイル構成までを参考にClaw44 rev2のBUILD FIRMWAREまで進みます。

1.rules.mkファイルの内容を書き換えよう
Keymapフォルダ下のrules.mkをクリック。rules.mkにはキーボードに眠っている潜在的な機能を呼び起こす、いわば召喚するための呪文が記載されています。右上のBy editing a codeをクリックすると何やら3つの召喚呪文が記載されています。1つめがVIAを有効とする召喚呪文、2つめがロータリーエンコーダを有効とする召喚呪文、3つめがタップダンスの連打間隔の設定を有効とする召喚呪文、いわば今回のタップダンスの派生召喚呪文といえるでしょう。タップダンスの魔法を使えるようにするためには以下の呪文の追加が必要です。

TAP_DANCE_ENABLE = yes

これでタップダンスが召喚されたことになりますが、タップ、ホールド、ダブルタップ、タップ&ホールドの設定にはkeymap.cの書き換えが必要という難行苦行が待ち構えています。

2.keymap.cファイルの内容を書き換えよう(簡単な定義の呪文)
続いて、keymap.cをクリック。keymap.cにはキーマッピングの呪文が記載されています。ここに一子相伝のタップダンスの悪魔の呪文をトッピングとして追加します。タップダンスの悪魔の呪文は、簡単な定義の呪文と詳細な挙動の呪文に分かれます。
簡単な定義の呪文は以下であり、この呪文を記載する箇所も重要であり、enum layer_numberの記述と#define KC_L_SPC LT(_LOWER, KC_SPC) の記述の間の余白に記載することになります。例えば添付のような呪文が考えられます。

解読できるように簡単な日本語訳も記載しておきます。

#ifdef TAP_DANCE_ENABLE
typedef struct {
bool is_press_action;
int state;
} tap;

enum {                 //タップダンスの種類の定義
SINGLE_TAP = 1,    //タップ
SINGLE_HOLD,         //ホールド
DOUBLE_TAP,   //ダブルタップ
SINGLE_TAP_HOLD, //タップ&ホールド
DOUBLE_SINGLE_TAP, //appleのようなpp入力とダブルタップを区別
};

enum {                    //今回は2種類のタップダンスを定義
X_TAP_DANCE_1 = 0,
X_TAP_DANCE_2,
};

int cur_dance (tap_dance_state_t *state);

void x_finished (tap_dance_state_t *state, void *user_data);
void x_reset (tap_dance_state_t *state, void *user_data);

#define TAP_1 TD(X_TAP_DANCE_1) //キーマップにTAP_1と記載するため
#define TAP_2 TD(X_TAP_DANCE_2)
#endif

3.keymap.cファイルの内容を書き換えよう(詳細な挙動の呪文)
続いて詳細な挙動の呪文では、ダブルタップやタップ&ホールドの挙動を定義していくことになるので、オリジナリティを発揮できる最高の場であり、クリエイターとしての腕の見せ所といえるでしょう。そのため呪文は比較的長めの呪文になりますが、キーボード初心者の猫山王でも唱えることができるインド医学のアーユルヴェーダほど難解ではないように思います。タップダンス界のひよこちゃんのピヨピヨな創造力を基に作成した詳細な挙動の呪文のほんの一例を日本語訳とともに以下に記載しておきますので、ご自由にアレンジください。ちなみに記載個所はClaw44 Rev2であれば、keymap.c一番下の下のuint16_t get_tapping_termの呪文の後に追加します。コピペ仕様のファイルも添付しておきます。
ここでの注意点は、レイヤーの名称についてはキーマップの定義と合わす必要があり、タップダンスの挙動についても設定できないキーの組み合わせがあったりもします。その辺りは不便さを克服することにより得られる快楽の旅ということでお楽しみいただければと思います。

/* Tap danceの設定 */
#ifdef TAP_DANCE_ENABLE
int cur_dance (tap_dance_state_t *state) {
if (state->count ==1) {
if (!state->pressed) return SINGLE_TAP;
else return SINGLE_HOLD;
}
else if (state->count == 2) {
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return SINGLE_TAP_HOLD;
else return DOUBLE_TAP;
}
else return 8; //magic number. At some point this method will expand to work for more presses
}

static tap xtap_state = {
.is_press_action = true,
.state = 0
};

/* X_TAP_DANCE_1の定義 */
void x_finished_1 (tap_dance_state_t *state, void *user_data) {
xtap_state.state = cur_dance(state);
switch (xtap_state.state) {
case SINGLE_TAP:
register_code(KC_ENT); //タップでEnter
break;
case SINGLE_HOLD:
layer_on(_RAISE);  //ホールドで_RAISEレイヤーに移動
break;
case DOUBLE_TAP:
layer_invert(_LOWER);  //ダブルタップで_LOWERレイヤー固定
break;
case SINGLE_TAP_HOLD:
layer_on(_LOWER);  //タップ&ホールドで_LOWERレイヤーに移動
break;
}
}

void x_reset_1 (tap_dance_state_t *state, void *user_data) {
switch (xtap_state.state) {
case SINGLE_TAP:
unregister_code(KC_ENT);   //上記魔法のリセット、以下同じ
break;
case SINGLE_HOLD:
layer_off(_RAISE);
break;
case DOUBLE_TAP:
break;
case SINGLE_TAP_HOLD:
layer_off(_LOWER);
break;
}
xtap_state.state = 0;
}

/* X_TAP_DANCE_2の定義 */
void x_finished_2 (tap_dance_state_t *state, void *user_data) {
xtap_state.state = cur_dance(state);
switch (xtap_state.state) {
case SINGLE_TAP:
register_code(KC_MUTE);  //タップでMute
break;
case SINGLE_HOLD:
layer_on(_ADJUST);  //ホールドで_ADJUSTレイヤーに移動
break;
case DOUBLE_TAP:
layer_invert(_RAISE);  //ダブルタップで_RAISEレイヤー固定
break;
case SINGLE_TAP_HOLD:
layer_on(_LOWER);   //タップ&ホールドで_LOWERレイヤーに移動
break;
}
}

void x_reset_2 (tap_dance_state_t *state, void *user_data) {
switch (xtap_state.state) {
case SINGLE_TAP:
unregister_code(KC_MUTE);  //上記魔法のリセット、以下同じ
break;
case SINGLE_HOLD:
layer_off(_ADJUST);
break;
case DOUBLE_TAP:
break;
case SINGLE_TAP_HOLD:
layer_off(_LOWER);
break;
}
xtap_state.state = 0;
}

tap_dance_action_t tap_dance_actions[] = { //上記魔法をに名前を付ける
[X_TAP_DANCE_1] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished_1, x_reset_1),
[X_TAP_DANCE_2] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished_2, x_reset_2),
};
#endif

4.keymap.cファイルの内容を書き換えよう(タップダンスキーの配置)
このままではせっかく苦労して唱えたタップダンスの悪魔の呪文がキーボード上に反映されません。keymap.cのキーマップの任意の個所にTAP_1とTAP_2を記載することで、それぞれのキーを押すとX_TAP_DANCE_1とX_TAP_DANCE_2で定義したタップダンスを堪能することができます。以下は、KC_QとKC_WにTAP_1とTAP_2を記載した例です。

5.さあ、BUILDしよう
ここまでくれば最後はBUILDです。今回変更したrules.mkとkeymap.cのファイルの右上にポチがついているのを確認して、右下のBUILDをクリック。ステータスがSuccessになれば、呪文のコンパイルに無事成功です。このあとはDownloadしてqmk_toolboxを利用するか、Flashをクリックしてファームウェアを書き換えることでミッション完了。

実際にTap Danceを利用してみて

タップダンスというものは、自作キーボードの初心者にとってはまさに憧れの呪文であり、この呪文を自由に唱えられるようになるためにも日々精進されていると思います。QMKビルド環境を構築してQMK MSYSの暗黒世界を突き進みながら、日々エラーコードと格闘することで呪文を一つ一つ覚えていくという、まさに不便さを克服することにより得られる快楽そのものであります。修羅の門を自らたたいてコンパイルを通すことができた選ばれし猛者だけが唱えることが許されるという、使う者をも選ぶ黒魔術ともいえるでしょう。タップダンスを使うことが許されてからは、限られたキー数でキーマップを煮詰めていくという不便さからくる快楽を味わうことはできなくなりました。一方で、タップダンスの中毒性の虜となってしまい創造力を働かせてダブルタップやタップ&ホールドを駆使することで、限られたキー数であってもキー入力やレイヤー移動の自由度が格段に上がり、他人と同じキーマップはふたつとない唯一無二かつかけがえのないキーマップを手に入れることができました。
ある種最狂の呪文ともいえるタップダンスですが、QMK Firmwareのタップダンスにも弱点もあります。1つ目はタップダンスの設定には毎回コンパイルが必要です。タップダンスはRemapでのキー変更には対応しておらず、新たなイマジネーションによりタップダンスの設定に変更する時には呪文の書き換えからのコンパイルという何とも奥ゆかしい作業が毎回必要です。ただ、使うことが許されし者のみが唱えることができる黒魔法であることを考えると、コンパイルの作業も苦行ではなく不便さを克服するための儀式でありその先には不便さを克服し者のみが得られるタップダンス王国でしか味わえない快楽を味わうことができます。2つ目はホールドにはCtrl・ Alt・Winキーといった修飾キーやレイヤー移動しか設定できなかったり、単キー入力をホールドに設定できなかったり、修飾キー+単キー入力を設定できなかったりと実は制約まみれで決して無敵の呪文ではなかったりします。QMK Firmwareでは決して成しえない考え得る全てのキーコンビネーションを設定できる無限の使用方法を可能とする魔法陣も存在します。この史上最狂のタップダンスの呪文を可能とする魔法陣については、別の奮闘記で紹介したいと思います。
自作キーボードは敷居が高いと思われている方にとって、一日で一番手に触れているものはキーボードということで、不便さを克服することにより得られる快楽の世界への入門のための勇気づけとなれば幸いです。

次回

さて次回はOLED導入の奮闘記をお届けします。OLEDを活用することで単なる入力デバイスとしてのキーボードに視覚的に楽しむことができるエンターテイメント的要素を加えることができ、日々のタイピングからは決して到達しえない快楽を味うことができます。さらに加えて言えば、個性豊かなキーボードにするための創造力が一番問われる領域ともいえるでしょう。


いいなと思ったら応援しよう!