!!!参考 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キーが少ない !!組み立て 基本的に説明書はない。 +ケースの裏に基盤を当てて、四隅だけにキースイッチを取り付けて基盤を仮止めする ++ ※ケースにスイッチを全てはめてから、基盤を付けるとやりにくいので注意 +キースイッチをひとつづつ取り付け +ネジとナットで基盤を固定。ネジが短いのでアクリルボードはそのままナットを締めることはできない。 +両サイドのネジ穴で基盤とアクリルボードを固定 最終的にケースは使わず、プレートのみにした。 ケースを使うと高さが高くなり、ちょっとゴツくなる。プレートのみだとコンパクトでスタイリッシュに見えるため。 !ケースを使った場合 {{a_img wiki.cgi?action=ATTACH&page=%BC%AB%BA%EE%A5%AD%A1%BC%A5%DC%A1%BC%A5%C9+XD75re&file=img2%2Ejpg,img2.jpg,"target=_blank","style='width:300px;'"}} !ケースを使わず、プレートのみの場合 {{a_img wiki.cgi?action=ATTACH&page=%BC%AB%BA%EE%A5%AD%A1%BC%A5%DC%A1%BC%A5%C9+XD75re&file=P1240528%2EJPG,P1240528.JPG,"target=_blank","style='width:300px;'"}} !!プログラム 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をインストールする場合は + ./util/docker_build.sh xd75:default:dfu + キーボード側をリセットする ++ リセットする方法1:基盤の真ん中のスイッチをショートさせる。ケースの真ん中に穴が開いている。ここを除くと2つの穴が見えるので、細いクリップ等でショートさせる。 ++ (基盤を裏から見ると真ん中に6つのスイッチが縦に並んでいる。この一番上の2つ。表からショートさせるのが難しい場合は裏からショートさせると楽) ++ リセットする方法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 ではキー押してレイアウトを変更しながら、順番で好きな動作をさせることが出来るが、順番に関係なく同時押しで動きを変えたいことがある。 やり方が正しいかどうかは分からないが、同時押しで動きを変えるには + 物理的に押されている/離されているキーを記憶 + 物理的に押されている/離されているキーから判断して、論理的に押したことにしたい/離されたことにしたいキーの信号を送信 をすれば同時押しを実現可能。 !サンプル 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 . */ #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 . */ #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; } {{category2 ハードウェア}} {{comment reverse}}