見出し画像

Neo Ergoであそぼ。①(Vial編)

はじめに

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

Neo Ergoとは

猫山王が今回Vial化するのは、Qwertykeysから発売されているNeo Ergoというキーボードである。Qwertykeysは、エントリーレベルのキーボードを販売しており、Neoシリーズはその中でも価格競争力の高い(安価な)入門キーボードである。安価といってもシリーズ通してアルミ筐体を採用しているので見た目のチープさは一切感じない。また、豊富なカラーバリエーションに加えて、ウェイトやスイッチプレートの素材、PBCもSolder、Hotswap、無線バージョンなど自由自在な組み合わせができるカスタムキーボードへの入門修行僧にとっては大変ありがたい存在である。Neo ErgoはそんなNeoシリーズの中で満を持して投入されたAlice配列のキーボードで、Type-Kからインスピレーションを受けていると巷で話題のNLandkeysから発売を予定しているKyubi Kitと双璧をなす存在である。Neo Ergoは現在もQwertykeysから販売されているものの、日本向けのリージョナルベンダーとしてSwagkeysがアサインされ、Swagkeysでの販売は2024年5月下旬のほんの1週間ほどの短期間で残念ながら終了となってしまった。Swagkeysでの販売期間は事前にアナウンスされていなかったようで、買いそびれたAlice配列信者も多数いるかもしれない。QwertykeysのwebサイトではNeo Ergoはリージョンブロックがなされ、日本からだとCheck outが出来ない残念仕様である。猫山王は事前にSwagkeysのカスタマーサポートに連絡して発売日の情報をゲットし、発売日に迷わず購入したので幸運にも手に入れることができた。カスタムキーボード界の掟である「買わずに後悔するなら、買って後悔せよ。迷ったら買え。」を肝に銘じて、引き続きカスタムキーボードの購入修行に励んでいく所存である。

ちなみに猫山王のNeo Ergoの仕様は以下である。

・Case - Anodized Purple
Kyubi KitやKrush65の紫色のキーボードを見て、紫色が欲しくなった。また、Alice配列からのインスピレーションとしては、バットマンをイメージした。R33GT-Rのミッドナイトパープルを彷彿とさせる最高にクールな色である。

・Kernel - Golden
R33GT-Rのミッドナイトパープルに合わせるホイールは金色のBBS LMが最高のケミストリーを生み出す。迷わず金色を選択。

・Weight - Copper Weight
こちらはCheck out時には金色を選択していたが、その後の調査でCopper Weightの方が重いということが判明。キーボードにおいて重さは正義ということで、Swagkeysのカスタマーサポートにソッコーで連絡&追い銭してCopper Weightに交換。

・Badge - PVD Silver
金色のBBS LMのリム部分は銀色ということもあり、Silverを選択。しかし、実際にやってきたのはPVD Goldenである。金色のKernelに加えて金色のBadgeという成金仕様のキーボードとなってしまった。Swagkeysのカスタマーサポートに写真とオーダー時のデータを送付してBBS LM仕様へ変更を依頼中。
→翌日にはカスタマーサポートから返信があり、PVD Silverを追加発送してくれた。ありがたやー。あなたの落としたのは金のBadge?それとも銀のBadge?

・PCB - Wired Non-flex cut Hotswap PCB
日本では技適の件もありWired一択ではあるが、事前にNeo65のWireless PCBはうまく動作しない状況があるという投稿をちょこちょこ見た。WiredのFirmwareのソースコードが有志によって公開されていたのでソフトウェア的な魔改造の可能性に望みを託してWiredを選択。

・Plate - Aluminum
音にこだわるならばアルミ一択という洗脳教育によりアルミを選択。Neo ErgoのPCBのマウント形式が独特なのか、Non-flex cutのPCBであるものの打鍵音に関しては猫山王の期待値に達していない感がある。そもそもエントリーレベルのキーボードなのでそれほど不満はないが、ガスケットマウントであればもう少し改善できるのだろうか。キースイッチはWS Morandiを初めて使用しているが、こいつが原因なのかアリさんマークのAliexpressで購入したキーキャップが原因なのか、はたまたマウント形式の影響なのかは未解決のままである。YouTubeでは良い感じの音に聞こえる個体もあり、最高のコラボレーションを見つけるために絶賛修行中。
→WS Morandiはどないもならんので、Cherry MX Black HGとHMX Macchiatoを試した。いずれも期待通りのエエ打鍵音を奏でるのを確認できたので、現時点ではCherry MX Black HGに落ち着いている。WS Morandiに合うキーボードをご存知の修行僧は是非そのキーボードを教えて欲しい。

・Wrist Rest - None
リストレストはカスタムキーボード修行の妨げになるアイテムであるという勝手な思い込みからくるリストレスト使用しない派であったため購入せず。ただNeo Ergoを使い始めてまだ2日目であるものの、すでに空中タイピングの修行の苦痛に耐えかねる状況に陥りつつある。買わずに後悔した典型例である。

Neo ErgoでVialの楽しみ方

猫山王はVial教団の熱狂的な信者であり、Vial友の会の会員としてVialの普及に尽力していることはご存じのことであろう。今回は、Vial職人として猫山王が文鎮化覚悟で実際に行ったNeo ErgoのVial修行を綴ってみる。猫山王が過去に実施したClaw44Planck v7のVial化の導きの書も参考にされたし。
ちなみにVial職人猫山王が今回手掛けたのはWired Non-flex cut Hotswap PCBで、PCはWindowのノートPCというヘッポコ環境である。Vial化のためには最終段階でFirmwareを書き込むという緊張度の高い修行が控えている。Firmwareの書き込みは文鎮化するリスクが非常に高い難易度最高潮の修行であり、環境の違いや失敗・挫折により修行僧の大切なNeo Ergoちゃんが文鎮化したとしても一切の補償・対応は致しかねる。そのため、カスタマイズおよびその使用は自己責任ということをご理解の上でこれ以降の修行をお願いしたい。

ちなみにVial職人猫山王のVial化したNeo ErgoのFirmwareの仕様は以下の通りである。

・レイヤー数 16
猫山王は重度のレイヤー中毒患者であるので、Defaultのレイヤー数の4→16へ爆増させた。Neo Ergoはキー数が多いのでレイヤー数の限界値は調べていない。

・LED
Neo Ergoには左下のちっこい3つのLEDも含めて全部で16個のLEDが搭載されている。Wired PCBでは一番上のRowのKC_ESCからKC_4までの5個のLEDの機能を封じられているので、Defaltではこれらを輝かすことが出来ない。猫山王はこれらLEDにも命を吹き込み、16個全てのLEDが元気よく輝く仕様とした。LEDの色もレイヤーに合わせて変わるギンギラギン仕様とした。

・RGB Matrix
DefaultはRGB Lightであるが、せっかくなのでRGB Matrixが利用できるようにした。これで光の魔術師としての地位も安泰である。

・Vialでの設定項目
タップダンサーやコンボ柔術の使い手への対応は当然のこと、QMK Settingsでありとあらゆる設定変更を可能とする食べ盛りの修行僧にもしっかりと対応した機能盛り盛り満腹丸仕様とした。

・VialのGUI上でのレイアウト
スプリットバックスペース/2uバックスペース、カーソルキー仕様、スペースバーの仕様は、1.5u+2.25u、1u+2.75uのいずれのレイアウトも選択可能で、修行僧のNeo Ergoのレイアウトとの完全一致を目指した見た目重視のハッタリ仕様とした。

1.Vial化のための環境構築をしよう
Vial化のためには、QMKビルド環境を構築する必要がある。QMKビルド環境の構築方法については、Google先生に「QMKビルド環境の構築」、「QMK Firnware環境構築」等とお問い合わせいただければ、先人達の導きの書をご案内いただける。各種導きの書を見比べていただいて、お好みの導きの書に従って何はともあれQMKビルド環境の構築を済ませる必要がある。

2.Vialのリポジトリをクローンしよう
Vial化したFirmwareのコンパイルには、vial-qmkのリポジトリ(ざっくりいうとフォルダ)をクローン(ざっくりいうとコピー)する必要がある。Vialのリポジトリをクローンする手順は、「Claw44であそぼ。⑧(Vial編)」の(2.Vialのリポジトリをクローンしよう)を参考にされたし。

3.Wired PCBのソースデータのファイルのお引越し
FirmwareのVial化にはVIAに対応したQMK Firmwareのソースコードが必要である。Neo ErgoのWired PCBのQMK Firmwareのソースコードは以下のリンク先にて公開されている。

Keymaps>viaフォルダ内のファイルも含めてすべてダウンロードして、「2.Vialのリポジトリをクローンしよう」で作成したvial-qmk>keyboardsフォルダ以下に、ergo>neoフォルダを作成して格納すると良い。ちなみに猫山王のvial-qmk>keyboards>ergo>neoフォルダ以下の構成は以下となっている。また、ピンクのチェックマークは新規作成が必要なファイルである。ここで注意が必要なのは、keymapsフォルダ内にvialフォルダを必ず作成する必要があり、少なくともkeymap.cファイルとvial.jsonファイルはvialフォルダ内に格納しておく必要がある。

4.vial.jsonファイルを作成しよう(vialフォルダ内)
vial.jsonファイルはVial用にキーレイアウトを定義しているファイルで、info.jsonファイルとは似て非なるものである。そのため、info.jsonファイルのファイル名を変えるだけでは似て非なるゴミファイルが生み出されてしまい、ノーコンパイルのアリ地獄にはまってしまう。詳細な作成方法については、「Claw44であそぼ。⑧(Vial編)」の手順の(4.vial.jsonファイルを作成しよう)を参考にしてもらえれば良い。Neo Ergoをお使いの同氏の修行僧は、Vial職人猫山王が作成したvial.jsonファイルを添付しておくのでご活用ください。

5.config.hファイルを作成しよう(vialフォルダ内)
Vial用のFirmwareを作成するためには、config.hファイルに①キーボード固有のIDの追加、②キーボードをアンロックするためのキーコンビネーションの呪文を追加する必要がある。①キーボード固有のIDの追加については、QMK MSYSを起動して以下のコマンドを入力・エンターしてQMK MSYS上でvial-qmkフォルダに移動する。

cd vial-qmk

ほんでもって、間髪入れずに以下のコマンドを入力・エンターすると
#define以下修行僧のキーボードIDが表示されるので、そのままconfig.hファイル内にコピペすれば良い。ここで、XXは任意の英数字としている。

python3 util/vial_generate_keyboard_uid.py

#define VIAL_KEYBOARD_UID {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX}

②キーボードをアンロックするためのキーコンビネーションとして、2つのキーのコンビネーションの呪文を追加する必要がある。

#define VIAL_UNLOCK_COMBO_ROWS {X, X}
#define VIAL_UNLOCK_COMBO_COLS {X, X}

それぞれ、キーマトリクスの {X, X}で表され(Xは設定のためのキーマトリックスの数字)、猫山王は左上の2つのキーコンビネーションとして定義している。Vialの公式サイトによるとセキュリティ上設定が必要な機能なのだが、猫山王はVialでのMatrix Tester(キー入力のテスト)でしか使ったことがなく、他のシチュエーションでは一切使ったことがないため使い方もよく分かっていない。使い道についてご存じの修行僧は是非教えて下さい。

また、RGB Matrixの設定でレイヤーに連動する機能の呪文と、後述するinfo.jsonには記載しきれないRGB Matrixの機能の呪文を追加しておく必要がある。

#define RGBLIGHT_LAYERS // レイヤーとの連動機能の有効化
#define RGBLIGHT_MAX_LAYERS 16 // 連動するレイヤー数(最大32)
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES
#define RGB_DISABLE_WHEN_USB_SUSPENDED

上記をまとめるとVial化のために、config.hに以下の呪文を記載することになる。

#pragma once

/* define VIAL用 XXは任意の英数字としている*/
#define VIAL_KEYBOARD_UID {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX}
#define VIAL_UNLOCK_COMBO_ROWS {0, 0}
#define VIAL_UNLOCK_COMBO_COLS {0, 1}

/* WS2812 Underglow Matrix options */
#ifdef RGB_MATRIX_ENABLE
#define RGBLIGHT_LAYERS
#define RGBLIGHT_MAX_LAYERS 16
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES
#define RGB_DISABLE_WHEN_USB_SUSPENDED
#endif

6.rules.mkファイルの内容を書き換えよう(vialフォルダ内)
とりあえず、RGB Matrix光の祭典全開仕様と機能盛り盛り満腹丸仕様を目指すならば、rules.mkファイル内の記載をゴッソリと以下に書き換えると良い。

LTO_ENABLE = yes
VIA_ENABLE = yes
VIAL_ENABLE = yes
VIALRGB_ENABLE = yes

QMK_SETTINGS = yes
MAGIC_ENABLE = yes
GRAVE_ESC_ENABLE = yes
TAP_DANCE_ENABLE = yes
AUTO_SHIFT_ENABLE = yes
COMBO_ENABLE = yes
KEY_OVERRIDE_ENABLE = yes

7.keymap.cファイルの内容を書き換えよう(vialフォルダ内)
16レイヤーに対応するレイヤー数の定義とキーマップを準備する必要がある。以下のブランクのキーマップの呪文を参考に各修行僧にてご自由にアレンジされたし。キーマップはマルチレイアウト仕様として、カーソルキー有りバージョン・無しバージョンに対応できるキーマップにしている。

enum planck_layers {
_00, _01, _02, _03, _04, _05, _06, _07, _08, _09, _10, _11, _12, _13, _14, _15
};

#define KC_01_ENT LT(_01,KC_ENT)
#define KC_02_BSP LT(_02,KC_BSPC)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

[_00] = LAYOUT(
    KC_NO    , TD(0)   , 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_GRV  , KC_DEL  ,
    QK_BOOT  , 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_BSPC ,
    KC_NO    ,LGUI_T(KC_TAB),KC_A, KC_S    , KC_D    , KC_F    , KC_G    , KC_H    , KC_J    , KC_K    , KC_L    , KC_SCLN , KC_QUOT ,           RGUI_T(KC_ENT),
    KC_NO    , KC_LSFT , KC_Z    , KC_X    , KC_C    , KC_V    , KC_B    , KC_NO   , KC_N    , KC_M    , KC_COMM , KC_DOT  , KC_SLSH ,           KC_RSFT , MO(_04) ,
               MO(_05) , KC_LCTL ,               LALT_T(KC_ENT),LSFT_T(KC_SPC),KC_01_ENT,KC_02_BSP,                                    KC_RALT , KC_NO   , TD(1)
),

[_01] = LAYOUT(
    KC_NO    , KC_ESC  , 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_NO   , KC_NO   ,
    KC_NO    , KC_TAB  , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_BSLS ,
    KC_NO    , KC_LGUI , KC_NO   ,LSFT(KC_EQL),KC_MINS,KC_EQL  , KC_LPRN , KC_RPRN , KC_LEFT , KC_UP   , KC_DOWN , KC_RGHT , KC_NO   ,           KC_ENT  ,
    KC_NO    , KC_LSFT , KC_NO   ,LSFT(KC_8), KC_SLSH, KC_NO   , KC_LBRC , KC_NO   , KC_RBRC , KC_HOME , KC_PGUP , KC_PGDN , KC_END  ,           KC_RSFT , KC_NO   ,
               KC_LCTL , KC_LCTL ,                KC_LALT ,LSFT_T(KC_SPC), KC_ENT  , KC_BSPC ,                                         KC_RALT , KC_NO   , KC_RCTL
),

[_02] = LAYOUT(
    KC_NO    , TD(0)   , KC_EXLM , KC_AT  , KC_HASH , KC_DLR  , KC_PERC , KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , KC_MINS , KC_EQL  , KC_GRV  , KC_DEL  ,
    KC_NO    , KC_TAB  , KC_1    , KC_2    , KC_3    , KC_4    , KC_5    , KC_6    , KC_7    , KC_8    , KC_9    , KC_0    , KC_LBRC , KC_RBRC , KC_BSPC ,
    KC_NO    , KC_LGUI , KC_NO   ,LSFT(KC_EQL),KC_MINS,KC_EQL  , KC_LPRN , KC_RPRN , KC_LEFT , KC_UP   , KC_DOWN , KC_RGHT , KC_NO   ,           KC_ENT  ,
    KC_NO    , KC_LSFT , KC_NO   ,LSFT(KC_8), KC_SLSH, KC_NO   , KC_LBRC , KC_NO   , KC_RBRC , KC_HOME , KC_PGUP , KC_PGDN , KC_END  ,           KC_RSFT , KC_NO   ,
               KC_LCTL , KC_LCTL ,                KC_LALT ,LSFT_T(KC_SPC), KC_ENT  , KC_BSPC ,                                         KC_RALT , KC_NO   , KC_RCTL
),

[_03] = LAYOUT(
    KC_NO    , KC_NO   , 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_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_LSFT , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_MUTE , KC_VOLD , KC_VOLU , KC_NO   ,           KC_RSFT , KC_NO   ,
               KC_LCTL , KC_LCTL ,                KC_LALT ,LSFT_T(KC_SPC), KC_ENT  , KC_BSPC ,                                         KC_RALT , KC_NO   , KC_RCTL
),

[_04] = LAYOUT(
    KC_NO    , KC_NO   , 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_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , RGB_VAI , RGB_M_X , RGB_M_G , RGB_M_T , RGB_HUI , RGB_MOD , RGB_TOG , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , RGB_VAD , RGB_M_SW, RGB_M_SN, RGB_M_K , RGB_HUD , RGB_RMOD,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , RGB_M_P , RGB_M_B , RGB_M_R , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_05] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_DEL   ,
    KC_NO    , QK_BOOT , KC_NO   ,LCTL(KC_W), KC_NO  , KC_NO   ,LCTL(KC_T), KC_NO  , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   ,LCTL(KC_A),LCTL(KC_S), KC_NO ,LCTL(KC_F), KC_NO  , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   ,LCTL(KC_Z),LCTL(KC_X),LCTL(KC_C),LCTL(KC_V),KC_NO, KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                LCTL(KC_LALT), KC_NO   , KC_NO   , KC_NO   ,                                    LCTL(KC_RALT), KC_NO   , KC_NO
),

[_06] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_07] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_08] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_09] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_10] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_11] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_12] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_13] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_14] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

[_15] = LAYOUT(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO   , KC_NO
),

};

また、レイヤーごとに色を変える呪文の記載例を以下に記載しておく。レイヤー_00では修行僧がRGB Matrixを自由自在に楽しむためにもレイヤー固有の色を設定の記述の先頭に"//"を記載して無効化している。なお、Vial職人猫山王は、RGB_MATRIX_SOLID_REACTIVEを好んで使っており、こちらは各レイヤーで色を固定しつつキーを押したときに押したキーのLEDの色が変わる1粒で2度美味しい設定である。

#ifdef RGB_MATRIX_ENABLE
layer_state_t layer_state_set_user(layer_state_t state){
uint8_t layer = biton32(state);
switch (layer){
// case _00:
// rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR);
// rgb_matrix_sethsv_noeeprom(HSV_RED);
// break;
case _01:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_BLUE);
break;
case _02:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_GREEN);
break;
case _03:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_ORANGE);
break;
case _04:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_MAGENTA);
break;
case _05:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_AZURE);
break;
case _06:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_SPRINGGREEN);
break;
case _07:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_GOLD);
break;
case _08:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_CHARTREUSE);
break;
case _09:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_CYAN);
break;
case _10:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_CORAL);
break;
case _11:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_GOLDENROD);
break;
case _12:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_PINK);
break;
case _13:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_PURPLE);
break;
case _14:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_SPRINGGREEN);
break;
case _15:
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_REACTIVE);
rgb_matrix_sethsv_noeeprom(HSV_TEAL);
break;
default:
rgb_matrix_reload_from_eeprom();
}
return state;
}
#endif

8.info.jsonファイルの内容を書き換えよう(ergoフォルダ内)
こちらは書き換え内容が多岐にわたるので、ポイントを絞って解説するが、Neo Ergoをお使いの同氏の修行僧は、Vial職人猫山王が作成したvial.jsonファイルを添付しておくので、公開されているソースコードのinfo.jsonと見比べながら各自自己学習をしていただきたい。

・光の魔術師&機能盛り盛り満腹丸仕様とするために、”features"の記載項目の見直し

"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgb_matrix": true,
"space_cadet": true },

完成したFirmwareをQMK Tool Boxで書き込むためにも、"bootmagic": trueは必須項目である。

・LEDをコントロールするための頭脳であるWS2812の記載には、pin情報だけでなくdriver情報の記載が必要

"ws2812": {
"driver": "bitbang",
"pin": "B3"
},

・光の魔術師仕様とするためにも"rgblight"の記載をすべて削除して、"rgb_matrix"の記載へ変更。記載項目がたっぷりあるのは、光の祭典の全てのプログラムを召喚可能とするためである。全て召喚可能としても要領的には問題なさそうである。"timeout": 180000は、何もしなければ180秒後に光の祭典が終了する設定であるので、各修行僧のお好みの設定時間を記載すると良い。

・"layouts": { "LAYOUT": {については、マルチレイアウト仕様として矢印キー有りバージョン・無しバージョンに対応できるキー配列にしている。

8.config.hファイルの内容を書き換えよう(ergoフォルダ内)
今回はRGB Matrix仕様を目指しているので、不要なRGB Lightの記載全て削除して、config.hファイルの記載はまるっと以下の記述に書き換える必要がある。上から重度のレイヤー中毒患者対応のための16レイヤー化の呪文、キーマトリックスのRow数とCol数の定義、Musicモードの無効化。

#pragma once

/* 16 Layer化 */
#define DYNAMIC_KEYMAP_LAYER_COUNT 16
#define LAYER_STATE_16BIT

#define MATRIX_ROWS 5
#define MATRIX_COLS 15

/* disable action features *
#define NO_MUSIC_MODE

9.さあ、コンパイルしよう
ここまでくれば最後はQMK MSYSでのコンパイル。呪文のコンパイルの成功は、新興宗教Vial教団の夢のキーマップ変更ツールの通行手形の入手を意味します。Vial教団のコンパイルのお作法コマンドを記載しておく。ここで、[keyboard_name]はVialのソースコードが格納されている任意のフォルダー名で、Neo Ergoであれば以下が考えられる。

cd vial-qmk
make neo/ergo:vial

無事にコンパイルが完了すれば、QMK Tool Boxを利用してFirmwareをキーボードに書き込むことになる。QwertykeysのBuildguideを参照すると、Zadigという聞きなれないツールのインストールの手引きがある。とりあえずいつも通りFirmwareをQMK Tool Boxで書き込んでみたら問題なく書き込めたので、使い慣れたQMK Tool Boxを利用すると良いであろう。ここでの注意点としては、事前にVIAやRemapなどのキーマップ変更ツールでResetボタンをどこかにアサインしておく必要がある。また、QMK Tool BoxのMCUは"ATmega32U4"を選択して、Auto-Flashにチェックマークを入れて、予めアサインしたResetを押すとFirmwareの書き込みがスタートすることになる。自作キーボードでよくある背面のリセットボタンがないので、こういった手順にならざる負えないと思う。そのためにもinfo.jsonの"features"で"bootmagic": trueを記載しておく必要があるといえる。もっと画期的な方法をご存じの修行僧の方は是非その方法をご教示願います。

Vial化したFirmwareを書き込んでPCに初めて接続して、新しいUSBデバイスとして準備完了的なポップアップ画面が出てくれば、Neo Ergoの夢のVial化の完了である。webまたはアプリ版に接続すると新興宗教Vial教団の漆黒のGUIがお出迎えしてくれる。

実際にVial化してみて

猫山王はVial教団の熱狂的信者で、Vial友の会の会員を公言しているだけあって、Vial化したキーボードの使用感は当然に最高である。Vialを一度でも利用してしまうと、他のキーマップのツールには戻れないといっても過言ではない。そのくらい最高なのである。そのため、Neo Ergoを最速でVial化するというチャレンジはVial職人として当然の至上命題であったといえる。Vial化の失敗は大切なNeo Ergoちゃんの文鎮化を意味し、一か八かのチャレンジでもあった。
そもそも、VIA対応とwebサイトでうたっているものの猫山王のVIAの経験値は著しく乏しい状態であり、へっぽこ修行僧の猫山王はVIA上でAnyキーの設定がどうしても上手くいかず何ともならない状況に陥っていた。Remapに切り替えるとサクサクっとイケたので、おっ流石Remap!これでええやんと思っていた矢先、前人未踏のNeo ErgoのVial化の達成こそが、不便さを克服することにより得られる快楽であるというVial教祖様の神のお告げがあり、Vial職人としてNeo Ergoの世界最速のVial化に取り組んだ次第である。Vial化と合わせていつものレイヤー数爆増仕様と光の魔術師仕様と機能盛り盛り満腹丸仕様となったので、Neo Ergoちゃんは一気にエンドゲームを迎えてしまった。Neo Ergoちゃんを迎え入れた日のうちにVial化して一気にエンドゲームという、入手日にいきなり文鎮化による違った意味でのThe Endよりは断然良い。ちなみに、猫山王の設定ではFirmwareのサイズは56KB程度なので、Neo Ergo搭載のマイクロコントローラの容量はPro Microのような僅少サイズでは無いであろう。
Neo ErgoちゃんのVial化は文鎮化のリスクを伴う危険な修行であるということをご理解いただいたうえで、Vial友の会の会員を夢見る修行僧にとって一助となれば幸いです。
自作キーボードは敷居が高いと思われている方にとって、一日で一番手に触れているものはキーボードということで、不便さを克服することにより得られる快楽の世界への入門のための勇気づけとなれば幸いです。
海外のDiscordでNeo ErgoのVial化をレポートしたら思いのほか大反響であった。やはり人類史上初のNeo ErgoのVial化となったのであろうか。Vial職人冥利に尽きるというのはこのことか。加えて、Vial教団の魔の手によって世界中で猫も杓子もVial教にトランス状態なのであろう。そもそもVial教は海外から宣教師とともに日本にやって来たのであるが。。海外の友の会の会員とのコミュニケーションは非常に新鮮でアップロードのリクエストもあったので、猫山王のsource codeを下記に貼り付けておく。このsource codeが世界中に拡散して、Vial友の会の会員がネズミ算式に爆増するのを願うばかりである。

Source code

Please note that using attached source code is requiring to take full responsibility for your own action. Establishing QMK Build Environment beforehand is also required to compile this source code. Unsuccessful flash results in a bricked PCB and your fantastic keyboard life with Neo Ergo ends up at this moment.

Refer to my github for source code of Vial port

VERY IMPORTANANT
My environment is as followed;
- Wired Non-flex cut Hotswap PCB
- Windows
- QMK Tool Box to flash firmware

I am not responsible for any loss, any damage, any disadvantage or bricked PCB caused by using the information and source code on my page. Please consider the risks and "TAKE FULL RESPONSIBILITY FOR YOUR OWN ACTION".

Memorial Screenshot

Searching results of Neo Ergo show this page is ahead of Qwertykeys.

on 17 August, 2024

この記事が気に入ったらサポートをしてみませんか?