ピアノ演奏を可視化する装置作ってみた(それを使って弾いてみた)
概要
私は電子工作と別にピアノも趣味なのだが、最近は有名どころのクラシックを弾いている。
例えば、ショパン・ベートーヴェン・リストなどだ。
ただ弾くだけでも楽しいのだが、演奏が音だけでなく視覚でも楽しめると良いかな、と思い、ピアノ演奏を可視化する装置(以下、ピアノディスプレイ)を作ってみた。
こんな感じ。
ピアノ演奏を可視化する装置作ってみた。
— 水田かなめ (@kmizta) May 2, 2020
1320個のフルカラーLEDを使ってます。
ピアノを音と目で楽しむ!!#MFKyoto2020 #作品発表 pic.twitter.com/9QX18yCkYE
また、このピアノディスプレイはMaker Faire Kyoto Online 2020にもオンライン出展した。この記事ではその製作過程を述べる。
背景
よくYoutubeでクラシックピアノ演奏動画を見たりするのだが、ある日Rousseau氏の動画を見かけた。
Rousseau氏はピアノの演奏とその演奏を可視化した動画を組み合わせて非常にきれいな作品を投稿している。
どうやら、動画の上半分は記録したMIDIをもとに動画を生成し、上下で動画を組み合わせているようである。
めっちゃきれいやん、と思い、早速自分でも作ってみることにした。
ただ、動画で後から組み合わせるのではなく、リアルタイムに可視化するディスプレイとした。
CADでハードウェア設計
Fusion360を使って設計をすすめる。
今回、ピアノの実寸大でディスプレイを開発するため、横幅は1mを超えるサイズになる。
鍵盤それぞれに対し、15個のフルカラーLEDを配置した。(後述:NeoPixel)
ピアノの鍵盤は88鍵あるので、全部で1320個のフルカラーLEDを使用している。
また、光らせた時に見栄えが良くなるよう、前面にはスモークアクリル板を設置している。
ちなみに、Fusion360のレンダリング機能を使うといい感じの画像も作れる。それっぽいそれっぽい。
できるだけスタイリッシュな見た目にするため、極力前面にはネジなどの機構部品が見えないようにした。
アクリルの四隅の支持材も同様にFusion360で設計して、3Dプリンタで印刷した。
2枚のアクリル板の四隅を支える部材を印刷。いい感じいい感じ。 pic.twitter.com/z0KZWx0Paq
— 水田かなめ (@kmizta) April 29, 2020
実際に作っていく
ハードウェア設計が終わったら、実際にものを集めて作っていく。
まずは、鍵盤サイズのアクリル板を用意する。
アクリル板の上にNeoPixelのLEDストリングを切って貼っていく。
今回使用したのはWS2812の300個/5mのものだ。
この際、鍵盤の寸法にピッタリ合うよう、コンマ1mm単位で位置を調整する必要がある。
LEDストリングを貼り終えたら、全てのストリング1つ1つ配線していく。
このとき注意しなければいけないのは、電源ラインである。
LEDストリングは接続数が増えていくと電流量が結構ハンパないことになるため、単純にストリングを全接続すると末端のLEDはまともに光らなくなる。
例えば、今回使用しているNeoPixel(WS2812B)は、LEDを白色最大光量にすると大体1個50mA消費する。
両手で10鍵押し続けると、15x10=150個のLEDが光り、単純計算で7.5Aの電流が流れることになる。
もちろん、実際には白色には光らせないのでもう少し電流量は少なくなるのだが、単純にLEDストリングをつなげると、末端のLEDに供給されるまでに電圧降下してしまい、以下のツイートのようにまともに光らなくなる。
わかった! ストリング長すぎて先に行くほど電源電圧が落ちてるんだ。
— 水田かなめ (@kmizta) April 11, 2020
青や緑LEDは赤と比べて電圧降下が大きいから、電圧が落ちると白のつもりが赤く光る。
写真は下から電源・信号を供給してるけど上の方は真っ赤。点灯数を増やすほど(電流が増えるほど)顕著になる pic.twitter.com/PIFzigl3km
というわけで、このピアノディスプレイでは銅テープをバスバーとしてディスプレイの上下に配置し、そこからそれぞれのLEDストリングに電源を供給することとした。
銅テープは5mm幅のものを用いた。
ちなみに、LEDストリングの信号ラインをつなげるために合計87本の短い単線をつなげた。これが一番疲れた気がする・・・。
ソフトウェア
さて、次にソフトウェアの話。
今回はESP32を使って開発した。
MIDIをESP32で読み取る
ピアノディスプレイでは、電子ピアノのMIDI OUTをESP32で読み取っている。
ArduinoでMIDIを解析する方法としては、以下の記事が詳しい。
MIDI OUTは、基本的には31.25kbpsのUART信号なので、マイコンで簡単に読み取ることができる。
ただ、出力信号とマイコンの入力はアイソレートする必要があり、高速フォトカプラが必要だ。
このあたりのハードウェア仕様はMIDI1.0規格書に詳しく記載されている。
規格書には、MIDIに適合する高速フォトカプラのリストも記載されている。
NeoPixel
みんな大好きNeoPixel。 使い方についてはネット上に多く記事が存在するので、ここでは多くは書かないが、今回はFastLEDライブラリを使用した。
NeoPixelのライブラリとしては、FastLEDの他にAdafruit_NeoPixelがあるが、Adafruitのライブラリは以下のツイートのようにLEDを多数接続した際に正しく点灯しないため、ピアノディスプレイのように多数のLEDを接続する場合はFastLEDがオススメだ。
300LEDのNeoPixel(WS2812B)を買ったのでAdafruitのライブラリとFastLEDで試してみたら、Adafruitの方は無信号(All黒点灯)にしても正しく点灯しなかった(写真)。FastLEDは全て正しく点灯。大量のNeoPixelを使うときはFastLEDの方がいいみたい pic.twitter.com/ihkg53Du7R
— 水田かなめ (@kmizta) March 7, 2020
マルチタスク
ピアノディスプレイでは1320個のNeoPixelを制御しているが、それだけたくさんのLEDをつなげるとその制御だけで(時間的に)大半のCPUリソースを食ってしまい、他の処理(MIDI入力など)ができなくなる。
そこで、ESP32はデュアルコアなので、1つのCPUをNeoPixelの制御に、もう1つのCPUをMIDI処理などに割り当て、MIDIの取りこぼしやLEDの表示ミスなどがないようにする。
ESP32(M5Stack)を使ったマルチタスクの方法については以下の過去記事参照。
最終形態
ディスプレイ部分まで完成したところで、Maker Faire Kyoto Online 2020に出展した。
ピアノの各鍵盤をHSV色空間の色相に割り当てると、こんな感じにゲーミングピアノのようになる。
なんだかとってもスタイリッシュなピアノディスプレイが完成してしまったかもしれない。 pic.twitter.com/bFvc7WosEr
— 水田かなめ (@kmizta) May 1, 2020
2020年5月2日のMaker Faire Kyoto Online 2020に向けて最低限のところまで開発したため、まだ回路などは完成していない。(ブレッドボードがディスプレイの裏にぶら下がっている)
他にも、いろんな光らせ方の実装やHIDデバイスと連携させたシーケンスの実装など、色々やりたいことはあるのだが、それらは別途記事にしていきたいと思う。
さぁ、ピアノを目で楽しもう。