QMK FirmwareでキーボードをMIDIコンにする
概要
QMK Firmwareで動作しているキーボードをMIDIコントローラとして使用できるまでのチュートリアルです
前提
QMK Firmwareで問題なく動作しているキーボードがある
USB接続限定(BT接続はたぶん実装されてないです hsgw.icon)
Pro Micro、ARMどちらでもMIDI周りの関数や設定は同じ
基本
目標
QMK Firmwareに用意されているMIDIノート送信機能を使ってみる
手順
キーマップ内のrules.mkにMIDI_ENABLE = yes、config.hに#define MIDI_ADVANCEDを追加
config.h内で指定できる#define MIDI_BASICはキーマップに指定したMIDIノートを送信する機能を持たないので注意
キーマップ内にMI_Cなどを指定してコンパイル・キーボードに書き込む
MIDIデバイスとして認識するか、MIDIノートが送信されるかを確認
注意
ファームウェアのサイズが増えるのでOLEDやバックライトLEDと同時に使えないかも
USBエンドポイントが足りなくてコンパイルできないかも
応用
目標
基本の方法では送信できないコントロールチェンジやその他のMIDI信号を送信する
サンプル
https://github.com/hsgw/qmk_firmware/blob/choco/keyboards/choco/keymaps/midi/keymap.c
手順
基本編の設定、テストを終わらせる
keymap.c冒頭に#include "midi.h"を追加
https://github.com/qmk/qmk_firmware/blob/master/tmk_core/protocol/midi/midi.h
ここにMIDI関連の関数が宣言されている
keymap.cへextern MidiDevice midi_device;を追加
カスタムキーコードに追加してbool process_record_user()内で処理をする
ノートを送る
midi_send_noteon(&midi_device, チャンネル, ノート番号, ベロシティ)
midi_send_noteoff(&midi_device, チャンネル, ノート番号, ベロシティ)
キーが離されたときにノートオフを送るのを忘れずに
コントロールチェンジを送る
midi_send_cc(&midi_device, チャンネル, コントロール番号, 値)
他の関数はhttps://github.com/qmk/qmk_firmware/blob/master/tmk_core/protocol/midi/midi.h 参照
具体的なkeymap.cはサンプルを参考に
応用2
目標
PCから送信されたMIDI信号をキーボードで受け取る
概要
midi.h内のmidi_register_hoge_callback()を使ってコールバックを追加して受信する
副作用あり
コールバックにはそれぞれひとつしか関数を登録できないので以下で登録されているコールバックが呼び出されなくなる
https://github.com/qmk/qmk_firmware/blob/ee700b2e831067bdb7584425569b61bc6329247b/tmk_core/protocol/midi/qmk_midi.c#L179