見出し画像

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での販売期間が事前にアナウンスされていなかったように思うので、買いそびれた修行僧もひょっとすると多数いるのかもしれない。QwertykeysのHPでNeo Ergoはリージョンブロックがなされていて、日本からの購入だとCheck outが出来ない非常に残念仕様である。猫山王は迷わず発売日に購入してたので幸運にも手に入れることができたが、カスタムキーボード界の掟である「買わずに後悔するなら、買って後悔せよ。迷ったら買え。」を肝に銘じて、引き続きカスタムキーボードの購入修行に励んでいく所存である。

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

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

・Kernel - Golden
R33GTRのミッドナイトパープルに合わせるホイールは金色の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仕様へ変更を依頼中。

・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を初めて使用しているが、こいつが原因なのかマウント形式の影響なのかは未解決のままである。キースイッチやプレートにもよると思うが、YouTubeでは良い感じの音に聞こえる個体もあるので、今後のキースイッチ変更による効果に期待。

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

Neo ErgoでVialの楽しみ方

猫山王はVial教団の熱狂的な信者であり、Vial友の会の会員としてVialの普及に尽力していることはご存じのことであろう。今回は、Vial職人としての猫山王が実際に行ったNeo ErgoのVial化を例に、Neo ErgoのVial化を夢見る修行僧の導きの書となれれば幸いです。猫山王が過去に実施したClaw44Planck v7のVial化の導きの書も参考にされたし。
ちなみに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のいずれのレイアウトも選択可能で、見た目重視のハッタリ仕様とした。

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レイヤーに対応するレイヤー数の定義とキーマップを準備する必要がある。以下のブランクのキーマップの呪文を参考に各修行僧にてご自由にアレンジされたし。[_00] = LAYOUT_alice( の"LAYOUT_alice"の記載については、後述するinfo.jsonのLAYOUTの名称と整合させる必要がある。

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

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

[_00] = LAYOUT_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO
),

[_01] = LAYOUT_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO
),

[_02] = LAYOUT_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO
),

[_03] = LAYOUT_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO
),

[_04] = LAYOUT_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   , KC_NO   ,
               KC_NO   , KC_NO   ,                     KC_NO   , KC_NO   , KC_NO   , KC_NO   ,                                         KC_NO   , KC_NO
),

[_06] = LAYOUT_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice(
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   ,           KC_NO   ,
    KC_NO    , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , KC_NO   , 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_alice": については、前述のkeymap.cの"LAYOUT_alice"という名称と整合させる必要がある。矢印キー仕様("LAYOUT_arrow_keys")にしたければ、keymap.cの記載も"[_00] = LAYOUT_arrow_keys("と変更して、キー数もひとつ増やす必要がある。Vial職人猫山王はシンメトリー性を重視して、矢印キー仕様("LAYOUT_arrow_keys")のkeymap.cはあえて準備していないが、info.jsonファイル内では来るべき日に備えて敢えて矢印キー仕様("LAYOUT_arrow_keys")の記載を残している。

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_ACTION_ONESHOT
#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対応とHPでうたっているものの猫山王の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友の会の会員を夢見る修行僧にとって一助となれば幸いです。
自作キーボードは敷居が高いと思われている方にとって、一日で一番手に触れているものはキーボードということで、不便さを克服することにより得られる快楽の世界への入門のための勇気づけとなれば幸いです。

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.

Source code

v2: updating files of keyboard.json, vial.json and keymap.c for multi-keyboard layout.

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

I am not responsible for any loss, any damage, 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".

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