トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

自作キーボード XD75re

参考

https://kiyooka.hatenablog.com/entry/2018/11/18/042524
https://qiita.com/sirojake/items/2e1c45f346b9ba3b9e7f
https://qiita.com/chesscommands/items/42ba11edd0f9b183ead7
https://note.mu/huaa/n/nd26474ae5b08
https://leico.github.io/TechnicalNote/QMK/key-customize
https://arekore.netlify.com/2018/0204-%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F/
https://scrapbox.io/self-made-kbds-ja/XD75
https://temcee.hatenablog.com/entry/diy_key_board
https://yhara.jp/LetsSplitKeySwitches
https://input.club/the-comparative-guide-to-mechanical-switches/
https://ysa256.blogspot.com/2018/06/xd752.html
https://scrapbox.io/self-made-kbds-ja/XD75

ファームウェアビルド

https://ascii.jp/elem/000/001/645/1645504/
http://okapies.hateblo.jp/entry/2019/02/02/133953
https://beta.docs.qmk.fm/features/feature_macros
https://qiita.com/Nymphium/items/2775b8c3555f733fafdc

日本語キーボードにする場合

https://note.mu/huaa/n/nd26474ae5b08

必要なもの

パーツ 説明
PCB ダイオードやマイコンを半田付けする基盤
ダイオード 電流の流れを制御
マイコン ファームウェアをインストールし、キーボードとして動作させる。
プレート スイッチを固定するもの
スイッチ キーのスイッチ部。赤軸とか茶軸とかでキーの重さや音が変わる。
キーキャップ 文字が書いてあるスイッチに被せるもの
ケース キーボード自体のケース

PCB、ダイオード、マイコンセットになっているキットも存在する。
半田付け不要で、組み合わせるだけで良いものものある。

XD75re

 概要

5x15の75キーで60%キーボードサイズのキーボード。
基盤にはダイオードやLEDが実装済みで販売されている。
キースイッチはホットスワップで半田付け不要なので、扱いやすい。
好きなキーキャップとキースイッチがあれば、簡単に組み立てが完了する。

種類 キースイッチ 半田付け
XD75Re MXのみ 半田付け不要で、キースイッチはホットスワップ
XD75Am MX、ALPS両対応 半田付けが必要

 注文


注文したもの AliExpressのURL 備考
XD75REの基盤 https://ja.aliexpress.com/item/32818745981.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N XD75Reを選択(黒い基盤)、白い方はXD75Amで半田付けが必要になるので注意
ケース https://ja.aliexpress.com/item/32821659665.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N アクリルボードも付いてくる。
プレート https://ja.aliexpress.com/item/32821198488.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N 上記のケースがあれば、このプレートは不要。無駄になってしまった。
スイッチ https://ja.aliexpress.com/item/32815810102.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N 茶軸を80個ほど購入。静音茶軸の方が良かったかも。
キーキャップ https://ja.aliexpress.com/item/32997912293.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N 無難。さわり心地も悪くない。ただ、ctrlとかaltキーが少ない

 組み立て

基本的に説明書はない。

  1. ケースの裏に基盤を当てて、四隅だけにキースイッチを取り付けて基盤を仮止めする
    1. ※ケースにスイッチを全てはめてから、基盤を付けるとやりにくいので注意
  2. キースイッチをひとつづつ取り付け
  3. ネジとナットで基盤を固定。ネジが短いのでアクリルボードはそのままナットを締めることはできない。
  4. 両サイドのネジ穴で基盤とアクリルボードを固定

最終的にケースは使わず、プレートのみにした。
ケースを使うと高さが高くなり、ちょっとゴツくなる。プレートのみだとコンパクトでスタイリッシュに見えるため。

ケースを使った場合

wiki.cgi?action=ATTACH&page=%BC%AB%BA%EE%A5%AD%A1%BC%A5%DC%A1%BC%A5%C9+XD75re&file=img2%2Ejpg

ケースを使わず、プレートのみの場合

wiki.cgi?action=ATTACH&page=%BC%AB%BA%EE%A5%AD%A1%BC%A5%DC%A1%BC%A5%C9+XD75re&file=P1240528%2EJPG

 プログラム

qmk firmwareでファームウェアの書き換えが可能。
https://github.com/qmk/qmk_firmware

コンパイル、ファームウェアインストールの流れ(dockerを使う場合)

gitからクローン

git clone https://github.com/qmk/qmk_firmware.git

qmk_firmware/keyboards/xd75/keymaps

以下に幾つかサンプル的なプログラムがある。

qmk_firmware/keyboards/xd75/keymaps/default

が標準のキー配置。このdefaultをインストールする場合は

  1. ./util/docker_build.sh xd75:default:dfu
  2. キーボード側をリセットする
    1. リセットする方法1:基盤の真ん中のスイッチをショートさせる。ケースの真ん中に穴が開いている。ここを除くと2つの穴が見えるので、細いクリップ等でショートさせる。
    2. (基盤を裏から見ると真ん中に6つのスイッチが縦に並んでいる。この一番上の2つ。表からショートさせるのが難しい場合は裏からショートさせると楽)
    3. リセットする方法2:キー配置を変更する際に、リセットキーを配置することが出来る。このキーで物理的にショートしなくてもリセットが出来る。

コンパイル、ファームウェアインストールの流れ(docker以外の場合)

gitからクローン

git clone https://github.com/qmk/qmk_firmware.git

コンパイルに必要なパッケージを準備する。
パッケージをインストールするコマンドが準備されている。環境によりコマンドが違う。

./util/linux_install.sh

とか

./util/mac_install.sh

とか
パッケージが準備されたら

make xd75:default:dfu

キーボードのリセット等は上記のdockerを利用する場合と同じ。

自分独自のキー配置やマクロを作成する

もし自分用のキー配置やマクロを作成する場合は適当なディレクトリを

qmk_firmware/keyboards/xd75/keymaps/hoge

などを作成して

config.h
keymap.c
readme.md
rules.mk

をdefaultからコピーする。keymap.c を書き換えて

./util/docker_build.sh xd75:hoge:dfu
make  xd75:hoge:dfu

 qmk_firmware の ドキュメント

https://docs.qmk.fm/
https://github.com/qmk/qmk_firmware/tree/master/docs

 qmk_firmware で同時押しを実現する

qmk firmware ではキー押してレイアウトを変更しながら、順番で好きな動作をさせることが出来るが、順番に関係なく同時押しで動きを変えたいことがある。
やり方が正しいかどうかは分からないが、同時押しで動きを変えるには

  1. 物理的に押されている/離されているキーを記憶
  2. 物理的に押されている/離されているキーから判断して、論理的に押したことにしたい/離されたことにしたいキーの信号を送信

をすれば同時押しを実現可能。

サンプル

Linux、Windowsの場合は、Ctrl + 矢印キー で単語移動、段落移動、Ctrl + Shift + 矢印キー で単語選択、段落選択が標準的な動きだけど
Macの場合は、Optionキーだったり、Cmdキーだったりでわかりにくいので、Cmd + 矢印キーで単語移動やHome、Endで行末移動を出来るようにする。
具体的には、Mac用のレイヤーにしているときは、物理的にCmdと矢印キーが押された場合に、他のキーに置き換えてしまう。

 /* Copyright 2017 Wunder
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include QMK_KEYBOARD_H
 
 #define JP_ZHTG KC_GRV  // hankaku/zenkaku|kanzi
 #define JP_YEN  KC_INT3 // yen, |
 #define JP_CIRC KC_EQL  // ^, ~
 #define JP_AT   KC_LBRC // @, `
 #define JP_LBRC KC_RBRC // [, {
 #define JP_COLN KC_QUOT // :, *
 #define JP_RBRC KC_NUHS // ], }
 #define JP_BSLS KC_INT1 // \, _
 
 // Layer shorthand
 #define _USB 0
 #define _JPB 1
 
 // Layer shorthand
 #define _US1 2
 #define _JP1 3
 #define _JP2 4
 
 // Layer For Mac
 #define _MUB 5
 #define _MJB 6
 #define _MU1 7
 #define _MJ1 8
 #define _MJ2 9
 #define _MJ3 10
 
 // Layer For Common
 #define __CS 11
 #define __FN 12
 #define _FN2 13
 #define _FN3 14 
 // #define _MCS 4
 // #define _MFN 5
 #define _MNT 15
 #define _TMP 16
 
 #define KC_WMH LT(__CS, KC_MHEN)
 #define KC_WHN LT(__FN, KC_HENK)
 #define KC_MMH LT(__CS, KC_LANG2)
 #define KC_MHN LT(__FN, KC_LANG1)
 
 #define KEYS_MAX 256
 #define PHYS 0
 #define LOGI 1
 #define TRAN 2
 bool keys[KEYS_MAX][3] = {};
 
 #define MODE_NORMAL 0
 #define MODE_MAC 1
 uint8_t mode = MODE_NORMAL;
 uint8_t layer = _USB;
 
 // Defines the keycodes used by our macros in process_record_user
 // とりあえず、使わない
 enum custom_keycodes {
   QMKBEST = SAFE_RANGE,
   QMKURL
 };
 
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   /* QWERTY(US)
   * .--------------------------------------------------------------------------------------------------------------------------------------.
   * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -      | =      | \      | BACKSP |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
   * | PG UP  | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | [      | ]      | DEL    |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
   * | PG DN  | LCTRL  | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      | `      | ENTER  |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
   * | HOME   | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /      | RSHIFT | RSHIFT | RCTRL  |
   * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
   * | END    | LCTRL  | LGUI   | LALT   | LALT   | FN/MHEN| SPACE  | SPACE  | FN/HEN | RALT   | MENU   | LEFT   | DOWN   | UP     | RIGHT  |
   * '--------------------------------------------------------------------------------------------------------------------------------------'
   */
   
   [_USB] = LAYOUT_ortho_5x15( /* QWERTY */
     KC_ESC,   KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_BSPC,
     KC_PGUP,  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_RBRC, KC_DEL,
     KC_PGDN,  KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_GRV,  KC_ENT,
     KC_HOME,  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_RCTL,
     KC_END,   KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, KC_WMH,  KC_SPC,  KC_RSFT, KC_WHN,  KC_RALT, KC_APP,  KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT
     ),
   
   /* QWERTY(JP)
   * .--------------------------------------------------------------------------------------------------------------------------------------.
   * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -, =   | ^, ~   | \, |   | BACKSP |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
   * | PG UP  | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | @, `   | [, {   | DEL    |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
   * | PG DN  | LCTRL  | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;, +   | :, *   | ], }   | ENTER  |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
   * | HOME   | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /, ?   | \, _   | RSHIFT | RCTRL  |
   * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
   * | END    | LCTRL  | LGUI   | LALT   | LALT   | FN/MHEN| SPACE  | SPACE  | FN/HEN | RALT   | MENU   | LEFT   | DOWN   | UP     | RIGHT  |
   * '--------------------------------------------------------------------------------------------------------------------------------------'
   */
   [_JPB] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,  _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC, _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC, _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______, _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______, _______
     ),
   
   [_US1] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
     KC_LCTL, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
     KC_LCTL, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
     KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
     ),
   
   [_JP1] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,  _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC, _______,
     KC_LCTL, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC, _______,
     KC_LCTL, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______, _______,
     KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______, _______
     ),
   
   [_JP2] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,  _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC, _______,
     KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC, _______,
     KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______, _______,
     KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______, _______
     ),
   
   [_MUB] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     _______, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  KC_RGUI,
     _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LCTL, KC_MMH,  _______, _______, KC_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [_MJB] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,   _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC,  _______,
     _______, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC,  _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______,  KC_RGUI,
     _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LCTL, KC_MMH,  _______, _______, KC_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [_MU1] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     KC_LGUI, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     KC_LGUI, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  KC_RGUI,
     KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL, KC_MMH,  _______, _______, KC_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [_MJ1] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,   _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC,  _______,
     KC_LGUI, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC,  _______,
     KC_LGUI, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______,  KC_RGUI,
     KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL,  KC_MMH, _______, _______, KC_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [_MJ2] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,   _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC,  _______,
     KC_LGUI, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC,  _______,
     KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______,  KC_RGUI,
     KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL,  KC_MMH, _______, _______, KC_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [_MJ3] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,   _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC,  _______,
     KC_LGUI, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC,  _______,
     KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______,  KC_RGUI,
     KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL,  KC_MMH, _______, _______, KC_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [__CS] = LAYOUT_ortho_5x15( /* FUNCTION */
     JP_ZHTG,  _______,  _______,  _______,  _______, _______,   _______, _______, _______,  KC_BSPC,  KC_DEL,  _______, _______, _______, _______,
     _______,  _______,  _______,  _______,  _______, _______,   _______, _______, KC_F2,    KC_UP,   KC_PGUP,  _______, _______, _______, _______,
     _______,  _______,  _______,  _______,  _______, _______,   _______, KC_ESC,  KC_LEFT,  KC_DOWN, KC_RIGHT, KC_HOME, KC_END,  _______, _______,
     _______,  _______,  _______,  _______,  _______, _______,   _______, _______, _______,  _______, KC_PGDN,  _______, _______, _______, _______,
     _______,  _______,  _______,  _______,  _______, MO(__CS),  _______, _______, MO(_FN3), _______, _______,  KC_HOME, KC_PGDN, KC_PGUP, KC_END
     ),
   
   [__FN] = LAYOUT_ortho_5x15( /* FUNCTION */
     JP_ZHTG,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,    KC_F6,   KC_F7,   KC_F8,    KC_F9,   KC_F10,   KC_F11,  KC_F12,  _______, _______,
     _______, _______,   _______,  _______,  _______,  _______,  _______, _______, KC_F2,    KC_UP,   KC_PGUP,  _______, KC_PSCR, KC_SLCK,  KC_PAUS,
     _______, _______,   _______,  _______,  _______,  _______,  _______, KC_ESC,  KC_LEFT,  KC_DOWN, KC_RIGHT, KC_HOME, KC_END,  _______,  _______,
     _______, _______,   _______,  _______,  _______,  _______,  _______, _______, _______,  _______, KC_PGDN,  _______, _______, _______,  _______,
     _______, _______,   _______,  _______,  _______,  MO(_FN2), _______, _______, MO(__FN), _______, _______,  KC_HOME, KC_PGDN, KC_PGUP, KC_END
     ),
   
   [_FN2] = LAYOUT_ortho_5x15( /* FUNCTION */
     KC_MUTE, _______,   _______,  _______,  _______,  _______,  _______, _______, _______,  _______, _______,  _______, KC_PSLS, KC_PAST,  KC_BSPC,
     KC_VOLU, _______,   _______,  _______,  _______,  _______,  _______, _______, KC_PSCR,  KC_SLCK,  KC_PAUS, KC_P7,   KC_P8,   KC_P9,    KC_PMNS,
     KC_VOLD, _______,   _______,  KC_MPLY,  KC_MPRV,  KC_MNXT,  _______, _______, KC_INS,   KC_HOME, KC_PGUP,  KC_P4,   KC_P5,   KC_P6,    KC_PPLS,
     _______, _______,   _______,  _______,  _______,  _______,  _______, _______, KC_DEL,   KC_END,  KC_PGDN,  KC_P1,   KC_P2,   KC_P3,    KC_PENT,
     _______, _______,   _______,  _______,  _______,  MO(_FN2), _______, _______, MO(_FN2), _______, _______,  KC_P0,   KC_P0,   KC_PDOT,  KC_PENT
     ),
   
   [_FN3] = LAYOUT_ortho_5x15( /* FUNCTION */
     TO(_USB),TO(_US1), TO(_MUB), TO(_MU1),  _______,  _______,  _______, _______, _______,  _______, _______,  _______, _______, _______,  TO(_MNT),
     TO(_JPB),TO(_JP1), TO(_MJB), TO(_MJ1),  _______,  _______,  _______, _______, _______,  _______, _______,  _______, _______, _______,  _______,
     _______, TO(_JP2),  _______, TO(_MJ2),  _______,  _______,  _______, _______, _______,  _______, _______,  _______, _______, _______,  _______,
     _______, _______,   _______, TO(_MJ3),  _______,  _______,  _______, _______, _______,  _______, _______,  _______, _______, _______,  _______,
     _______, _______,   _______,  _______,  _______,  MO(_FN3), _______, _______, MO(_FN3), _______, _______,  _______, _______, _______,  _______
     ),
   
   [_MNT] = LAYOUT_ortho_5x15( /* FUNCTION */
     TO(_USB),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, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
     XXXXXXX, XXXXXXX, XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
     RGB_TOG, RGB_MOD, RGB_RMOD, RGB_HUI,   RGB_HUD,  RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET,   XXXXXXX,
     RGB_M_P, RGB_M_B, RGB_M_R,  RGB_M_SW,  RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
     ),
   
   [_TMP] = LAYOUT_ortho_5x15( /* FUNCTION */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(_MNT),
     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
     _______, _______, _______, _______, _______, _______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______,
     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
     )
 };
 
 void clear(uint8_t kind) {
   for (int i = 0; i < KEYS_MAX; i++ ) {
     keys[i][kind] = false;
   }
 }
 
 bool isPressed(uint8_t kind, uint16_t keycode) {
   return keys[keycode][kind];
 }
 
 void pressKey(uint8_t kind, uint16_t keycode) {
   keys[keycode][kind] = true;
 }
 
 void releaseKey(uint8_t kind, uint16_t keycode) {
   keys[keycode][kind] = false;
 }
 
 // 最終的に必要なキーのみを設定。足りないものを押して、不要なものをリリースする。
 void fixKey(uint8_t kind) {
   // 離すときは文字キーから離す
   for (int i = 0; i < KEYS_MAX; i++) {
     if (keys[i][kind] != keys[i][LOGI] && !keys[i][kind]) {
       unregister_code(i);
       keys[i][LOGI] = keys[i][kind];
     }
   }
   
   // 押すときは修飾キーから押す
   for (int i = KEYS_MAX - 1; i >= 0 ; i--) {
     if (keys[i][kind] != keys[i][LOGI] && keys[i][kind]) {
       register_code(i);
       keys[i][LOGI] = keys[i][kind];
     }
   }
 }
 
 bool processKey(uint32_t keycode, bool pressed) {
   clear(TRAN);
   bool trans = false;
   
   if (mode == MODE_MAC) {
     if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
       if (isPressed(PHYS, KC_UP)) {
         pressKey(TRAN, KC_UP);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_LEFT)) {
         pressKey(TRAN, KC_LEFT);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_DOWN)) {
         pressKey(TRAN, KC_DOWN);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_RIGHT)) {
         pressKey(TRAN, KC_RIGHT);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_HOME)) {
         pressKey(TRAN, KC_LGUI);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_UP);
         } else {
           pressKey(TRAN, KC_LEFT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_END)) {
         pressKey(TRAN, KC_LGUI);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_DOWN);
         } else {
           pressKey(TRAN, KC_RIGHT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_BSPC)) {
         pressKey(TRAN, KC_BSPC);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_DEL)) {
         pressKey(TRAN, KC_DEL);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_P)) {
         pressKey(TRAN, KC_PGUP);
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LCTL);
         } else {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_LBRC)) {
         pressKey(TRAN, KC_PGDN);
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LCTL);
         } else {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       }
     }
   } else {
     if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
       if (isPressed(PHYS, KC_P)) {
         pressKey(TRAN, KC_PGUP);
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LCTL);
         } else {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_LBRC)) {
         pressKey(TRAN, KC_PGDN);
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LCTL);
         } else {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       }
     }
   }
   
   if (trans) {
     fixKey(TRAN);
   } else {
     fixKey(PHYS);
   }
   
   return false;
 }
 
 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
   if (KEYS_MAX <= keycode) {
     return true;
   }
   
   bool pressed = record->event.pressed;
   
   if (pressed) {
     keys[keycode][PHYS] = true;
   } else {
     keys[keycode][PHYS] = false;
   }
   
   return processKey(keycode, pressed);
 }
 
 void matrix_init_user(void) {
   rgblight_enable();
   rgblight_mode(1);
   rgblight_setrgb(0, 0, 0);
 }
 
 void matrix_scan_user(void) {
 }
 
 void led_set_user(uint8_t usb_led) {}
 
 uint32_t layer_state_set_user(uint32_t state) {
   layer = biton32(state);
   
   if (layer == _MNT) {
     rgblight_setrgb(30, 0, 0);
   } else {
     rgblight_setrgb(0, 0, 0);
   }
   
   if (_MUB <= layer && layer <= _MJ3) {
     mode = MODE_MAC;
   } else if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
     // do nothing
   } else {
     mode = MODE_NORMAL;
   }
   return state;
 }

サンプル2

 /* Copyright 2017 Wunder
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include QMK_KEYBOARD_H
 
 #define JP_ZHTG KC_GRV  // hankaku/zenkaku|kanzi
 #define JP_YEN  KC_INT3 // yen, |
 #define JP_CIRC KC_EQL  // ^, ~
 #define JP_AT   KC_LBRC // @, `
 #define JP_LBRC KC_RBRC // [, {
 #define JP_COLN KC_QUOT // :, *
 #define JP_RBRC KC_NUHS // ], }
 #define JP_BSLS KC_INT1 // \, _
 
 
 // Layer shorthand
 enum layuer_shorthand {
   _USB = 0,
   _JPB,
   _US1,
   _JP1,
   _MUB,
   _MJB,
   _MU1,
   _MJ1,
   _MJ2,
   __CS,
   __FN,
   _FN2,
   _FN3,
   _MNT,
   _TMP,
 };
 
 // #define CK_WMH LT(__CS, KC_MHEN)
 // #define CK_WHN LT(__FN, KC_HENK)
 // #define CK_MMH LT(__CS, KC_LANG2)
 // #define CK_MHN LT(__FN, KC_LANG1)
 
 #define KEYS_MAX 256
 #define PHYS 0
 #define LOGI 1
 #define TRAN 2
 bool keys[KEYS_MAX][3] = {};
 
 #define MODE_NORMAL 0
 #define MODE_MAC 1
 uint8_t mode = MODE_NORMAL;
 uint8_t layer = _USB;
 uint16_t last_press_keycode = KC_NO;
 
 // Defines the keycodes used by our macros in process_record_user
 enum custom_keycodes {
   QMKBEST = SAFE_RANGE,
   CK_WMH,
   CK_WHN,
   CK_MMH,
   CK_MHN,
 };
 
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   /* QWERTY(US)
   * .--------------------------------------------------------------------------------------------------------------------------------------.
   * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -      | =      | \      | BACKSP |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
   * | PG UP  | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | [      | ]      | DEL    |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
   * | PG DN  | LCTRL  | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      | `      | ENTER  |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
   * | HOME   | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /      | RSHIFT | RSHIFT | RCTRL  |
   * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
   * | END    | LCTRL  | LGUI   | LALT   | LALT   | FN/MHEN| SPACE  | SPACE  | FN/HEN | RALT   | MENU   | LEFT   | DOWN   | UP     | RIGHT  |
   * '--------------------------------------------------------------------------------------------------------------------------------------'
   */
   
   [_USB] = LAYOUT_ortho_5x15( /* QWERTY */
     KC_ESC,   KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_BSPC,
     KC_PGUP,  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_RBRC, KC_DEL,
     KC_PGDN,  KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_GRV,  KC_ENT,
     KC_HOME,  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_RCTL,
     KC_END,   KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, CK_WMH,  KC_SPC,  KC_SPC,  CK_WHN,  KC_RALT, KC_APP,  KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT
     ),
   
   /* QWERTY(JP)
   * .--------------------------------------------------------------------------------------------------------------------------------------.
   * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -, =   | ^, ~   | \, |   | BACKSP |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
   * | PG UP  | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | @, `   | [, {   | DEL    |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
   * | PG DN  | LCTRL  | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;, +   | :, *   | ], }   | ENTER  |
   * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
   * | HOME   | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /, ?   | \, _   | RSHIFT | RCTRL  |
   * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
   * | END    | LCTRL  | LGUI   | LALT   | LALT   | FN/MHEN| SPACE  | SPACE  | FN/HEN | RALT   | MENU   | LEFT   | DOWN   | UP     | RIGHT  |
   * '--------------------------------------------------------------------------------------------------------------------------------------'
   */
   [_JPB] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,  _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC, _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC, _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______, _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______, _______
     ),
   
   [_US1] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
     KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
     KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
     KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, KC_RSFT, _______, _______, _______, _______, _______, _______, _______
     ),
   
   [_JP1] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,  _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC, _______,
     KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC, _______,
     KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______, _______,
     KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, KC_RSFT, _______, _______, _______, _______, _______,  _______, _______
     ),
   
   [_MUB] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     _______, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  KC_RGUI,
     _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LCTL, CK_MMH,  _______, _______, CK_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [_MJB] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,   _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC,  _______,
     _______, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC,  _______,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______,  KC_RGUI,
     _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LCTL, CK_MMH,  _______, _______, CK_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [_MU1] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     KC_LGUI, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  _______,
     KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  _______,  KC_RGUI,
     KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL, CK_MMH,  _______, KC_RSFT, CK_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [_MJ1] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,   _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC,  _______,
     KC_LGUI, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC,  _______,
     KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______,  KC_RGUI,
     KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL,  CK_MMH, _______, KC_RSFT, CK_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [_MJ2] = LAYOUT_ortho_5x15( /* QWERTY */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_YEN,   _______,
     KC_TAB,  KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT,    JP_LBRC,  _______,
     KC_LGUI, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  JP_RBRC,  _______,
     KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS,  _______,  KC_RGUI,
     KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL,  CK_MMH, _______, KC_RSFT, CK_MHN,  KC_RCTL, _______, _______, _______,  _______,  _______
     ),
   
   [__CS] = LAYOUT_ortho_5x15( /* FUNCTION */
     JP_ZHTG,  _______,  _______,  _______,  _______, _______,   _______, _______, _______,  KC_BSPC,  KC_DEL,  _______, _______, _______, _______,
     _______,  _______,  _______,  _______,  _______, _______,   _______, _______, KC_F2,    KC_UP,   KC_PGUP,  _______, _______, _______, _______,
     _______,  _______,  _______,  _______,  _______, _______,   _______, KC_ESC,  KC_LEFT,  KC_DOWN, KC_RIGHT, KC_HOME, KC_END,  _______, _______,
     _______,  _______,  _______,  _______,  _______, _______,   _______, _______, _______,  _______, KC_PGDN,  _______, _______, _______, _______,
     _______,  _______,  _______,  _______,  _______, _______,   _______, _______, MO(_FN3), _______, _______,  KC_HOME, KC_PGDN, KC_PGUP, KC_END
     ),
   
   [__FN] = LAYOUT_ortho_5x15( /* FUNCTION */
     JP_ZHTG,  KC_F1,    KC_F2,    KC_F3,    KC_F4,     KC_F5,    KC_F6,   KC_F7,   KC_F8,    KC_F9,   KC_F10,   KC_F11,  KC_F12,  _______, _______,
     _______, _______,   _______,  _______,  _______,  _______,  _______, _______, KC_F2,    KC_UP,   KC_PGUP,  _______, KC_PSCR, KC_SLCK,  KC_PAUS,
     _______, _______,   _______,  _______,  _______,  _______,  _______, KC_ESC,  KC_LEFT,  KC_DOWN, KC_RIGHT, KC_HOME, KC_END,  _______,  _______,
     _______, _______,   _______,  _______,  _______,  _______,  _______, _______, _______,  _______, KC_PGDN,  _______, _______, _______,  _______,
     _______, _______,   _______,  _______,  _______,  MO(_FN2), _______, _______, _______,  _______, _______,  KC_HOME, KC_PGDN, KC_PGUP, KC_END
     ),
   
   [_FN2] = LAYOUT_ortho_5x15( /* FUNCTION */
     KC_MUTE, _______,   _______,  _______,  _______,  _______,  _______, _______, _______,  _______, _______,  _______, KC_PSLS, KC_PAST,  KC_BSPC,
     KC_VOLU, _______,   _______,  _______,  _______,  _______,  _______, _______, KC_PSCR,  KC_SLCK,  KC_PAUS, KC_P7,   KC_P8,   KC_P9,    KC_PMNS,
     KC_VOLD, _______,   _______,  KC_MPLY,  KC_MPRV,  KC_MNXT,  _______, _______, KC_INS,   KC_HOME, KC_PGUP,  KC_P4,   KC_P5,   KC_P6,    KC_PPLS,
     _______, _______,   _______,  _______,  _______,  _______,  _______, _______, KC_DEL,   KC_END,  KC_PGDN,  KC_P1,   KC_P2,   KC_P3,    KC_PENT,
     _______, _______,   _______,  _______,  _______,  MO(_FN2), _______, _______, MO(_FN2), _______, _______,  KC_P0,   KC_P0,   KC_PDOT,  KC_PENT
     ),
   
   [_FN3] = LAYOUT_ortho_5x15( /* FUNCTION */
     TO(_USB),TO(_JPB), TO(_MUB), TO(_MJB),  _______,  _______,  _______, _______, _______,  _______, _______,  _______, _______, _______,  TO(_MNT),
     TO(_US1),TO(_JP1), TO(_MU1), TO(_MJ1),  _______,  _______,  _______, _______, _______,  _______, _______,  _______, _______, _______,  _______,
     _______, _______,   _______, TO(_MJ2),  _______,  _______,  _______, _______, _______,  _______, _______,  _______, _______, _______,  _______,
     _______, _______,   _______,  _______,  _______,  _______,  _______, _______, _______,  _______, _______,  _______, _______, _______,  _______,
     _______, _______,   _______,  _______,  _______,  MO(_FN3), _______, _______, MO(_FN3), _______, _______,  _______, _______, _______,  _______
     ),
   
   [_MNT] = LAYOUT_ortho_5x15( /* FUNCTION */
     TO(_USB),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, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
     XXXXXXX, XXXXXXX, XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
     RGB_TOG, RGB_MOD, RGB_RMOD, RGB_HUI,   RGB_HUD,  RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET,   XXXXXXX,
     RGB_M_P, RGB_M_B, RGB_M_R,  RGB_M_SW,  RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
     ),
   
   [_TMP] = LAYOUT_ortho_5x15( /* FUNCTION */
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(_MNT),
     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
     _______, _______, _______, _______, _______, _______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______,
     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
     )
 };
 
 void clear(uint8_t kind) {
   for (int i = 0; i < KEYS_MAX; i++ ) {
     keys[i][kind] = false;
   }
 }
 
 bool isPressed(uint8_t kind, uint16_t keycode) {
   return keys[keycode][kind];
 }
 
 void pressKey(uint8_t kind, uint16_t keycode) {
   keys[keycode][kind] = true;
 }
 
 void releaseKey(uint8_t kind, uint16_t keycode) {
   keys[keycode][kind] = false;
 }
 
 // 最終的に必要なキーのみを設定。足りないものを押して、不要なものをリリースする。
 void fixKey(uint8_t kind) {
   // 離すときは文字キーから離す
   for (int i = 0; i < KEYS_MAX; i++) {
     if (keys[i][kind] != keys[i][LOGI] && !keys[i][kind]) {
       unregister_code(i);
       keys[i][LOGI] = keys[i][kind];
     }
   }
   
   // 押すときは修飾キーから押す
   for (int i = KEYS_MAX - 1; i >= 0 ; i--) {
     if (keys[i][kind] != keys[i][LOGI] && keys[i][kind]) {
       register_code(i);
       keys[i][LOGI] = keys[i][kind];
     }
   }
 }
 
 bool processKey(uint32_t keycode, bool pressed) {
   clear(TRAN);
   bool trans = false;
   
   if (mode == MODE_MAC) {
     if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
       if (isPressed(PHYS, KC_UP)) {
         pressKey(TRAN, KC_UP);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         if (isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_RSFT);
         }
         if (isPressed(PHYS, KC_LALT)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LCTL)) {
           pressKey(TRAN, KC_LCTL);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_LEFT)) {
         pressKey(TRAN, KC_LEFT);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         if (isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_RSFT);
         }
         if (isPressed(PHYS, KC_LALT)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LCTL)) {
           pressKey(TRAN, KC_LCTL);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_DOWN)) {
         pressKey(TRAN, KC_DOWN);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         if (isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_RSFT);
         }
         if (isPressed(PHYS, KC_LALT)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LCTL)) {
           pressKey(TRAN, KC_LCTL);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_RIGHT)) {
         pressKey(TRAN, KC_RIGHT);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         if (isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_RSFT);
         }
         if (isPressed(PHYS, KC_LALT)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LCTL)) {
           pressKey(TRAN, KC_LCTL);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_HOME)) {
         pressKey(TRAN, KC_LGUI);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_UP);
         } else {
           pressKey(TRAN, KC_LEFT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         if (isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_RSFT);
         }
         if (isPressed(PHYS, KC_LALT)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LCTL)) {
           pressKey(TRAN, KC_LCTL);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_END)) {
         pressKey(TRAN, KC_LGUI);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_DOWN);
         } else {
           pressKey(TRAN, KC_RIGHT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         if (isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_RSFT);
         }
         if (isPressed(PHYS, KC_LALT)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LCTL)) {
           pressKey(TRAN, KC_LCTL);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_BSPC)) {
         pressKey(TRAN, KC_BSPC);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         if (isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_RSFT);
         }
         if (isPressed(PHYS, KC_LALT)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LCTL)) {
           pressKey(TRAN, KC_LCTL);
         }
         trans = true;
       } 
       
       if (isPressed(PHYS, KC_DEL)) {
         pressKey(TRAN, KC_DEL);
         if (isPressed(PHYS, KC_LGUI)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LSFT)) {
           pressKey(TRAN, KC_LSFT);
         }
         if (isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_RSFT);
         }
         if (isPressed(PHYS, KC_LALT)) {
           pressKey(TRAN, KC_LALT);
         }
         if (isPressed(PHYS, KC_LCTL)) {
           pressKey(TRAN, KC_LCTL);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_P)) {
         pressKey(TRAN, KC_PGUP);
         if (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_LCTL);
         } else {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_LBRC)) {
         pressKey(TRAN, KC_PGDN);
         if (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_LCTL);
         } else {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       }
     }
   } else {
     if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
       if (isPressed(PHYS, KC_P)) {
         pressKey(TRAN, KC_PGUP);
         if (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_LCTL);
         } else {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       }
       
       if (isPressed(PHYS, KC_LBRC)) {
         pressKey(TRAN, KC_PGDN);
         if (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) {
           pressKey(TRAN, KC_LCTL);
         } else {
           pressKey(TRAN, KC_LALT);
         }
         trans = true;
       }
     }
   }
   
   if (trans) {
     fixKey(TRAN);
   } else {
     fixKey(PHYS);
   }
   
   return false;
 }
 
 void processHenkanMuhenkan(uint16_t keycode, bool pressed) {
   if (pressed) {
     switch (keycode) {
     case CK_WMH:
     case CK_MMH:
       layer_on(__CS);
       break;
     case CK_WHN:
     case CK_MHN:
       layer_on(__FN);
       break;
     }
     last_press_keycode = keycode;
   } else {
     switch (keycode) {
     case CK_WMH:
     case CK_MMH:
       layer_off(__CS);
       break;
     case CK_WHN:
     case CK_MHN:
       layer_off(__FN);
       break;
     }
     
     if (last_press_keycode == keycode) {
       switch (keycode) {
       case CK_WMH:
         register_code(KC_MHEN);
         unregister_code(KC_MHEN);
         break;
       case CK_MMH:
         register_code(KC_LANG2);
         unregister_code(KC_LANG2);
         break;
       case CK_WHN:
         register_code(KC_HENK);
         unregister_code(KC_HENK);
         break;
       case CK_MHN:
         register_code(KC_LANG1);
         unregister_code(KC_LANG1);
         break;
       }
     }
   }
 }
 
 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
   bool pressed = record->event.pressed;
   
   processHenkanMuhenkan(keycode, pressed);
   
   if (KEYS_MAX <= keycode) {
     return true;
   }
   
   if (pressed) {
     keys[keycode][PHYS] = true;
   } else {
     keys[keycode][PHYS] = false;
   }
   
   return processKey(keycode, pressed);
 }
 
 void matrix_init_user(void) {
   rgblight_enable();
   rgblight_mode(1);
   rgblight_setrgb(0, 0, 0);
 }
 
 void matrix_scan_user(void) {
 }
 
 void led_set_user(uint8_t usb_led) {}
 
 uint32_t layer_state_set_user(uint32_t state) {
   layer = biton32(state);
   
   if (layer == _MNT) {
     rgblight_setrgb(30, 0, 0);
   } else {
     rgblight_setrgb(0, 0, 0);
   }
   
   if (_MUB <= layer && layer <= _MJ2) {
     mode = MODE_MAC;
   } else if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
     // do nothing
   } else {
     mode = MODE_NORMAL;
   }
   return state;
 }

[カテゴリ: ハードウェア]

お名前: コメント:

[通知用URL]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2020年01月26日 20時59分24秒