自作キーボード　lily58 proでレイヤーキーの同時押しを有効にする(QMK MSYSでキーマップをビルドする)

# 経緯
5か月ほど前から、自作キーボード [lily58 pro](https://shop.yushakobo.jp/products/lily58-pro)を使っている。
![wWohF9vwQeKslm-Kni7B8g (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852474/6b6a3051-4046-3d48-d6d0-f5da18dbfe64.jpeg)

しかし、キーマップを [remap](https://remap-keys.app)で作成したところ、レイヤーキーの同時押しがうまくいかなかった。
remapは直感的にキーマップを編集することができる（しかも特別に環境構築等が必要ない）ので大変重宝していた。
しかし今回、どうしても同時押しで新しいレイヤーに移行できるようにしたかったので、重い腰を上げてバイナリをビルドした。


# 環境の構築

今回は、必要な環境として**QMK MSYS**のみを使った。

https://msys.qmk.fm

バイナリのビルドから書き込みまで全部これ一つで行える。
なお、以下の環境構築はwindowsで行っている。

**ダウンロードする**
https://github.com/qmk/qmk_distro_msys/releases/tag/1.5.1
こちらからexeファイルをダウンロード。実行する。
インストールが完了したら、QMK MSYSを起動する。

**セットアップを行う**
起動して出てきたターミナルで``qmk setup``を実行する。
色々出てくるが、``y``を押せば自動的にファームウェアがクローンされる。
結構時間がかかるので注意。

これが終わると``qmk_firmware``というディレクトリが作成される。
特に何も指定していなければ``ユーザー名\qmkfirmware``に配置される。

# キーマップを編集する

``qmk_firmware/keyboards``内にキーボードごとにディレクトリが作成されている。
ここから、目的のキーボードのディレクトリを探し、好きなエディタで開く。
今回はvscodeで``lily58``を開いた。開くと画像のようになる。
![lily58.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852474/ea0a534e-ad1d-c401-fb7a-d7fb07d38dd2.png)

``keymaps``フォルダ内に、キーマップが保存されている。
今回は画像のように``mykeymap``という名前でコピーした。

**コピーしたフォルダ内の``keymap.c``を編集する。**


![copyed.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852474/2f1db552-bfd0-2369-d330-e4385ff2eaf0.png)

プログラム上で、下のようにkeymapが宣言されているので、ここを編集する。

```c:keymap.c
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ... }
```
<br>
今回は以下のように編集をした。


```c:keymap.c
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

/* QWERTY
 * ,-----------------------------------------.                    ,-----------------------------------------.
 * |"半角"|   1  |   2  |   3  |   4  |   5  |                    |   6  |   7  |   8  |   9  |   0  |  "-" |
 * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
 * | Tab  |   Q  |   W  |   E  |   R  |   T  |                    |   Y  |   U  |   I  |   O  |   P  |  "@" |
 * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
 * |LCTRL |   A  |   S  |   D  |   F  |   G  |-------.    ,-------|   H  |   J  |   K  |   L  |   ;  |  ":" |
 * |------+------+------+------+------+------|   [   |    |    ]  |------+------+------+------+------+------|
 * |LShift|   Z  |   X  |   C  |   V  |   B  |-------|    |-------|  "B" |  "N" |  "M" |  "," |  "." |RShift|
 * `-----------------------------------------/       /     \      \-----------------------------------------'
 *                   | LAlt |"LOWER"|"RShift" | /Space  /   \Enter \  |"RSHIFT"|"RAISE"| "RCTRL" |
 *                   |      |       |         |/       /     \      \ |        |       |         |
 *                   `----------------------------'           '------''--------------------'
 */

 [_QWERTY] = LAYOUT( \
  KC_ZKHK,   KC_1,   KC_2,    KC_3,    KC_4,    KC_5,                     KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, \
  KC_TAB,   KC_Q,   KC_W,    KC_E,    KC_R,    KC_T,                     KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, \
  KC_LCTRL, KC_A,   KC_S,    KC_D,    KC_F,    KC_G,                     KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, \
  KC_LSFT,  KC_Z,   KC_X,    KC_C,    KC_V,    KC_B, KC_LBRC,  KC_RBRC,  KC_B,    KC_N,    KC_M, KC_COMM,  KC_DOT,  KC_RSFT, \
                        KC_LALT, MO(_LOWER), KC_RSFT, KC_SPC, KC_ENT, KC_RSFT, MO(_RAISE), KC_RCTL \
),
/* LOWER
 * ,-----------------------------------------.                    ,-----------------------------------------.
 * |"ESC" | "F1" | "F2" | "F3" | "F4" | "F5" |                    | "F6" | "F7" | "F8" | "F9" | "\"  | "^"  |
 * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
 * |      |      | "F12"| "up" |"F14" |      |                    |      |      |      |      |      |  "[" |
 * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
 * |      |      |"left"|"down"|"right"|     |-------.    ,-------|      |      |"HOME"|      | "BS" |  "]" |
 * |------+------+------+------+------+------|   [   |    |    ]  |------+------+------+------+------+------|
 * |      |      |      |      |      |      |-------|    |-------|      |      | "END"|      |  "/" |  "\" |
 * `-----------------------------------------/       /     \      \-----------------------------------------'
 *                   |      |      |      | /       /       \      \  |      |      |      |
 *                   |      |      |      |/       /         \      \ |      |      |      |
 *                   `----------------------------'           '------''--------------------'
 */
[_LOWER] = LAYOUT( \
  KC_ESC,    KC_F1,  KC_F2, KC_F3,   KC_F4,   KC_F5,                   KC_F6, KC_F7, KC_F8, KC_F9, KC_INT3, KC_EQL,\
  _______, _______,  KC_F12, KC_UP,   KC_F14,   _______,               _______,   _______,   _______,  _______,  _______,  KC_RBRC, \
  _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______,                _______, _______, KC_HOME, _______, KC_BSPC, KC_NUHS, \
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, _______, KC_SLSH, KC_INT1, \
                             _______, _______, _______, _______, _______,  _______, _______, _______\
),
/* RAISE
 * ,-----------------------------------------.                    ,-----------------------------------------.
 * |      |      |      |      |      |      |                    |      |      |      |      |      |      |
 * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
 * |   `  |      |      |      |      |      |                    |      |      |      |      |      |      |
 * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
 * |      |  "1" |  "2" |  "3" |  "4" | "5"  |-------.    ,-------| "6"  | "7"  | "8"  |  "9" |  "0" |      |
 * |------+------+------+------+------+------|   [   |    |    ]  |------+------+------+------+------+------|
 * |      |      |      |      |      |      |-------|    |-------|      |      |      |      |      |      |
 * `-----------------------------------------/       /     \      \-----------------------------------------'
 *                   |      |      |      | /       /       \      \  |      |      |      |
 *                   |      |      |      |/       /         \      \ |      |      |      |
 *                   `----------------------------'           '------''--------------------'
 */

[_RAISE] = LAYOUT( \
  _______, _______, _______, _______, _______, _______,                     _______, _______, _______, _______, _______, _______, \
  _______,  _______, _______ , _______ , _______ ,  _______,                 _______,  _______, _______, _______ , _______, _______, \
  _______,   KC_1 ,   KC_2 ,  KC_3  ,  KC_4   ,  KC_5  ,                      KC_6  , KC_7   , KC_8   , KC_9   ,KC_0    , _______, \
  _______,  _______,  _______, _______,  _______,  _______,   _______, _______,  _______, _______, _______,  _______, _______, _______, \
                             _______, _______, _______,  _______, _______,  _______, _______, _______ \
),
/* ADJUST
 * ,-----------------------------------------.                    ,-----------------------------------------.
 * |      |      |      |      |      |      |                    |      |      |      |      |      |      |
 * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
 * |      |      |      |      |      |      |                    |      |      |      |      |      |      |
 * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
 * |      |  !   |   "  |   #  |   $  |   %  |-------.    ,-------|   &  |  '   |   (  |  )   |      |      |
 * |------+------+------+------+------+------|       |    |       |------+------+------+------+------+------|
 * |      |      |      |      |      |      |-------|    |-------|      |      |      |      |      |      |
 * `-----------------------------------------/       /     \      \-----------------------------------------'
 *                   |      |      |      | /       /       \      \  |      |      |      |
 *                   |      |      |      |/       /         \      \ |      |      |      |
 *                   `----------------------------'           '------''--------------------'
 */
  [_ADJUST] = LAYOUT( \
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
  XXXXXXX, KC_EXLM, LSFT(KC_2), KC_HASH, KC_DLR  , KC_PERC,                   	LSFT(KC_6), LSFT(KC_7),LSFT(KC_8), LSFT(KC_9) , XXXXXXX, XXXXXXX, \
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, KC_AMPR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
                             _______, _______, _______, _______, _______,  _______, _______, _______ \
  )
};



```

:::note warn
当然だが、```_______```, ```XXXXXXX```は同じ数打たないとビルドするときにエラーが出る。
手打ちすると絶対に間違えるので気を付けよう。(15分ぐらい無駄にした。)
:::
<br>
半年ほどFILCOの**Majestouch MINILA-R Convertible**を使っていたので、これに準ずるような配置にしている。

https://www.diatec.co.jp/shop/MINILA-R/

ホームポジションから手を動かさないでもカーソル移動ができるようになっているので、コーディングの時とても便利。
~~（HHKBでvim使えばよくない？って言われたら何も言えない。）~~


なお、日本語配列ライクに作っているので、記号等のキーコードが少し特殊になっている。
具体的には

| キー | キーコード |
|:-:|:-:|
|@, `| KC_LBRC |
|:, *| KC_QUOT |
|\ | KC_INT3 |
|[, {|  KC_RBRC|
|], }| KC_NUHS |
|/, _ | KC_SLSH |
| " | LSFT(KC_2) |
| & | LSFT(KC_6) |
| ' |  LSFT(KC_7)|
| ( | LSFT(KC_8) |

などのようになっている（見づらくて申し訳ない...）

ちなみに、``LSFT(KC_2)``など``LSFT``がついているキーコードは、シフトキーと括弧内のキーが連続で入力されている。
（キーボード入力確認ソフトなどで見ると分かる。）

**レイヤーキーの同時押し（ここでは``LOWER``と``RAISE``）をすると、``ADJUST``のキーマップが反映される。**



# ビルド、そして書き込みを行う
ビルドするときは、

```terminal
qmk compile -kb キーボード名 -km キーマップ名
```

で行える。今回はキーボードが``lily58``、　キーマップが``mykeymap``なので

```terminal
qmk compile -kb lily58 -km mykeymap
```

という風にした。エラーがなければ``.hex``ファイルが``qmk_firmware``フォルダ内に作成される。

書き込みをするときは

```terminal
qmk flash -kb キーボード名 -km キーマップ名
```

でOK。

よって

```terminal
qmk flash -kb lily58 -km mykeymap
```

とする。
正常に書き込む準備ができたら、

```terminal
QMK Firmware 0.14.16
Making lily58/rev1 with keymap mykeymap and target flash

avr-gcc.exe (GCC) 8.4.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Size before:
   text    data     bss     dec     hex filename
      0   22112       0   22112    5660 .build/lily58_rev1_mykeymap.hex

Copying lily58_rev1_mykeymap.hex to qmk_firmware folder                                             [OK]
Checking file size of lily58_rev1_mykeymap.hex                                                      [OK]
 * The firmware size is fine - 22112/28672 (77%, 6560 bytes free)
Waiting for USB serial port - reset your controller now (Ctrl+C to cancel).........
```

のように出力される。
ここで``Pro Micro``をリセットすれば書き込みが行われる。
（キーボードによるがリセットスイッチがついていればそれでOK。）

**なお分割キーボードの場合、左と右両方のPro Microに書き込みを行わないといけないで注意。**

# まとめ、参考
これによって、ようやくレイヤーキーの同時押しを手に入れることができた。
今まではずらして押すことで何とか代用していたが、ミスが多かったので修正できてよかった。

**参考**

https://beta.docs.qmk.fm/using-qmk/simple-keycodes/keycodes

https://docs.qmk.fm/#/newbs_building_firmware