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

# この記事を3行で要約

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

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

# このデバイスは何ですか？

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/XN6Ps74EyQg?si=oUnPPCrPE_9remRE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
(注：音が鳴ります)

<br/><br/>

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">Shreddy Pulseの謎とは？！？！<br>9月15日(日)超電子COMPLEX Vol.29 で明らかに！<br><br>※動画、音が鳴ります <a href="https://t.co/SnrqdxiWkS">pic.twitter.com/SnrqdxiWkS</a></p>&mdash; にっしゃん (Shreddy Pulse) (@nisshan_) <a href="https://twitter.com/nisshan_/status/1831528933206180313?ref_src=twsrc%5Etfw">September 5, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<br/><br/>

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

# システム構成

![Pulcoシステム構成.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/78db9619-2042-21ff-8bec-8ec3db6b6cd3.png)

非常に簡単な構成です。

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

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

![micro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/5eb8f3b2-4637-4cc2-399e-7357cb8f09cf.jpeg)


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

![チルトパン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/3bedb391-dbee-922b-d780-90fdcd5a5d23.png)

# MIDIの実装

## ハード

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

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

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

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

![IMG_3744.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/d74cde41-8065-e3d0-e475-9a471adddd36.jpeg)

## ソフト

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

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

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

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

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

![IMG_3743.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/b832f4c9-7f98-ea44-0183-03fe6108352f.jpeg)

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/8969e1e3-c9d7-957a-17f2-401b66e07f01.png)

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

# デモ

![フライヤー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/631cfbf8-d4a3-f708-5280-91e547b1864e.jpeg)

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

## イベントタイトル

Electric Oddyssey 〜4つの音の旅路〜

## 日時：

2025年1月13日(月、祝)

- open: 19:00
- start: 19:30

## 会場

音楽と珈琲 ひかりのうま

- [official site](https://hikarinouma.blogspot.com/)
- [Google Map](https://maps.app.goo.gl/u5EZfw5Kgkf8Mdkh6)

## Charge:

2000円+1ドリンク

## 出演

- Shreddy Pulse (シュレッディパルス)[@nisshan_、私](https://x.com/nisshan_)
- emulsion [@emulsion_jp](https://x.com/emulsion_jp)
- ambient punks [@AmbientPunks](https://x.com/AmbientPunks)
- atennaut [@hidekito69](https://x.com/hidekito69)

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