見出し画像

Equals 48であそぼ。②(光の魔術師編)

はじめに

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

光の魔術師とは

光の魔術師とは七色発光体を自由自在に操ることができる僧侶の敬称で、自作キーボードの初心者の猫山王にとって憧れの存在である。猫山王がEquals 48を購入した理由のひとつは「③ Per Key RGBとUnderglowの両方の搭載」で、これこそが光の魔術師になるための必要条件である。光の魔術師たるもの自身のキーボードを上からも下からもギンギラギンに光らせて、RGB Matrixを駆使して七色発光体を自由自在に操ることができてこそ光の魔術師の絶対王になるための十分条件を満たすことができたといえよう。猫山王もこの必要十分条件を満たすべく、修羅の国での日々過酷な修行を行っている。

RGB Matrixのセットアップ

猫山王はVial教団の熱狂的な信者であり、Vial友の会の会員としてVialの普及に尽力していることはご存知のことであろう。猫山王の過去の奮闘記でもVialのRGB  Matrixについて何度か取り上げている(Claw44Neo Ergo)。残念なことにRGB Matixの奮闘記は猫山王の記事の中でも圧倒的に人気がない。要因としては、七色発光体を搭載した自作キーボードが少ないということが考えられるが、今回は光の魔術師編ということもあり復習も兼ねてステップ・バイ・ステップで奮闘記として綴っていく。今回の奮闘記を参考に修羅の国で修行すれば、光の魔術師の絶対王になれるかもしれない。猫山王はVial職人であるため、Vialを前提とした光の魔術師の絶対王への道しるべである点はご容赦いただきたい。

1.info.jsonファイルの内容を書き換えよう
キーボードをRGB Matrixとして七色発光体を操るためには、キーボードフォルダ下のinfo.jsonファイル内に呪文を色々追加する必要がある。各呪文のAI翻訳も記載しておくので、各自の修行にご活用願いたい。

・"features"に"rgb_matrix": trueの追加とその作例。この呪文でRGB Matrixを召喚する。

"features": {
・・・
"rgb_matrix": true,
・・・
},

・ LED ドライバーのWS2812のドライバーとpin番号の追加とその作例。この呪文は、MCUに搭載されている七色発光体のドライバーを指定し、MCUから信号を送り出すpin番号を指定する。Pro Micro RP2040であればWS2812のドライバーは"vendor"であるが、それ以外にもbitbang(default), i2c, pwm, vender, customがあり、この辺りはMCUによって仕様が異なる。また、信号発信のpin番号は回路図に依存することになりPCBごとに異なる。以下は、Eqauls 48の例であるが猫山王の他のキーボードのinfo.jsonファイルをご覧いただければ、千差万別であることがお分かりいただけるであろう。WS2812のドライバーについて何を選択するかは公式ページを参照すればヒントを見つけられる。そのヒントを手掛かりにお先真っ暗暗黒の修羅の国での修業が待っている。

"ws2812": {
    "driver": "vendor",
    "pin": "GP5"
  },


・RGB Matrixのアニメーション、LEDドライバー、LED Matrixのレイアウト等の情報の追加とその作例。
"animations"については、大容量のRP2040を前提としているので取り合えず光の魔術師の絶対王を目指す修行僧であれば全部盛り以外の選択肢はない。
"driver"については、"ws2812"で良い。
LED Matrixのレイアウト辺りから修羅の国での修業がようやく始まる。修行僧の意図した通りに七色発光体を発光させるには、順位付けのナンバリングが重要であり、この順位付けこそがなかなか骨の折れる修行である。
まず、猫山王のEquals 48の基本形は以下である。

{ "flags": 1, "x": 0, "y": 0 },  <- Aとする

or

{ "flags": 1, "matrix": [0, 0], "x": 0, "y": 0 }, <- Bとする

パターンAの呪文が10個、パターンBの呪文が48個ある。Aはアンダーグローの七色発光体に対応し、Bはバックライトの七色発光体に対応している。また、パターンAの最初の呪文からパターンBの最後の呪文まで上から順番に0~57の番号が割り当てられ、七色発光体へ信号を送る順番となる。つまり、PCBの物理的回路と異なる順序で七色発光体を光らす際に呪文の順番を入れ替えることで対応できる。
"flags"の値は1~9まで設定できるということは猫山王の血の滲む修行により確かめたが、公式ページによると以下のルールがある。

"flags": 1・・・修飾キーに利用(RGB MatrixのAlphas Modsで活躍?)
"flags": 2・・・アンダーグローに利用
"flags": 4・・・バックライトに利用
"flags": 8・・・インジケーターに利用(Caps LockやNum Lockで活躍?)

猫山王Equals 48の最初の10個のパターンAをアンダーグローとしているので"flags": 2とし、残りの48個のパターンBをネズミ大国の電装行進プログラムに利用しているので、"flags": 4または"flags": 1としている。"flags": 1はネズミ大国の電装行進プログラムのAlphas Modsを利用する際に、他のキーの色と異なる色としたいキーに配置している。

Alphas Modsで"flags": 1に設定したLEDが"flags": 4と異なる色になる

[0, 0]~[3, 11]は、info.jsonファイル内のキーのレイアウトの記述の  "layouts": に対応するキーとの紐づけで、例えば[0, 1]のキーを押したときに反応する七色発光体の番号が12(上から数えると12番目になるので)という定義づけである。"x": 20, "y": 0は、[0, 1]の七色発光体の座標(x軸, y軸)を意味し、キーボードの左上が"x": 0, "y": 0、右下が"x": 224, "y": 64となる。一般的なキーボードでは等間隔で分割した座標をプロットすれば良いが、Alice配列や変態配列ともなると、電装行進プログラムを美しく光らせるために別途修業が必要になるのは容易に想像できよう。座標(x軸, y軸)の算定方法については公式ページの"Common Configuration"を参照されたし。
"timeout": は、何もしなければ七色発光体を自動消灯する時間の設定であり、各修行僧のお好みで設定すれば良い。

なお、分割キーボードの設定については「Claw44であそぼ。⑩(Vial/RGB Matrix編)」を、その他きめ細やかな設定については公式ページを参照されたし。

"rgb_matrix": {
 "animations": {
  "alphas_mods": true,
  "gradient_up_down": true,
  "gradient_left_right": true,
  "breathing": true,
  "band_sat": true,
  "band_val": true,
  "band_pinwheel_sat": true,
  "band_pinwheel_val": true,
  "band_spiral_sat": true,
  "band_spiral_val": true,
  "cycle_all": true,
  "cycle_left_right": true,
  "cycle_up_down": true,
  "rainbow_moving_chevron": true,
  "cycle_out_in": true,
  "cycle_out_in_dual": true,
  "cycle_pinwheel": true,
  "cycle_spiral": true,
  "dual_beacon": true,
  "rainbow_beacon": true,
  "rainbow_pinwheels": true,
  "raindrops": true,
  "jellybean_raindrops": true,
  "hue_breathing": true,
  "hue_pendulum": true,
  "hue_wave": true,
  "pixel_fractal": true,
  "pixel_flow": true,
  "pixel_rain": true,
  "typing_heatmap": true,
  "digital_rain": true,
  "solid_reactive_simple": true,
  "solid_reactive": true,
  "solid_reactive_wide": true,
  "solid_reactive_multiwide": true,
  "solid_reactive_cross": true,
  "solid_reactive_multicross": true,
  "solid_reactive_nexus": true,
  "solid_reactive_multinexus": true,
  "splash": true,
  "multisplash": true,
  "solid_splash": true,
  "solid_multisplash": true
},
 "driver": "ws2812",
 "layout": [
  { "flags": 2, "x": 220, "y": 17 },
  { "flags": 2, "x": 172, "y": 17 },
  { "flags": 2, "x": 112, "y": 17 },
  { "flags": 2, "x": 50, "y": 17 },
  { "flags": 2, "x": 4, "y": 17 },
  { "flags": 2, "x": 4, "y": 56 },
  { "flags": 2, "x": 50, "y": 56 },
  { "flags": 2, "x": 112, "y": 56 },
  { "flags": 2, "x": 172, "y": 56 },
  { "flags": 2, "x": 220, "y": 56 },

        { "flags": 1, "matrix": [0, 0], "x": 0, "y": 0 },
        { "flags": 4, "matrix": [0, 1], "x": 20, "y": 0 },
        { "flags": 4, "matrix": [0, 2], "x": 40, "y": 0 },
        { "flags": 4, "matrix": [0, 3], "x": 61, "y": 0 },
        { "flags": 4, "matrix": [0, 4], "x": 81, "y": 0 },
        { "flags": 4, "matrix": [0, 5], "x": 101, "y": 0 },
        { "flags": 4, "matrix": [0, 6], "x": 122, "y": 0 },
        { "flags": 4, "matrix": [0, 7], "x": 142, "y": 0 },
        { "flags": 4, "matrix": [0, 8], "x": 162, "y": 0 },
        { "flags": 4, "matrix": [0, 9], "x": 183, "y": 0 },
        { "flags": 4, "matrix": [0, 10], "x": 203, "y": 0 },
        { "flags": 1, "matrix": [0, 11], "x": 224, "y": 0 },

        { "flags": 1, "matrix": [1, 0], "x": 0, "y": 21 },
        { "flags": 4, "matrix": [1, 1], "x": 20, "y": 21 },
        { "flags": 1, "matrix": [1, 2], "x": 40, "y": 21 },
        { "flags": 1, "matrix": [1, 3], "x": 61, "y": 21 },
        { "flags": 1, "matrix": [1, 4], "x": 81, "y": 21 },
        { "flags": 4, "matrix": [1, 5], "x": 101, "y": 21 },
        { "flags": 4, "matrix": [1, 6], "x": 122, "y": 21 },
        { "flags": 1, "matrix": [1, 7], "x": 142, "y": 21 },
        { "flags": 1, "matrix": [1, 8], "x": 162, "y": 21 },
        { "flags": 1, "matrix": [1, 9], "x": 183, "y": 21 },
        { "flags": 4, "matrix": [1, 10], "x": 203, "y": 21 },
        { "flags": 1, "matrix": [1, 11], "x": 224, "y": 21 },

        { "flags": 1, "matrix": [2, 0], "x": 0, "y": 42 },
        { "flags": 4, "matrix": [2, 1], "x": 20, "y": 42 },
        { "flags": 4, "matrix": [2, 2], "x": 40, "y": 42 },
        { "flags": 4, "matrix": [2, 3], "x": 61, "y": 42 },
        { "flags": 4, "matrix": [2, 4], "x": 81, "y": 42 },
        { "flags": 4, "matrix": [2, 5], "x": 101, "y": 42 },
        { "flags": 4, "matrix": [2, 6], "x": 122, "y": 42 },
        { "flags": 4, "matrix": [2, 7], "x": 142, "y": 42 },
        { "flags": 4, "matrix": [2, 8], "x": 162, "y": 42 },
        { "flags": 4, "matrix": [2, 9], "x": 183, "y": 42 },
        { "flags": 4, "matrix": [2, 10], "x": 203, "y": 42 },
        { "flags": 1, "matrix": [2, 11], "x": 224, "y": 42 },

        { "flags": 1, "matrix": [3, 0], "x": 0, "y": 64 },
        { "flags": 1, "matrix": [3, 1], "x": 20, "y": 64 },
        { "flags": 1, "matrix": [3, 2], "x": 40, "y": 64 },
        { "flags": 1, "matrix": [3, 3], "x": 61, "y": 64 },
        { "flags": 4, "matrix": [3, 4], "x": 81, "y": 64 },
        { "flags": 1, "matrix": [3, 5], "x": 101, "y": 64 },
        { "flags": 1, "matrix": [3, 6], "x": 122, "y": 64 },
        { "flags": 4, "matrix": [3, 7], "x": 142, "y": 64 },
        { "flags": 1, "matrix": [3, 8], "x": 162, "y": 64 },
        { "flags": 1, "matrix": [3, 9], "x": 183, "y": 64 },
        { "flags": 1, "matrix": [3, 10], "x": 203, "y": 64 },
        { "flags": 1, "matrix": [3, 11], "x": 224, "y": 64 }
    ],
    "timeout": 180000
},

2.config.hファイルの内容を書き換えよう
ネズミ大国の電装行進プログラムの最大限の利用(FramebufferとKeypressの有効化)と、レイヤー毎にアンダーグローの色を変えたい場合には、キーボードフォルダ下またはkeymaps/vialフォルダ下のconfig.hファイルに以下の呪文を追加する。

#ifdef RGB_MATRIX_ENABLE
#define RGBLIGHT_LAYERS                   // レイヤーとの連動機能の有効化
#define RGBLIGHT_MAX_LAYERS 30       // 連動するレイヤー数(最大32)
#define WS2812_PIO_USE_PIO1        // RP2040用に追加
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES
#endif

3.rules.mkファイルの内容を書き換えよう(Vial特有)
keymaps/vialフォルダ下のrules.mkファイルに以下の呪文の追加が必要である。

VIALRGB_ENABLE = yes

4.vial.jsonファイルの内容を書き換えよう(Vial特有)
keymaps/vialフォルダ下のvial.jsonファイルにも以下の呪文の追加が必要である。

lighting": "qmk_rgblight"

vial.jsonファイルの更新イメージを記載しておくので、各自の修行にご活用願いたい。

{
"lighting": "vialrgb",
"matrix": {"rows": 4, "cols": 12},
"layouts": {
"keymap": [
[
{
・・・

ここまでの修業を無事完遂し修了証書を授与された修行僧のみがVialでRGB Matrixの使用を許され、晴れて漆黒のVialの設定画面でネズミ大国の電装更新プログラムの変更が可能となり、RGB系のキーをマッピングすることで七色発光体を自由自在に操ることができる。

RGB Matrixのきめ細やかな設定変更ができるVialのLightingタブ

Vial特有のRGB Matrixの情報については、迷子になったら公式サイトを合言葉に、以下の公式サイトの該当ページを熟読することをお勧めする。

レイヤー毎にアンダーグローの色を変える

アンダーグローを搭載したキーボードを手に入れた修行僧で猫山王のような重度のレイヤー中毒患者であれば、自分がどこのレイヤーにいるか多重レイヤーの樹海の中で迷子にならないためにもレイヤー毎に七色発光体の色を変えたいというのが世の常である。レイヤー毎にアンダーグローの色を変える呪文は意外なほど簡単で(RGB Matrixのセットアップ修行の「2.config.hファイルの内容を書き換えよう」の呪文を記載している前提)、keymaps/vialフォルダ下のkeymap.cファイルに以下の呪文を追加する。

#ifdef RGB_MATRIX_ENABLE
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
for (uint8_t i = led_min; i < led_max; i++) {
switch(get_highest_layer(layer_state|default_layer_state)) {
case _00:
if (HAS_FLAGS(g_led_config.flags[i], 0x02)) {
rgb_matrix_set_color(i, RGB_OFF);}
break;
case _01:
if (HAS_FLAGS(g_led_config.flags[i], 0x02)) {
rgb_matrix_set_color(i, RGB_MAGENTA);}
break;
case _02:
if (HAS_FLAGS(g_led_config.flags[i], 0x02)) {
rgb_matrix_set_color(i, RGB_GOLD);}
break;
case _03:
if (HAS_FLAGS(g_led_config.flags[i], 0x02)) {
rgb_matrix_set_color(i, RGB_CYAN);}
break;

・・・

default:
break;
}
}
return false;
}
#endif

ちなみに、AI翻訳は、

info.jsonファイル内で"flags": 2とした七色発光体について、
レイヤー_00は光らない、
レイヤー_01はMagentaに光る、
レイヤー_02はGoldに光る
レイヤー_03はCyanに光る

である。"RGB_CYAN"はカラー名称の代わりにr, g ,bの数値を指定することでさらにきめ細やかに色を指定できるが、面倒くさがりの猫山王は数値の指定はしない。

とまあ、ここまでは今での修行の復習でもある。猫山王がEqauls 48を購入した理由のひとつの「③ Per Key RGBとUnderglowの両方の搭載』は、光の魔術師の絶対王となるための必要十分条件を満たすためであり、これからの修行こそが今回の奮闘記のハイライトである。

光の魔術師の絶対王としてPer Key RGBの水先案内人仕様の習得

猫山王はレイヤー数が16以下のキーボードは不安で夜も眠れなくなるほどの重度のレイヤー中毒症を患っており、レイヤー数は多ければ多いほど精神的にも安定する。そのため、猫山王のEqauls 48には30ものレイヤーを搭載することで心の安定を何とか保つことができている。また、多重レイヤーの樹海の中で朽ち果てる迷子の迷子の子猫ちゃんにならないためにも、レイヤー毎に色を変えることで一応の対策は行っている。とはいえ、レイヤー数が増えれば増えるほどそれぞれのレイヤーのキーマップの記憶力が弱まり、全てのキーマップを覚えきれないという本末転倒な状況に陥ってしまい、日常のタイピングに支障が出てくる。とはいえ重度のレイヤー中毒症を患った猫山王にとっては、レイヤー数の削減は精神崩壊を意味し、レイヤー数の削減は選択肢にない。この課題解決のために猫山王が思いついたのは、Per Key RGBの機能を最大限有効活用してレイヤー毎のキーマップに合わせて個々のキーの七色発光体の色を変えるというソリューションである。例えば、数字キーをアサインしたキーの七色発光体はyellowに光らせ、記号をアサインしたキーはBlueに、マウスキーをアサインしたキーはGreenに光らせたり、逆に何もアサインしていないキーは光らせないといういわば水先案内人のような役割を各七色発光体に与えるというものである。このPer Key RGBの水先案内人仕様こそが、猫山王ば目指していた光の魔術師の絶対王の到達点でもあった。それでは、Per Key RGBの水先案内人仕様について解説していく。

1.rgb_matrix_user.incファイルを作成しよう
keymaps/vialフォルダ下のrgb_matrix_user.incファイルを作成して、このファイル内に水先案内人仕様のPer Key RGBの設定を記載することになる。呪文の記述については猫山王の具体的な記載を参考に解説していく。
呪文を定義するために以下を記載する。"my_effect_numrow"は任意で修行僧の思いの詰まったセンスの良い名称で良い。

RGB_MATRIX_EFFECT(my_effect_numrow)     

続いて、"my_effect_numrow"の水先案内人仕様のPer Key RGBの光のパターンを定義するための呪文(”static bool my_effect_numrow(effect_params_t* params)”以下)を記載する。基本的に"i>=11 && i<=20"、"i==21"などの数値とRGB_BLUEの色を変えることで指定した七色発光体を指定した色に光らすことができる。以下のパターンを参考に解説していく。

static bool my_effect_numrow(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    RGB_MATRIX_TEST_LED_FLAGS();       
    if (i>=11 && i<=20){
        rgb_matrix_set_color(i, RGB_ORANGE);
    } else if (i==21 || (i>=32 && i<=33) || (i>=42 && i<=44)){
        rgb_matrix_set_color(i, RGB_BLUE);
    } else if ((i>=24 && i<=26) || (i>=36 && i<=37)){
        rgb_matrix_set_color(i, RGB_CHARTREUSE);
    } else if ((i>=27 && i<=28) || (i>=39 && i<=40)){
        rgb_matrix_set_color(i, RGB_CYAN);
    } else if (i>=29 && i<=31){
        rgb_matrix_set_color(i, RGB_PURPLE);
    } else if (i==22) {
        rgb_matrix_set_color(i, RGB_RED);
    } else if (i==10 || i==34 || i==45 || (i>=51 && i<=52) || i==54) {
        rgb_matrix_set_color(i, RGB_MAGENTA);
    } else if (i==53) {
        rgb_matrix_set_color(i, RGB_SPRINGGREEN);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

例えば、"(i>=11 && i<=20)"は、11番から20番のLEDを意味し、以下の場合は11番から20番のLEDがOrangeに光る。"RGB_ORANGE"はカラー名称の代わりにr, g ,bの数値を指定することでさらにきめ細やかに色を指定できるが、面倒くさがりの猫山王は数値の指定はしない。

   
    if (i>=11 && i<=20){
        rgb_matrix_set_color(i, RGB_ORANGE);
    }

例えば、"(i==21 || (i>=32 && i<=33) || (i>=42 && i<=44))"は、21番、32番から33番、42番から44番のLEDを意味し、複数のLEDの定義を記載したい場合は、"||"で繋ぐとよい。以下の場合は21番、32番から33番、42番から44番のLEDがBlueに光る。

       
      else if (i==21 || (i>=32 && i<=33) || (i>=42 && i<=44)){
        rgb_matrix_set_color(i, RGB_BLUE);
    }

最後に以下を呪文を記載することで、光の指令を受けたLED以外は光らせなくさせることができる。

    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }

なお、Equals 48のLEDの番号については以下の通りであり、これらはinfo.jsonの"rgb_matrix"の"layout"の上から割り当てられる。

2.keymap.cファイルの内容を書き換えよう
rgb_matrix_user.incファイルで定義したPer Key RGBの水先案内人仕様を特定のレイヤーに紐づけ押して、レイヤーを切り替えた際に召喚するにはkeymaps/vialフォルダ下のkeymap.cファイルに呪文を追加する必要がある。
レイヤー_03に"RGB_MATRIX_EFFECT(my_effect_numrow)"を紐づけた場合の例は以下である。

#ifdef RGB_MATRIX_ENABLE
layer_state_t layer_state_set_user(layer_state_t state){
uint8_t layer = biton32(state);
switch (layer){
case _03:
rgb_matrix_mode_noeeprom(RGB_MATRIX_CUSTOM_my_effect_numrow);
break;
default:
rgb_matrix_reload_from_eeprom();
}
return state;
}
#endif

番外.Per Key RGBの水先案内人仕様の各呪文とその作例
各修行僧の自習の助けとなるように猫山王のPer Key RGBの水先案内人仕様の各呪文とその光の祭典の写真をまとめておく。これだけ作例を載せておけば、呪文と照らし合わせることでPer Key RGBの水先案内人仕様を使いこなすことができよう。なお、携帯カメラがショボすぎて色がわかりずらい点にご容赦いただきたい。

①Num-padレイヤーのPer Key RGBの水先案内人仕様

Num-padレイヤー

RGB_MATRIX_EFFECT(my_effect_numpad)
static bool my_effect_numpad(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    RGB_MATRIX_TEST_LED_FLAGS();       
    if  ((i>=11 && i<=13) || (i>=23 && i<=25) || (i>=35 && i<=37) || i==47) {
        rgb_matrix_set_color(i, RGB_ORANGE);
    } else if ((i>=14 && i<=21) || (i>=42 && i<=43) || i==48){
        rgb_matrix_set_color(i, RGB_BLUE);
    } else if ((i>=26 && i<=27) || (i>=38 && i<=39) || i==49){
        rgb_matrix_set_color(i, RGB_CHARTREUSE);
    } else if (i>=29 && i<=32){
        rgb_matrix_set_color(i, RGB_PURPLE);
    } else if (i==46) {
        rgb_matrix_set_color(i, RGB_RED);
    } else if (i==10 || i==22 || i==34 || (i>=51 && i<=52) || i==54) {
        rgb_matrix_set_color(i, RGB_MAGENTA);
    } else if (i==50 || i==53) {
        rgb_matrix_set_color(i, RGB_SPRINGGREEN);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

②Num-rowレイヤーのPer Key RGBの水先案内人仕様

Num-rowレイヤー

RGB_MATRIX_EFFECT(my_effect_numrow)
static bool my_effect_numrow(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    RGB_MATRIX_TEST_LED_FLAGS();       
    if (i>=11 && i<=20){
        rgb_matrix_set_color(i, RGB_ORANGE);
    } else if (i==21 || (i>=32 && i<=33) || (i>=42 && i<=44)){
        rgb_matrix_set_color(i, RGB_BLUE);
    } else if ((i>=24 && i<=26) || (i>=36 && i<=37)){
        rgb_matrix_set_color(i, RGB_CHARTREUSE);
    } else if ((i>=27 && i<=28) || (i>=39 && i<=40)){
        rgb_matrix_set_color(i, RGB_CYAN);
    } else if (i>=29 && i<=31){
        rgb_matrix_set_color(i, RGB_PURPLE);
    } else if (i==22) {
        rgb_matrix_set_color(i, RGB_RED);
    } else if (i==10 || i==34 || i==45 || (i>=51 && i<=52) || i==54) {
        rgb_matrix_set_color(i, RGB_MAGENTA);
    } else if (i==53) {
        rgb_matrix_set_color(i, RGB_SPRINGGREEN);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

③FunctionレイヤーのPer Key RGBの水先案内人仕様

Functionレイヤー

RGB_MATRIX_EFFECT(my_effect_function)
static bool my_effect_function(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    RGB_MATRIX_TEST_LED_FLAGS();       
    if (i>=11 && i<=20){
        rgb_matrix_set_color(i, RGB_GREEN);
    } else if ((i>=25 && i<=26) || (i>=37 && i<=38)){
        rgb_matrix_set_color(i, RGB_TURQUOISE);
    } else if ((i>=27 && i<=28) || (i>=39 && i<=40)){
        rgb_matrix_set_color(i, RGB_CYAN);
    } else if ((i>=29 && i<=32) || (i>=41 && i<=44)){
        rgb_matrix_set_color(i, RGB_PURPLE);
    } else if (i==33 || i==45){
        rgb_matrix_set_color(i, RGB_GOLDENROD);
    } else if (i==21) {
        rgb_matrix_set_color(i, RGB_RED);
    } else if (i==10 || i==22 || i==34 || i==49 || (i>=51 && i<=52) || i==54) {
        rgb_matrix_set_color(i, RGB_MAGENTA);
    } else if (i==50 || i==53) {
        rgb_matrix_set_color(i, RGB_SPRINGGREEN);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

④SymbolレイヤーのPer Key RGBの水先案内人仕様

Symbolレイヤー

RGB_MATRIX_EFFECT(my_effect_symbol)
static bool my_effect_symbol(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    RGB_MATRIX_TEST_LED_FLAGS();       
    if ((i>=10 && i<=21) || (i>=32 && i<=33) || (i>=42 && i<=45)){
        rgb_matrix_set_color(i, RGB_BLUE);
    } else if ((i>=24 && i<=26) || (i>=36 && i<=37)){
        rgb_matrix_set_color(i, RGB_CHARTREUSE);
    } else if ((i>=27 && i<=28) || (i>=39 && i<=40)){
        rgb_matrix_set_color(i, RGB_CYAN);
    } else if (i>=29 && i<=31){
        rgb_matrix_set_color(i, RGB_PURPLE);
    } else if (i==22 || i==34 || i==49 || (i>=51 && i<=52)) {
        rgb_matrix_set_color(i, RGB_MAGENTA);
    } else if (i==50) {
        rgb_matrix_set_color(i, RGB_SPRINGGREEN);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

⑤Ctrl-keyショートカットレイヤーのPer Key RGBの水先案内人仕様

Ctrl-keyショートカットレイヤー

RGB_MATRIX_EFFECT(my_effect_ctrl)
static bool my_effect_ctrl(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    RGB_MATRIX_TEST_LED_FLAGS();       
    if (i==12 || i==15 || (i>=23 && i<=24) || i==26 || (i>=35 && i<=38)){
        rgb_matrix_set_color(i, RGB_PINK);
    } else if (i==49 || i==54) {
        rgb_matrix_set_color(i, RGB_MAGENTA);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

⑥Win-keyショートカットレイヤーのPer Key RGBの水先案内人仕様

Win-keyショートカットレイヤー

RGB_MATRIX_EFFECT(my_effect_win)
static bool my_effect_win(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    RGB_MATRIX_TEST_LED_FLAGS();       
    if (i==13 || i==25 || i==20 || i==31){
        rgb_matrix_set_color(i, RGB_PINK);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

⑦Audio-keyレイヤーのPer Key RGBの水先案内人仕様

Audio-keyレイヤー

RGB_MATRIX_EFFECT(my_effect_audio)
static bool my_effect_audio(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    RGB_MATRIX_TEST_LED_FLAGS();       
    if (i==33 || i==45 || (i>=42 && i<=43)){
        rgb_matrix_set_color(i, RGB_GOLDENROD);
    } else if (i==21 || i==41) {
        rgb_matrix_set_color(i, RGB_RED);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

⑧Mouse-keyレイヤーのPer Key RGBの水先案内人仕様

Mouse-keyレイヤー

RGB_MATRIX_EFFECT(my_effect_mouse)
static bool my_effect_mouse(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    if (i==28 || i==40) {
        rgb_matrix_set_color(i, RGB_MAGENTA);
    } else if (i==18 || (i>=29 && i<=31)){
        rgb_matrix_set_color(i, RGB_YELLOW);
    } else if (i==12 || (i>=23 && i<=25) || (i>=41 && i<=44)){
        rgb_matrix_set_color(i, RGB_GREEN);
    } else if (i>=52 && i<=53){
        rgb_matrix_set_color(i, RGB_BLUE);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

⑨カーソルキーレイヤーのPer Key RGBの水先案内人仕様

カーソルキーレイヤー

RGB_MATRIX_EFFECT(my_effect_arrow)
static bool my_effect_arrow(effect_params_t* params) {

RGB_MATRIX_USE_LIMITS(led_min, led_max);

for (uint8_t i = led_min; i < led_max; i++) {
    if (i==25 || (i>=36 && i<=38) || i==30 || (i>=41 && i<=43)) {
        rgb_matrix_set_color(i, RGB_PURPLE);
    } else {
        rgb_matrix_set_color(i, RGB_OFF);
    }
}
return rgb_matrix_check_finished_leds(led_max);

}

実際にPer Key RGBの水先案内人仕様の利用してみて

重度のレイヤー中毒症を患っている猫山王にとって、レイヤー数を減らすことなく多重レイヤーの樹海の中で朽ち果てる迷子の迷子の子猫ちゃんにならないためのソリューションとして導入を決意したPer Key RGBの水先案内人仕様であるが、実際に利用してみるとキーマップを完全に覚えていないくても七色発光体の助けを借りることで、全てのレイヤーのキーマップを脳内に鮮明に蘇らすことができるようになった。これは七色発光体の色をトリガーにニューロンを発火させることで成しえる高々次元なソリューションといえよう。これにより日常のタイピングにおいて多重レイヤーの樹海の中で朽ちてしまうかもしれないという不安が払拭され、心の安定を手に入れることができた。Per Key RGBの水先案内人仕様の修羅の国での修行を終え、光の魔術師の絶対王になるための十分条件を満たし、これでまた一つ不便さの克服による快楽を得ることができた。レイヤーごと&キーごとに七色発光体の色が変わるPer Key RGBの水先案内人仕様はすこぶる楽しく、その弊害として無意味にレイヤーを変えて水先案内人に現在のレイヤーをお伺いするという無駄な時間が急増した。また、Per Key RGBの水先案内人仕様の導入により、キーマップを変えるたびに必要に応じてPer Key RGBの水先案内人の光り方も変えないといけなくなり、不便さをひとつ克服してもなお不便さを追求することで快楽を得るための奥ゆかしい時間の無限ループにはまることとなった。
最初にも記載した通り、猫山王の奮闘記で一番人気がないのが七色発光体のテーマである。そのことを考えるとキーボード界における光の魔術師はそれほどいないのではないないだろうか、であれば光の魔術師の絶対王にかなり近いところまできているのではないだろうかとあらぬ想像をしてしまう。とはいえ、猫山王としても七色発光体をもう少し使いこなしたい構想はあるので、自作キーボード界の偉大なる巨匠に敬意を払いながらさらなる不便さを克服することにより快楽を得るためにも修羅の国での修行を続けていく所存である。
猫山王のEqauls 48は現時点で猫山王が実現したいすべての仕様が盛り込まれた満腹丸仕様のエンドゲームなキーボードであることには変わりない。満腹丸仕様のEqauls 48のおかげで自分の理想形のキーボードを日課のように追い求めることはなくなり、心穏やかでPeacefulなキーボードライフを過ごしている。
自作キーボードは敷居が高いと思われている方にとって、一日で一番手に触れているものはキーボードということで、不便さを克服することにより得られる快楽の世界への入門のための勇気づけとなれば幸いです。
最後に猫山王のEquals 48のsource codeを下記に貼り付けておく。当然にVial対応しているので安心してお使いただける。とはいえ、Equals 48 DIY Kitを購入する変態修行僧は日本には猫山王以外にいるとは思えないが、この奮闘記を読んでEquals 48 DIY Kitを購入された修行僧がいれば是非ご一報願いたい。この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 Equal 48 ends up at this moment.

Refer to my github for the latest source code of Vial port.

VERY IMPORTANANT
My environment is as followed;
- 40% layout
- Windows
- Drag-and-drop .uf2 format file 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".

いいなと思ったら応援しよう!