AR Guitar作ってみた


はじめに

ギターの演奏に合わせてAR表示をしてみた。

フレットが青色に光り,押さえたボジションが丸く光る。
弾いたら音符が画面上の楽譜に飛んでいき自動的に採譜されるようになっている。

構成

ハードウェア

ギターに貼り付けたARマーカーをカメラで認識することでギターの位置と姿勢を取得し,カメラ画像上の指板に描画するために必要な情報を得る。
どのフレットを弾いているのかはギターシンセによりMIDI信号に変換することで取得している。ギターシンセからは1〜6弦のそれぞれのノート番号が出力されるため,下記のように各弦の開放音を引けばフレット番号になる。

1弦:ノート番号 - 64(E音)
2弦:ノート番号 - 59(B音)
3弦:ノート番号 - 55(G音)
4弦:ノート番号 - 50(D音)
5弦:ノート番号 - 45(A音)
6弦:ノート番号 - 40(E音)

ギターシンセ用ピックアップは弦ごとにマイクがあり,MIDI信号が個別に出力されるため,単音ではなくコードでも問題なく弾いているポジションを取得することができる。
ちなみに動画で使用しているギターはブリッジにピエゾが仕込まれており,外付けの専用ピックアップなしでギターシンセを使用可能。

ソフトウェア

ソースは汚いけどgithubにあげた。
https://github.com/a2kiti/ARGuitar

プログラムにはアニメーションなどの描画に特化したProcessingを使用。
基本はJavaでPythonでも記述できるらしいが,ライブラリの使用等に制限がありそうだったのでJavaで書いた。大学の演習でブロックスを作ったの以来だったので,さっぱりだったけど。

ARマーカーの識別にはNyARToolkit for processing
https://github.com/nyatla/NyARToolkit-for-Processing
MIDI処理にはTheMidiBus
http://neralt.com/processing-midi-controller/
を使用した。

ARマーカーを認識すると姿勢がわかるがフレットの位置はマーカーを貼り付けたギターの位置によるため,手動で位置のキャリブレーションし保存できるようにしてある。

フレットの位置はナットからの距離をl,フレット数をn,弦の長さをLとすると

l = 2^{(12-n)/12} \times \frac{L}{2}

で計算できる。

ギターシンセがMIDI信号を出力してくれるため,前述の通り各弦ごとに開放弦のノート番号を引くだけでどのフレットを押さえてるかわかる。

何に使えるか

オンラインでのギターのレッスンやレッスン動画を演奏動画を投稿しているyoutuberの人が使うといいかも。

もともとライブするときになにか演出に使えないかと考えていたのだが,このままだとカメラで撮影した動画にしかAR表示することができない。プロジェクターを使って実際のギターに投影したらなにかできるかもしれないので今後試してみたい。

今後試したいこととして
・プロジェクターでの投影
・通常の出力からのノート番号取得
現在はギターシンセによるMIDI信号への変換を使用しているが,ギターシンセ用のピックアップを持っている人はかなり少ないため,専用ピックアップではなく通常の出力からノート番号を推定できるようにしたい。ギターシンセとして使うにはレイテンシーの問題があり,ローランドが専用ピックアップを使って何年も開発してあの低レイテンシーを実現しているが,単に演出用・採譜用では数10msくらい遅れても問題はないため,ニューラルネットワークを用いた最近の手法を使えばなんとかなる気がする。学習データもギターシンセのMIDI変換ですぐ集められる。
・機械学習と組み合わせるためにPythonでの実行
OpenCVで最初描画しようとしたが処理速度が全然足りなかったので,openGLで描画も検討する。

また,すでに似たようなことをしている人がいた。
https://twitter.com/MatthewHallberg/status/1028725125363982337
こちらの人はunityで作っているようだ。