Helix 自作キーボード製作記 (その5)

Helix 自作キーボード製作記 (その5)

関連記事

この記事は長くなりそうなので、シリーズ化になります。

はじめに

Helixの製作記事もここからが本題です。HelixにMIDI機能を追加してMidiコントローラー化させます。QMKのMIDI機能はWIP( Work In Progress, 未完成)なので利用は自己責任でお願いします。
またさっさとMIDIキーボード化させたい人は「3.8 やることまとめ」を読めばOKです。

また、QMK Midiに関して色々とアドバイスしていただきましたhsgw様(twitter)に感謝いたします。(やりとり終わってから気づいたんですがdm9recordsの人だったんですね…)

QMKにおけるMIDI機能

Documentの確認

QMK FirmwareにおけるMIDI機能はWIP( Work In Progress, 未完成)で処理内容はquantum/process_keycode/process_midi.cを確認してとのこと。ついでに実装はMakefileから。

MIDI機能の有効化

ということで、まずrule.mkからMIDI機能を有効にします。Helixの場合rules.mkは色々なフォルダ階層にありますが、基本的にHelixは階層が深い所の記述が優位なので、「qmk_firmware-master/keyboard/helix/rev2/keymaps/default2/rules.mk」を編集します。

# Build Options
#   change to "no" to disable the options, or define them in the Makefile in
#   the appropriate keymap folder that will get included automatically
#

......

MIDI_ENABLE = yes            # MIDI controls

rules.mk 内部にあるBuild Optionsの設定のうち、MIDI_ENABLEを= yes に変更します。yesにすると自動的にMIDI機能に必要な追加ファイルをコンパイルするようになります。

process_midi.cの確認

次にquantum/process_keycode/process_midi.cの内部を確認します。実際にこのファイルを編集することはありませんが、このファイルからわかることは「MIDI専用のKeycodeがある」ということと、「Keycodeを適切に処理させるための定義を追記する必要がある」ということの2点です。

#ifdef MIDI_ADVANCED //42行目
...
#endif // MIDI_ADVANCED //250行目

MIDI_ADVANCEDという名前で定義がされている場合は42行目から250行目のコードが有効になるので、MIDI_ADVANCEDを定義してやる必要があるというわけですね。

bool process_midi(uint16_t keycode, keyrecord_t *record) //81行目
{
    switch (keycode) {
...

81行目からのprocess_midi()という関数がmidiの処理になりますが、ここで「keycode」という引数をとっており、midi専用のKeycodeがあることが示唆されています。

定義の追加

というわけでまずconfig.hにMIDI機能を定義します。
例によって深い階層にあるconfig.hに入れてやればいいので、とりあえず「qmk_firmware-master/keyboard/helix/rev2/keymaps/default2/config.h」を開きます。まあ、config.hならどこでもいいんですが…わかりやすいようにということで。
config.hの最下段に以下のコードを追加します。

#ifndef MIDI_ADVANCED
   #define MIDI_ADVANCED
#endif

ここで「#ifndef - #endif」はif not defineのことで「もし定義されてなかったら間の処理をする」です。
#define MIDI_ADVANCEDMIDI_ADVANCEDを定義するということです。
HelixはもともとMIDI_ADVANCEDを定義していないので、#ifndefは書かなくてもいいのですが、一応二重定義を避けるために#ifndefで囲んでおきます。

これでquantum/process_keycode/process_midi.cのMIDI_ADVANCEDの項目が有効になりました。

Keycodeの確認

MIDI_ADVANCEDに関するkeycodeはQMKのDocumentには記載されていません。
代わりにqmk-firmware-master/quantum/quantum-keycodes.hの167行目以降に書いてあります。

MIDI機能を使うためのkeycodeは「MI_」をプレフィクスにもつキーコードを使えば良いというわけですね。

MIDIのノートON/OFFをしたい場合は「MI_C」や「MI_Gb_3」などのkeycode。オクターブシフトは「MI_OCTD」「MI_OCTU」などです。
これらのkeycodeをキーボードカスタマイズの手順をふって書いていけばいいということですね。

Keymapの編集とAVR書き込み

というわけでこんな感じでMIDIのキーボードを作りました。(「MI_MI_ALLOFF」は画像キャプチャしてからミスに気づきました…)
これをPro Microに送れば完成です。

MIDIキーボード化の確認

正常にMIDIキーボード化できていれば、「Helix Beta」という名前でMIDIデバイスとして認識されているはずですので、MIDIデバイスとして使いたいソフト上で認識させます。キーボードを押してMIDI入力が適切に行われていれば完成です。

やることまとめ

結局やったことは、「qmk_firmware-master/keyboards/helix/rev2/keymaps/default2/」にあるファイルのうち、

  • rules.mk ファイルにて、
MIDI_ENABLE = yes            # MIDI controls

に書き換える。

  • config.hにて、
#ifndef MIDI_ADVANCED
   #define MIDI_ADVANCED
#endif

を最下段に追加する。

  • keymap.cにて、
MI_C

のようなMI_からはじまるキーコードでキーボードをカスタマイズする。

という操作をすれば、MIDIキーボード化できるというわけですね。

さらに進んで…

MIDI_ADVANCEDの機能はQMKのMIDI機能の処理を簡潔にするためにまとめたもので、コーディングによってさらに細かいMIDI機能が使えるようになります。
例えばMIDIの送信だけでなく受信に関する設定(Callback)を行ったり、MIDI以外の機能との連携(例えばRGB LEDをMIDI Velocityと連携)させたりといったことができるというわけですね。

今回はMIDI_ADVANCEDによるMIDIの送信にとどめておきますが、QMKのことをもう少し調べてできるようになったらまた記事にしてまとめたいと思います。

まとめ

というわけで5回の記事に渡ってHelix自作キーボードを作ってきました。
はんだづけが久しぶりだったりして大変でしたが(失敗してゴミになるようなことはなくて)楽しかったです。

QMK自体はもう少しいろんなことができそうなので調べながらカスタマイズして遊んでみようと思います。

では。

電子工作カテゴリの最新記事