🎼

自作キーボードをMIDIキーボードに改造した話

2021/11/18に公開

概要

自作キーボードのファームウェアを書き換えてMIDIキーボードを作ったことについてメモを残します。
以下の機能を実装済みです。

  • Noteの入力
  • CC送信(Sustain/Expression/Modulation/MasterVolume/Pan)
  • シーケンサ(本体側に譜面情報を記録して再生する機能)

写真は以下。

実際に動かしてるところは以下URL参照

経緯

手首の腱鞘炎

現在自分が手首の腱鞘炎で利き腕の動きに制約を受けています。
このため、以下の制約・課題を定義しました。

  • 手首の腱鞘炎により手首の回転や細かい操作が困難
  • よって、手首の回転・細かい制御を行う必要のあるマウスや鍵盤等楽器を使わずに作曲したい

(正確に言うと痛み自体は10年くらい前からあったんだけど、ここ1~2週間で痛みが悪化して動かすのも困難な状態でした)

キーボードだけで音楽作るのは困難

理想だったのが「キーボードだけで音楽を作れる環境を構築する」事です。
指の動きだけでボタン押下ができますし、細かい運指等のコントロールも必要ないので最適です。

ただ、DAW(というかWin/Macの音楽制作ソフト)が「マウスでの操作を前提に作られている事」もしくはMIDIキーボードを使って譜面入力させるのを前提に作られています。
ステップ入力に対応しているDAWでもMIDI入力を使う前提となっているものが多く、キーボードだけでは入力すらできない。
また、バーチャルキーボードを内蔵しているDAWもありますが、DAW本体のショートカットを封じているため、操作に不整合が存在します。(Cubase/AbletonLiveが該当)

上記状況の通り、キーボードによるフル打ち込みがしたいけどかなわないんですね。
トラッカーとかであれば譜面入力はできると思いますが、発音方法に制約が存在するのと、RenoiseはVST使えるけどVSTを起動した途端にマウス操作が必要になるのでアウトの認識。
また、MMLみたいなアプローチもあるんですが、トラッカーと同じ様に発音形式に制約がつくのと、やるとしてもアプリ連携ができないため、Tabキーとかでアプリを行ったり来たりを繰り返して作る形になります。また、自動再生がメインなのでMIDI Learnやコントロールになってくると再生しつつDAWで記録しつつ・・・となってコントロールタイミングが細かくなってきます。

参考URL:
https://machiaworx.net/?p=226
(数年前から手首に痛みはあったので、その頃からキーボードだけでどうにか作曲できないかメモっていたものです)

自作キーボードの構成を知る

シンセ+シーケンサや作曲ツールを自作していた中で、主に回路について調べていたところ、自作キーボードの記事にたどり着きました。

元々キーボードの構成がキーマトリクスなのを知ったのが始まりだったかと思います。

で、よくよく調べてみるとBelaと同じような(というかArduinoが先か)マイコンから制御していると知りました。

そもそもMIDI信号をファームウェア経由で出せればいいのでは

どうも、自作キーボードでよく使われるマイコン・ProMicro上で構成するファームウェアを利用してキーボードを動かしていることが分かってきました。
また、調べる中でわざわざ自作キーボードをMIDIキーボードに変更する方もいらっしゃいました。

これを見て思ったのは・・・「自作キーボードでMIDIデータ出力する方法が問題解決できるのでは」ということです。

元々の希望というか制約・課題は以下の通り。(転記)

  • 手首の腱鞘炎により手首の回転や細かい操作が困難
  • よって、手首の回転・細かい制御を行う必要のあるマウスや鍵盤等楽器を使わずに作曲したい

上記の制約・課題の大部分を解決できる選択かと思いました。
(完全ではないですが問題なくなってる。DAW側のテンプレートで対応等も可能)

1台買ってみて試してみた

試しに手頃な価格のnomu30というものを買ってみて、
ファームを書き換えてみたところ、快適にコントロールが可能になりました。

前置きが長くなりましたが、以上が経緯になります。

購入自作キーボードキット

nomu30

https://shop.yushakobo.jp/collections/keyboard/products/nomu30kit?variant=37698578940065
(11/18現在売り切れですが)

一度ファームを書き込んでみて、これはミニマルでいい!と思いました。
が、MIDI鍵盤として使うため本来のキーボード機能はほぼ未使用になりました。

SU120ベースの自作レイアウト(2021/11/29追記)

https://github.com/e3w2q/su120-keyboard
https://talpkeyboard.net/?category_id=5e83f0a42a9a422dab65796d

これ使って自作レイアウトを作ってます。
QMK firmwareを使わなくていいので、結線部分に集中すればいいのはありがたいです。

MIDI機能を追加(というか全面書き換え)

QMK firmwareでMIDI機能を使えるが、ビルドが必要

まず、QMK firmwareにはベータ扱いでMIDI割当ができる模様。

ただ、ファームウェア自体の再ビルドが必要なのがネックです。
(Win環境だとMSYSインストールの必要があるみたいですね。一応インストールはしてあるけど)

諸々の拡張が必要そう

また、ファームの書き換えを行う場合、ファームウェアの制約によって
制御が困難になる可能性があります。

単にMIDI出力だけならまだしも、内部に制御加えた上でMIDIやCC出力になると、まず可能かどうかの検証が必要になります。
元々AbletonLiveのバーチャルキーボード機能を参考に作ろうとしていたので、MIDIデータ出力以外の機能が割と多かったんですね。

また、ファームへの記述追加だと不具合の切り分けが困難になります。
不具合があった場合、修正ができる・できないの判断に時間がかかるのは困るわけで。

ということでQMK firmwareを使うのは一度諦めました。

フルスクラッチで対応

上記の理由・経緯より、一番手っ取り早くフルスクラッチで対応することにしました。

参考資料のソースコードを見るとそれほど混み入った(特殊な)実装になっているわけでもなく、かつ重要な部分は抑えてあったのでそれを使わせてもらい、
シーケンサやシステム周りについては自前実装を行いました。

参考資料:
自作MIDIキーボード — Home-brew MIDI keyboard 0.05 ドキュメント (triring.net)

反映はArduinoのIDEを利用してスケッチを書き込む形で対応。
組み込み機器のプログラムはあまり経験がないのですが、利用していたマイコンボードがArduinoに対応しているおかげでそれほど問題なく書き込みまで行うことができました。

以下に手順をざっくり書きます。

  • ArduinoIDE上でソースコード書く
  • BoardはSparkfun AVR MiniMicro、ProcessorはATMega32U4(5V, 16MHz)を選択
  • キーボードのリセットボタンを2回押す→Arduinoが書き込みモードになる(COM割当が完了)
  • 上記状態に移行したらUploadボタンを押下する(正直UI確認する余裕ない)
  • Verify→Uploadを行うので最初のVerifyが終了したくらいのタイミングでキーボードのリセットボタンを素早く2回押す
  • プログラムの書き込みが始まるため、エラーが出ないで「Done Uploading」と出れば終了。

詳細は下記URLにまとめてあります。
https://machiaworx.net/?p=1094

実装内容

  • MIDIメッセージ送信
    キー押すと送信が可能。
    別のキーでオクターブとVelocityの調整を加えて、鍵盤を押すことでのみMIDI出力を行う形にしてます。
    おかげでオクターブ数が不足してても対応可能です。
    あとはキーを離したらNoteOffが飛ぶようにしてます。
  • チャタリング対策(ソフトウェア側)
    各キーごとでフレーム数の配列を加えて加算するように対応してます。
    具体的にはON/OFF以外のタイミングでloopによるカウントを加算するようにして、キーHOLD/LOWのどちらかでバッファの比較をすればチャタリングを回避できます。
    (実装では両方に無理やりチェック関数を入れてますが)
  • CC送信
    他のキースイッチと同様の判定で、鍵盤に機能を割り当てました。
    シフトキーを追加し、シフトキーを押しながら鍵盤キーを押すことで、特定の値でCCを入力した扱いとしてます。
    これによってスペースを少なく、かつ高機能な割当ができるようになりました。
     シフトキーの実装についてはフラグのON/OFFのみで対応。
    2台目ではCCの番号も指定する機能を実装予定(開発中)
  • シーケンサ作成(1台目)
    言ってしまうと自動演奏を行えるようにしました。
    録音キーを押しながら鍵盤を押すことで譜面として登録、また譜面消去機能も付けて自動演奏がすぐできる形にしました。
    画面がないので、機能はシンプルにしてあります。
    ただなんかバグが多いので現在も修正中です。

終わりに

結構変わったアプローチですが、まぁ誰かの参考になれば幸いということで。

Discussion