関連記事
この記事は長くなりそうなので、シリーズ化になります。
- Helix 自作キーボード製作記 (その1) / 購入
- Helix 自作キーボード製作記 (その2) / 組み立て
- Helix 自作キーボード製作記 (その3) / 開発環境構成
- Helix 自作キーボード製作記 (その4) / カスタマイズ
- Helix 自作キーボード製作記 (その5) / MIDIコントローラー化 (当記事)
はじめに
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_ADVANCED
はMIDI_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自体はもう少しいろんなことができそうなので調べながらカスタマイズして遊んでみようと思います。
では。