大枚はたいて kinesis 社の Advantage360 Pro というキーボードを買った。 どうせここまで来たなら、もうやけになって、新しいキーボードレイアウトも習得してしまおうと思う。(colemak DHにした。)

いろいろ変更する手順はあるんだけど、キーボード側でキーの挙動を定義する事が出来るので、ここでその手順を記録しておく。

web でマッピングを変更する

https://kinesiscorporation.github.io/Adv360-Pro-GUI に web アプリがあって、そこでかえたものを

https://github.com/yasushisakai/Adv360-Pro-ZMK/actions へ反映する権限をあたえれば、変更して自動でコミットしてくれる。

Kinesis Advantage 360 Pro は、zmk が基本になっていて、そのルールに従って変更すればいい。

keymap config をいじって変更する

手で(マニュアル?)かえる場合は基本的に下記の規則で記述していく。

kinesis 自体はこうゆう配列であって、

kinesis_array_num.png

もし Kinesis に慣れてしまった場合に、 qwerty が億劫になるはずで、そこまで Colemak になれたら 携帯用のキーボードをつくるんだと思う。その時はいちおう 36key にしようと決めているので、そうなっても困らないマッピングにしておく。というか、34 key ありきの Mapping にする。これは、上の配列の情報を以下の用に再マッピングすればいい事になる。

kinesis_36_area.png

Figure 1: 紫の●はリセットボタン

参考として、Miryoku というレイアウトがあるらしいが、マウスやメディア操作はいらないかなと。それ以外だったら、ベンの 34key layout があるけど、日本語を打つ事を考えると多少考えないといけない。(36 がいいと思ったのもこの理由から。)

色々検討した結果、下記を目標にしようと思う。

kinesis_layout.png

このレイアウトに落ちついた経緯は少しづつ加筆していこう。

変更履歴

<2023-01-27 Fri>

  • esc がレイヤー 2 にしかなかったのが、つらいので、いくつかためしてみてる。
  • sticky shift あんまりつかってないから、そこも esc にしてみた。
  • グラフィックソフトを使う時にどうしても space と enter が、左手にあったほうが良いから、試す。

<2023-01-28 Sat>

  • 34 key に挑戦

下は結局 このファイル として、書き出されます。

<2023-04-01 Sat>

  • 元 repo いつのまにかキーが増えていた。
  • vim の操作感が恋しくて、qwerty になおす。

<2023-08-29 Tue> (未適応)

  • BTC (bluetooth の設定をクリア)をなくす、ふとした反動で押しやすいので
  • qmk と音の制御キーを統一

ヘッダ諸々

/* THIS FILE WAS GENERATED!
 *
 * This file was generated automatically. You may or may not want to
 * edit it directly.https://yasushisakai.com/kinesis_Advantage_360_Pro.html
 */

#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/rgb.h>
#include <dt-bindings/zmk/backlight.h>

/ {

ビヘイビア(挙動)の定義

ホーム行の長押しもしくは、別のキーとの同時押しの場合の挙動は、 &hm とする。これをキーボード界隈だと、home row mods というらしい。ただの長押しじゃあダメらしく、この挙動についての詳しい説明はここで読めます。なかなか奥が深い。

普通は &kp 普通の長押しは &hd

あとは、 &none, &trans, &sk とかある。

  behaviors {
    #include "macros.dtsi"

    hm: homerow_mods {
        compatible = "zmk,behavior-hold-tap";
        label = "HOMEROW_MODS";
        #binding-cells = <2>;
        tapping-term-ms = <200>;
        quick_tap_ms = <175>;
        flavor = "tap-preferred";
        bindings = <&kp>, <&kp>;
    };

    hml: homerow_layer_reset {
        compatible = "zmk,behavior-hold-tap";
        label = "HOMEROW_MODS_LAYER_RESET";
        #binding-cells = <2>;
        tapping-term-ms = <200>;
        quick_tap_ms = <175>;
        flavor = "tap-preferred";
        bindings = <&kp>, <&to>;
    };

    hd: hold {
            compatible = "zmk,behavior-hold-tap";
            label = "HOLD";
            #binding-cells = <2>;
            tapping-term-ms = <150>;
            quick_tap_ms = <0>;
            flavor = "tap-preferred";
            bindings = <&kp>, <&kp>;
    };
    td_mt: tap_dance_mod_tap {
            compatible = "zmk,behavior-tap-dance";
            label = "TAP_DANCE_MOD_TAP";
            #binding-cells = <0>;
            tapping-term-ms = <200>;
            bindings = <&mt LC(LS(LALT)) ESC>, <&to 1>;
    };
  };

マッピングをメタプログラミング

https://zmk.dev/docs/codes

### constants
layer_key_num = [14,14,20,20,16]
TOTAL_NUM_KEYS = sum(layer_key_num)
top_mapping = [i + sum(layer_key_num[0:1]) for i in [1,2,3,4,5,8,9,10,11,12]]
middle_mapping = [i + sum(layer_key_num[0:2]) for i in [1,2,3,4,5,14,15,16,17,18]]
bottom_mapping = [i + sum(layer_key_num[0:3])  for i in [1,2,3,4,5,14,15,16,17,18]]
thumb_mapping = [i + sum(layer_key_num[0:4]) for i in [5,6,9,10]]

def mapkey(keys, layout, mapping):
    for i in range(len(keys)):
        layout[mapping[i]] = keys[i]

    return layout

def maplayer(top, middle, bottom, thumb, default):
    layer = [default] * TOTAL_NUM_KEYS
    layer = mapkey(top,layer,top_mapping)
    layer = mapkey(middle,layer,middle_mapping)
    layer = mapkey(bottom,layer,bottom_mapping)
    layer = mapkey(thumb,layer,thumb_mapping)
    return layer

def makelayer(layer_name, top, middle, bottom, thumb, default='&none'):
    keys = maplayer(top, middle, bottom, thumb, default)
    mappings = '  '.join(keys)
    return f'{layer_name} {{\n    bindings = <\n{mappings}\n    >;\n  }};'

### default layer
top = ['&hd ESC Q'] + [f'&kp {i}' for i in 'WE'] + ['&hd LPAR R', '&hd RPAR T', '&kp Y', '&kp U', '&hd LBKT I', '&hd RBKT O', '&hd MINUS P']
middle = ['&kp A', '&hm LCTRL S', '&hm LALT D', '&hm LSHIFT F', '&hm LGUI G', '&hm RGUI H', '&hm RSHIFT J', '&hm LALT K', '&hm RCTRL L', '&hd EQUAL SEMI']
bottom = ['&hd TAB Z'] + [f'&kp {i}' for i in 'XCVBNM'] + ['&kp COMMA', '&kp DOT', '&hd SQT FSLH']
thumb = ['&kp SPACE', '&kp ENTER', '&hml LC(LS(LALT)) 1', '&kp BSPC' ]
default_layer = makelayer('default_layer', top, middle, bottom, thumb)

### numbers and arrows
top = ['&kp ESC'] + [f'&kp N{i}' for i in '7890'] + ['&trans']*2 + ['&kp LBKT', '&kp RBKT', '&kp BSLH']
middle = ['&kp TAB', '&hm LCTRL N4', '&hm LALT N5', '&hm LSHIFT N6', '&hm LGUI MINUS', '&hm RGUI LEFT', '&hm RSHIFT DOWN', '&hm LALT UP', '&hm RCTRL RIGHT', '&kp SQT']
bottom = ['&kp GRAVE'] + [f'&kp N{i}' for i in '123'] + ['&kp EQUAL']
thumb = ['&trans'] * 4 # this wil be used in the layer below as well
thumb[0] = '&to 0'
thumb[2] = '&hml LC(LS(LALT)) 2'
number_layer = makelayer('number_layer', top, middle, bottom, thumb, '&trans')
### functions

top = ['&bt BT_SEL 0'] + [f'&kp F{i}' for i in range(7,11)] + ['&trans'] * 4 + ['&kp C_VOL_UP']
middle = ['&bt BT_SEL 1'] + [f'&kp F{i}' for i in range(4,7)] + ['&kp F11' ] + ['&trans'] * 4 + ['&kp C_MUTE']
bottom = ['&bt BT_SEL 2'] + [f'&kp F{i}' for i in range(1,4)] + ['&kp F12', '&trans', '&bl BL_OFF', '&bl BL_ON', '&trans', '&kp C_VOL_DN']
function_layer = makelayer('function_layer', top, middle, bottom, thumb, '&trans')

### put it all together
layers = '#+begin_src text :tangle ~/code/Adv360-Pro-ZMK/config/adv360.keymap\n'
layers += f'keymap {{\n\n  compatible = "zmk,keymap"; \n\n  {default_layer} \n\n  {number_layer} \n\n  {function_layer}\n}};'
layers += '};' # the last bracket to close the root object
return layers
keymap {

  compatible = "zmk,keymap";

  default_layer {
    bindings = <
&none  &none  &none  &none  &none  &none  &none  &none  &none  &none  &none  &none  &none  &none  &none  &hd ESC Q  &kp W  &kp E  &hd LPAR R  &hd RPAR T  &none  &none  &kp Y  &kp U  &hd LBKT I  &hd RBKT O  &hd MINUS P  &none  &none  &kp A  &hm LCTRL S  &hm LALT D  &hm LSHIFT F  &hm LGUI G  &none  &none  &none  &none  &none  &none  &none  &none  &hm RGUI H  &hm RSHIFT J  &hm LALT K  &hm RCTRL L  &hd EQUAL SEMI  &none  &none  &hd TAB Z  &kp X  &kp C  &kp V  &kp B  &none  &none  &none  &none  &none  &none  &none  &none  &kp N  &kp M  &kp COMMA  &kp DOT  &hd SQT FSLH  &none  &none  &none  &none  &none  &none  &kp SPACE  &kp ENTER  &none  &none  &hml LC(LS(LALT)) 1  &kp BSPC  &none  &none  &none  &none  &none
    >;
  };

  number_layer {
    bindings = <
&trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &kp ESC  &kp N7  &kp N8  &kp N9  &kp N0  &trans  &trans  &trans  &trans  &kp LBKT  &kp RBKT  &kp BSLH  &trans  &trans  &kp TAB  &hm LCTRL N4  &hm LALT N5  &hm LSHIFT N6  &hm LGUI MINUS  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &hm RGUI LEFT  &hm RSHIFT DOWN  &hm LALT UP  &hm RCTRL RIGHT  &kp SQT  &trans  &trans  &kp GRAVE  &kp N1  &kp N2  &kp N3  &kp EQUAL  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &to 0  &trans  &trans  &trans  &hml LC(LS(LALT)) 2  &trans  &trans  &trans  &trans  &trans  &trans
    >;
  };

  function_layer {
    bindings = <
&trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &bt BT_SEL 0  &kp F7  &kp F8  &kp F9  &kp F10  &trans  &trans  &trans  &trans  &trans  &trans  &kp C_VOL_UP  &trans  &trans  &bt BT_SEL 1  &kp F4  &kp F5  &kp F6  &kp F11  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &kp C_MUTE  &trans  &trans  &bt BT_SEL 2  &kp F1  &kp F2  &kp F3  &kp F12  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &trans  &bl BL_OFF  &bl BL_ON  &trans  &kp C_VOL_DN  &trans  &trans  &trans  &trans  &trans  &trans  &to 0  &trans  &trans  &trans  &hml LC(LS(LALT)) 2  &trans  &trans  &trans  &trans  &trans  &trans
    >;
  };
};};

ファームウェアの更新

上で変更するなり、手打でかえるなり、コミットされると、actions が働いて、新しいファームウェアをコンパイルしてくれる。それをダウンロードする。

コンピュータとキーボードを接続して、リセットボタンをおすと、マウントされので、左右対応する方のファームウェアをドラッグドロップ。

なんかうまくいかない場合

https://kinesis-ergo.com/support/kb360pro/#github

の Firmware Updates のところに Settings Reset と Factory Default Firmware がおとせる。

Date: 2022-11-10 Thu 10:21