5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MIDIで光るアートデバイス制作記

Last updated at Posted at 2024-12-15

この記事を3行で要約

  • 音楽に同期して眩しく光るデバイスを作ったよ。
  • MIDIコマンドで制御できるよ。
  • 制作はChatGPTに助けてもらったよ。

なお、からあげ帝国 Advent Calendar 2024の16日目の記事です。このAdvent Calendarは他と違って技術ジャンルが指定されていないので、何書いても許されるという非常にありがたい場ですね。唐揚げにレモンをかけても許されます。

このデバイスは何ですか?

動画を見るのが一番手っ取り早いです。見て、見て。

(注:音が鳴ります)





このように音楽と同期して光を放つデバイスです。この制作について書きたいと思います。

システム構成

Pulcoシステム構成.drawio.png

非常に簡単な構成です。

PCからデバイスを制御しますが、そのコマンドにMIDIを使っています。具体的な制御コマンドは後述しますが、MIDIを採用した理由は「実装が簡単だから」です。プロトコルや認証など気にする必要がないので気軽に試せるのがメリットですね。

PCとデバイスの間はUSBケーブルで接続しています。いわゆるUSB-MIDIで通信します。このUSB-MIDIを動作させることができるマイコンがArduino Mircoです。

micro.jpg

Arduinoマイコンでサーボモーターの角度とLEDの点灯を制御しています。首を振るようにモーターで動く部分はチルトパンキットを使いました。この製品は主にカメラを乗せて向きを変えるために使うようです。使ったのはこれじゃないけど、下の画像みたいなものです。

チルトパン.png

MIDIの実装

ハード

USB-MIDIなのでハードはすでに実装されています。もうね、わざわざフォトカプラを使って自分で実装しなくて良いんですよ。

入出力は写真の左から右の順で

  • AC 100V 入力
  • 5V信号 出力
  • USB

となっています。出力の5V信号は外部のLEDを点灯できるよう、GPIOポートをそのまま出したものです。

IMG_3744.jpg

ソフト

ソフトを実装するにあたり、まずコマンドに挙動を割り当てました。

機能 サブ機能 MIDIメッセージ データフォーマット
明るさ指定モード LED点灯 ノートオン ・ステータスバイト: 0x9n(nはMIDIチャンネル番号)
・データバイト1: ノート番号(0から127の範囲)
・データバイト2: ベロシティ → LEDの明るさ
LED消灯 ノートオフ ・ステータスバイト: 0x8n(nはMIDIチャンネル番号)
・データバイト1: ノート番号(0から127の範囲)
・データバイト2: ベロシティ(通常は0)
LEDの明るさ 音量 コントロールチェンジメッセージの構造
・ステータスバイト: 0xBn(nはMIDIチャンネル番号)
・データバイト1: コントロール番号(音量の場合は7)
・データバイト2: コントロール値 → 明るさ
LED1,2,3の選択 ノート ・C4(60)ならLED1
・C#4(61)ならLED2
・D4(62)ならLED3
・D#4(63)ならLED3つすべて
点滅指定モード LED点灯 ノートオン ・ステータスバイト: 0x9n(nはMIDIチャンネル番号)
・データバイト1: ノート番号
・データバイト2: ベロシティ → 点滅周波数
LED消灯 ノートオフ (明るさ指定モードと同じ)
LED1,2,3の選択 ノート ・C5(72)ならLED1
・C#5(73)ならLED2
・D5(74)ならLED3
・D#5(75)ならLED3つすべて
サーボのYaw回転 パン コントロールチェンジメッセージの構造
・ステータスバイト: 0xBn(nはMIDIチャンネル番号)
・データバイト1: コントロール番号(パンは10)
・データバイト2: コントロール値
サーボのピッチ回転 モジュレーション コントロールチェンジメッセージの構造
・ステータスバイト: 0xBn(nはMIDIチャンネル番号)
・データバイト1: コントロール番号(モジュレーションホイールは1)
・データバイト2: コントロール値

ArduinoのコードはPlatformIOで書きました。MIDI制御ライブラリはMIDIUSBというそのままずばりの名前のものを使いました。このライブラリを使って上記表の通りMIDI受信する部分はChatGPTにお願いしました。簡単な割に書く量が多いので、こういうのはChatGPTにお任せするのが一番楽です。

制作時のちょっとした工夫

①ACアダプターをおもり代わりに内蔵

IMG_3743.jpg

LEDやサーボに電源を共有するために、100VコンセントにACアダプタをつないで12Vを得ています(サーボ用にDCDCで5Vに降圧)。

このACアダプタの変換部分が比較的大きくて重いので、ケースに入れてしまって、おもり代わりに使ってます。筐体が軽いままチルトパンが上下左右にブンブン動くと結構揺れたりずれたりしましたので、重量を稼いでいます。

100V電源を筐体に直接入れていますが、本デバイスは個人のおもちゃなのでOKなんですよね。いや、100V電源ケーブルを直接挿すスタイルは売り物の製品の場合PSEマークの対象となりますので、たいてい(認証取得の手間を避けるために)AC→DC変換部分を外出ししています(他にも理由があるけど)。この禁じ手をやましい気持ちなく使えるのは、個人制作ならでは!

②立ち上がったら動作チェック機能

機能というほどではないですが、電源を入れたら、デバイス制御が正しく動くかどうかを確かめるために、数秒間勝手に全LEDと全サーボをあるパターンで動かします。現場でデバッグしたりデスターを当てて確認する訳にはいかないので、簡易的でもこういう機能があると便利です。

③テストデータの作成はChatGPTに頼む

MIDIの制御データの仕様をChatGPTに伝えて、「テストデータくれ」と頼むと作ってくれました。それをDAWで打ち込んだり、pythonスクリプトで順に流せばOK。便利な時代です。

④点滅はいちいちnote on/offを送らない

アサイン表のC5〜D#5のノートONが来たら、ベロシティ値を周波数に変換して点滅します。MIDIケーブルと比べるとUSB-MIDIの通信速度は超早いのでいちいちon/offを送っても良いのですが、↓の「使い方」の場合、音符を超細かく打ち込む必要があり、無理です。なので、C4〜D#4は明るさ指定モード、C5〜D#5は点滅指定モード、と機能を分けています。

使い方

PCとデバイスをUSBで接続したら、あとは好きなDAWソフトでノートを打ち込み、シーケンスを再生するだけです。私はStudio OneやLogic ProやPure Dataで制御しています。

スクリーンショット 2024-12-01 21.09.14.png

このスクショでうねうね折れ線になっている部分が、オートメーションでモジュレーションやパンを書いてある部分です。これでサーボが上下や左右に動きます。非常に直感的ですね。

デモ

フライヤー.jpeg

このデバイスを使ったライブをやります。この記事を読んだ方は全員来てください。なお「ライブハウスが初めてで怖い。でも行ってみたい」という方はXのDMいただければご案内させていただきますし、当日も場内で案内させていただきます。何卒よろしくお願いいたします。

イベントタイトル

Electric Oddyssey 〜4つの音の旅路〜

日時:

2025年1月13日(月、祝)

  • open: 19:00
  • start: 19:30

会場

音楽と珈琲 ひかりのうま

Charge:

2000円+1ドリンク

出演

並びは出演順です。何卒よろしくお願いいたします。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?