🎼

(自作キーボード)QMK Firmware で VIA に対応し REMAP でMIDIキーを割り当てて使う方法

2021/07/03に公開

はじめに

※ しばらく使ってみた3arahtの、素人見解満載なので間違っているところがあるかと思います。予めご了承ください。
※ ここでは、すでに VIA に対応済みのキーボードに対し、MIDI 機能を有効にする方法を紹介してますので、VIA の設定方法については、サリチル酸さんのサイトがとてもわかりやすいのでそちらをご覧ください。
https://salicylic-acid3.hatenablog.com/entry/via-support

QMK Firmware

文字を入力するのに使う方のキーボードを自作されている方は、QMK Firmware というキーボードをカスタマイズするためのプラットフォームにお世話になる場合が多いです。有識者のボランティアのおかげで 素人の私のようなものでも簡単にキーボードの土壌が簡単に構築でき、すこし味付けするだけでユニークな機能を持ったキーボードを作ることができます。

VIA

VIA は、ファームウェアの更新なしにキーマップを手軽に変更するようにする仕組みです。ファームウェアを更新しない代わりに EEPROM にキーマップ情報を格納します。
QMK Firmware のコードを修正せずにキーマップが変更できるので、キーボード開発者でなくても、ソースをいじってコンパイルしなくても、キーマップが変更できるようになりました。

REMAP

VIA の流れを汲んで登場したのが REMAP です。REMAP もVIAと目的は同じで、簡単にキーマップを変更できるようにしたものです。Chrome ブラウザ上で動作するので、出先でちょっとキーマップ変更したくなった、普段は個人PCでキーボードの設定いじっているが、会社PCで修正したくなった、というときにも Chrome ブラウザで REMAP のサイトにアクセス(要ログイン)してしまえば実施可能になります。

今回のメインディッシュ: REMAP で MIDI キーの割り当て

便利な REMAP ですが、MIDI キーも割り当てができるようになりました!!!
何もしなくても、MIDI キーを割り当てることはできてしまします。
しかし、ちゃんとキーボードを MIDI 楽器として使えるようにするにはあらかじめ QMK Firmware で少しコードに追加が必要です(コードを修正して MIDI に対応させないと音が出ません)。
この記事ではその部分の Todo を紹介致します。

REMAP で 割り当てた MIDI キーを有効にするための下準備

具体的なコードへの変更について触れていきます。

やること

MIDI キーを有効にして、ちゃんと音が出るようにするには、QMK Firmware のコードで以下の3点を実施する必要があります:

  • rules.mkMIDI_ENABLE = yes にする。
  • config.hMIDI_ADVANCED#define する。
  • (keymap.c で MIDI の初期音量の指定とオクターブ位置の調整)

1, rules.mk

以下の真ん中のように、rules.mkMIDI_ENABLE = yes に変更します。

BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
MIDI_ENABLE = yes           # MIDI controls
AUDIO_ENABLE = no           # Audio output on port C6

2, config.h

MIDI_ADVANCED#define するのですが、以下のように MIDI_ENABLE が定義されている場合のみ有効になるようにしておくと良いと思います。

#ifdef MIDI_ENABLE
#   define MIDI_ADVANCED
#endif  //  MIDI_ENABLE

3, keymap.c (任意ですがおすすめ)

この内容を記載しなくても音は出るようになりますが、以下の2つの観点から、コードを追加しています。

  • C3 (基準のドの音、キーコードだとMI_C_3)をヤマハ方式になるようにオクターブ調整する
  • 初期音量(velocity) を少し抑える

3.1, オクターブ調整

まず、最初のオクターブ調整ですが、keyboard_post_init_user() に以下のコードを追加して、キーボードが起動したときにオクターブの初期値を設定します。

    //  Set otave to MI_OCT_0
    midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;

もしもkeymap.ckeyboard_post_init_user()という関数がなかった場合は、以下のように関数ごと追加します。

void keyboard_post_init_user(void) {
    //  Set otave to MI_OCT_0
    midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
};

midi_config変数に代入するため、keymap.cの冒頭で以下を宣言しておきます。

// Used to set octave to MI_OCT_0
extern midi_config_t midi_config;

これにより、Logic Pro や Garage Band の C3 と、キーコードのMI_C_3が一致するようになりました。

以上のオクターブ調整は表記をヤマハ方式にするためのものでしたが、MI_OCT_0MI_OCT_N1 にしたら、ローランド方式になるものと思われます(未確認)。

MIDIのオクターブについては、こちらが参考になりました。
https://matcha-music.com/2020/01/19/post-1812/

3.2, 音量調整

音源によっては、音量(velocity)の最大値 の 127 という値に特別な意味を持たせたものもあるそうです。そこで、初期値の音量を少し下げた値にします。127 未満の値であればなんでもよかったのですが、process_midi.c をみると、velocity を調整するキー(MI_VELD)が押されたときの振る舞いをみると、127 の下は 117 になるようにコーディングされていたので 117 にしています。
下のコードを keymap.cの冒頭の方に記載します。

// Initial velocity value (avoid using 127 since it is used as a special number in some sound sources.)
#define MIDI_INITIAL_VELOCITY 117

REMAP で MIDI キーの割り当て

REMAP のサイトで MIDI キーを割り当てます。Chrome で下記リンクにアクセスしてください。
https://remap-keys.app/

MIDI入力に対応したアプリ(音源)で音を出す

キーボード自体には音源は含まれていませんので、音を出すには MIDI 入力をサポートするアプリが必要です。

  • Mac: Garage Band, Logic Pro など
  • Win: Piano 10 など

タブレット、スマートフォンなどでも動作実績がありますので、試してみてください。
(電源供給しながらでないど過負荷で動作しない場合がありますので、ご注意ください。)

まとめ

普段 QMK Firmware、VIA、REMAP をお使いの方のほとんどは、タイピング用のキーボードの用途であることがほとんどだと思います。
しかし、今回ご紹介したように、ちょっとした変更だけてみなさんの自作キーボードが簡単に MIDI 楽器に変身するとしたらちょっとワクワクしませんか?
参考になれば幸いです。

参考

この作戦を使い、実際に foostan さんが開発された Corne Cherry キーボードをコンサーティーナ MIDI キーボードに変身させた事例がこちらです。
このキーボードを作られた ohayuta さんのキーマップです。
https://twitter.com/ohayuta/status/1405824141299699721?s=21

ohayuta さんの作られたコンサーティーナ MIDI キーボードの演奏の様子はこちら。
https://twitter.com/ohayuta/status/1411133706069110787?s=21
すごいですよね!!!楽しそう〜。

注意点:

2021/9/4 現在、押し引きで音が変わるダイアトニック式コンサーティーナ(=アングロ・コンサーティーナ、=蛇腹を開いた時と閉じた時で異なる音が出るタイプ)の再現のためにはレイヤー切り替え作戦をイメージしておりました。しかし、この作戦はうまく行かないようです。レイヤーの切り替えだけは、押しっぱなしにしている音階キーが押され直さないようです。もともとQMK Firmware はタイピングキーボード用に設計されているので、そういう仕様なのだと思います。

Bellow Shake できるようになりました。

2023/04/23 更新。
2021/09/04 に記載した注意点ですが、解決しました! レイヤーを切り替える際に、
1、今押しているキーの音を消す
2、レイヤーを切り替える
3、今押しているキーの音を鳴らす(音が切り替わる)
ということをさせるようにできました。
以下のPull Request が参考になれば幸いです。
https://github.com/qmk/qmk_firmware/pull/20527#issue-1679455830

コンタクト

3araht の活動拠点:
Twitter: https://twitter.com/3araht
Github: https://github.com/3araht
BOOTH: https://3araht.booth.pm
Instagram: https://www.instagram.com/3araht

Discussion