meishi2ではじめる快適Discordライフ

meishi2 キット / たのしい人生

気になってはいたけれど電子工作が未知すぎて手を出せずにいた自作キーボードについに手を出した。購入に踏み切ったのにはいくつか理由があり、まず第一に元々ホットキーツールとしてつかっていたMIDIコンの接続が怪しいときがあること。第二にMIDIコンの代替で使っていた左手デバイスのボタンが多すぎて、ホットキーの入力に迷うときがあること。この2つの理由があり、今回4キー入力のMeishi2を遊舎工房で購入した。Meishi2は半田付けが必須だったので、Amazonで半田ごてと半田線なんかも合わせて購入し、紆余曲折を経てなんとか完成までこぎつけた。

つまづいた点

qmk_install.shを何度叩いても正常に完了しない問題

この解決に一番時間が掛かった。何度表示されるWarningのコマンドを叩いてもWarningが解消されず、make meishi2:defaultを叩いてもERROR: Can not run bin/qmk!で死亡する無限ループを繰り返していた。

以下はその時のエラー内容。

Checking Homebrew installation
Already up-to-date.
Installing dependencies
Warning: qmk/qmk/qmk 0.0.45 is already installed and up-to-date.
To reinstall 0.0.45, run:
  brew reinstall qmk
Warning: Already linked: /usr/local/Cellar/avr-gcc@8/8.4.0_1
To relink:
  brew unlink avr-gcc@8 && brew link --force avr-gcc@8
Warning: Already linked: /usr/local/Cellar/arm-gcc-bin@8/8-2019-q3-update
To relink:
  brew unlink arm-gcc-bin@8 && brew link --force arm-gcc-bin@8

数時間ああだこうだと試みたが解決の糸口が全く見えなかったので、QMKのDockerを利用してビルドを試してみたら拍子抜けするほどすんなり通ったので、最終的にこちらでビルド環境を構築した。

自作キーボードのDiscordサーバーでこの問題について質問をしてみたところ、解決方法を教えてもらったので備忘録として残す。

python3 -m venv venv
source ./venv/bin/activate
pip install -U setuptools
pip install qmk
qmk compile -kb meishi2 -km default

やりたかったこと

今回このMeishi2を使って実現したかったのは、以下の4つ。

  • Discordのミュートボタン
  • Discordのスピーカーミュートボタン
  • Discord自サーバーの離席コマンド
  • Discord自サーバーの復帰コマンド

ミュートまわりはDiscord側でショートカットキーを割り当てて、そのキーをMeishi2側に割り当てた。ショートカットキーは各自で割り当てる感じなので、コピペする場合は適宜改変が必要。

マクロを利用した文字列入力が割と鬼門で、QMK側の入力が高速すぎてMAC側でSHIFTキーが連続入力されたとみなされAlfredのランチャーが立ち上がってしまう問題にぶちあたった。各文字の入力間にSS_DELAY()をかませることで解決したが、かなり不細工なのでいずれなんとかしたい。

#include QMK_KEYBOARD_H

enum custom_keycodes {
    MICMUTE = SAFE_RANGE,
    FULLMUTE,
    RISEKI,
    MODORI
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = LAYOUT( /* Base */
        MICMUTE,  FULLMUTE, RISEKI, MODORI\
    )
};

void matrix_init_user(void) {

}

void matrix_scan_user(void) {

}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
    case MICMUTE:
        if (record->event.pressed) {
            register_code(KC_LCTRL);
            SEND_STRING(SS_TAP(X_PGDOWN));
        } else {
            unregister_code(KC_LCTRL);
        }
        break;
    case FULLMUTE:
        if (record->event.pressed) {
            register_code(KC_LCTRL);
            SEND_STRING(SS_TAP(X_PGUP));
        } else {
            unregister_code(KC_LCTRL);
        }
        break;
    case RISEKI:
        if (record->event.pressed) {
            register_code(KC_LANG2);
            SEND_STRING(":" SS_DELAY(300) "_" SS_DELAY(300) "_" SS_DELAY(300) "_001" SS_DELAY(300) "_afk" SS_DELAY(300) ":" SS_TAP(X_ENTER));
        } else {
            unregister_code(KC_LANG2);
        }
        break;
    case MODORI:
        if (record->event.pressed) {
            register_code(KC_LANG2);
            SEND_STRING(":" SS_DELAY(300) "_" SS_DELAY(300) "_" SS_DELAY(300) "_000" SS_DELAY(300) "_back" SS_DELAY(300) ":" SS_TAP(X_ENTER));
        } else {
            unregister_code(KC_LANG2);
        }
        break;
    }
    return true;
};

void led_set_user(uint8_t usb_led) {

}

さいごに

Discordに入り浸っているので、ミュート管理は最重要課題。これで最高のDiscordライフをおくることができそう。他にDiscordライフの向上に寄与するようなアイデアがあれば教えてください。

追記

[ミュート/ボイスミュート]と[離席/戻り]をそれぞれ1つにまとめられそうだったのでQMKのタップダンスを使ってまとめた。これで1度押しと2度押しでコマンドを出し分けられるようになった。ラッキー。


Index
Prev
Next