100均ランタンを改造！音楽生成AIとオリジナルスピーカーで愉しむ自室クリスマスイルミネーション

## 概要
Raspberry Pi PicoとDFPlayer Miniを組み合わせて音楽再生機能を実現し、AdafruitのRing LEDを活用して幻想的なイルミネーションを作り出しました。雰囲気を高めるために、これらを100均ランタンの中に組み込み、クリスマスムードを自室で楽しめるデバイスに仕上げています。音楽は生成AIを使ってオリジナル楽曲を制作し、オリジナルスピーカーで再生することで、視覚と聴覚の両面で愉しめるようにしました。


## 完成品の動画像
<iframe width="528" height="939" src="https://www.youtube.com/embed/224RfyQYs-M" title="ひとりクリスマス song tempo130" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

##  生成AIで作曲
SUNO AI ver3.5を用いました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217319/d7a61a3e-5346-b92d-10d0-2a21557d28c7.png)


```
# プロンプト
クリスマスにぼっちで過ごしている一人暮らし社会人が聞いたときに心が温かくなる曲。
歌詞は日本語でお願いします。構成は一般的なイントロ、Aメロ、Bメロ、Cメロ(サビ)、エンディング。
楽器はボーカル、ギター、ベース、ドラム、ピアノとバイオリン。
```
上の完成品動画で流れている音楽は、この200文字程度のプロンプトをもとに、生成AIが1分も経たないうちに作り上げたものです。クリスマスらしい雰囲気がしっかり表現されていて、特に歌詞に出てくる「ホットココアの香り」が冬の情景を一層引き立ててくれて、とても素敵だと感じました！SUNO AI、なかなか凄い奴だと素直に驚かされました！

## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217319/e387d603-30b3-1ddf-4746-89319594f1a1.png)

リングの16連シリアルLEDの信号線(黄)はGPIO16と接続。


## 全体プログラム
<details><summary>コードはコチラ </summary>

```python 

from machine import UART, Pin
import neopixel
import time
import _thread

#DFPlayerの設定
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

def send_command(cmd, param1, param2):
    """DFPlayerにコマンドを送信"""
    checksum = 0xFFFF - (0xFF + 0x06 + cmd + 0x00 + param1 + param2) + 1
    checksum_high = (checksum >> 8) & 0xFF
    checksum_low = checksum & 0xFF
    command = bytearray([0x7E, 0xFF, 0x06, cmd, 0x00, param1, param2, checksum_high, checksum_low, 0xEF])
    uart.write(command)

#LEDの設定
pin = machine.Pin(16)
num_leds = 16
np = neopixel.NeoPixel(pin, num_leds)

#カラフルなRGBカラーのリスト
colors = [
    (20, 0, 0),    # 赤
    (0, 20, 0),    # 緑
    (0, 0, 20),    # 青
    (10, 10, 0),   # 黄
    (0, 10, 10),   # シアン
    (10, 0, 10),   # マゼンタ
    (10, 10, 10)   # 白
]

#BPM 130の間隔 (1ビート=0.4615秒)
beat_interval = 60 / 130 

#LEDを点滅させる関数
def led_blink():
    while True:
        for color in colors:
            # 全てのLEDを現在の色に設定
            for i in range(num_leds):
                np[i] = color
            np.write()
            time.sleep(beat_interval)  # ビート間隔で待機

#音楽を再生する関数
def play_music_with_timeout():
    #初期化コマンド
    send_command(0x3F, 0x00, 0x00)  # 初期化
    time.sleep(1)  # 少し待機

    #音量を設定 (例: 音量を20に設定)
    volume_level = 17  # 音量は0～30の範囲
    send_command(0x06, 0x00, volume_level)

    #再生コマンド (例: 1番目のファイルを再生)
    send_command(0x03, 0x00, 0x01)  # 1番目の曲を再生

#マルチスレッドでLED点滅と音楽再生を並行実行
_thread.start_new_thread(led_blink, ())  # LED点滅スレッド
play_music_with_timeout()  # 音楽を再生
```
</details> 

## 100均ランタンの分解と中身の入替え
・ 100均ランタン分解
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217319/e0ca7c02-1a7c-cd95-561e-9e15146f127d.png)

・中身の置き換え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217319/4d415258-360d-7f66-46e4-47085917e0ad.png)



## おまけのもう一曲
ドラムがもっとかっこいい感じになるように作曲してもらいました！

```
#プロンプト
クリスマスにぼっちで過ごしている一人暮らし社会人が聞いたときに心が温かくなる曲。
歌詞は日本語でお願いします。構成は一般的なイントロ、Aメロ、Bメロ、Cメロ(サビ)、エンディング。
楽器はボーカル、ギター、ベース、ドラム、ピアノで特にドラムをいい感じにして。
ただし、沢山叩けばいいというわけではなくて、間を大事にしてほしいという意味です。
```

<iframe width="1280" height="819" src="https://www.youtube.com/embed/IGs4msRnyCo" title="ひとりクリスマス tempo85" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


## まとめ
・生成AIの作曲のクオリティに正直驚かされました！
・今回は室内で持ち運ばなかったので、picoの基板はランタンの外に出している状態ですが、おそらくランタンの中も入りそうな雰囲気。従来の電池ボックスもうまく利用して電池駆動出来ればポータブルで持ち運べてより良さそう。

・まだ時々動作が不安定なときがあるのでコンデンサ追加を検討中。