ハッピークリスマス！Node-RED MCU Editionでaudiooutノードを試してみた。

# はじめに

Node-RED MCU (Moddable)でクリチカを試したという記事が流れてきた。

https://github.com/phoddie/node-red-mcu/discussions/61

巨大なNode-REDフローの中にaudiooutノードが含まれており、クリスマスの定番音楽が流れていたので、さっそく試してみた。
注意点として、サンプルではESP32-S3(Flash 8MBメモリ)を使用しており、M5Stack Core2(ESP32 Flash 4MBメモリ)ではメモリ不足エラー(cannot allocate SharedArrayBuffer)が出やすいです。

# 前提条件

ビルド・インストール環境

- Intel MacBook Pro (2017)

マイコンデバイス

- M5Stack Core2

# 手順

以下を参考にNode-RED Dashboardを使用できるようにします。

https://qiita.com/kitazaki/items/101e182d1b535bdf06b2

## 1. audiooutノードをインストールする。

Node-REDとnode-red-mcu-pluginをインストールしたディレクトリで以下のコマンドを実行します。

```bash
$ npm install node_modules/\@ralphwetzel/node-red-mcu-plugin/node-red-mcu/nodes/audioout
```

## 2. Node-REDを起動する。

新しいモジュール(今回はaudiooutノード)をインストールすると、Node-RED起動時のエラー(node-red-mcu-pluginがパッチを適用するutils.jsが存在しない)が発生するため、node_modules/node-redディレクトリで必要なモジュールをインストールしてからNode-REDを起動します。

```bash
$ cd node_modules/node-red
$ npm install
$ cd ../..
$ node node_modules/node-red/red.js -u ./
```

## 3. 音声ファイルを用意する

効果音ラボの「クリスマスの鈴」(シャンシャン)を使用させていただきました。

https://soundeffect-lab.info/sound/anime/mp3/santaclaus-bell1.mp3

audiooutノードがサポートしているフォーマットはサンプリングレート(16bit, 16kHz)のモノラルWAV形式、または、SBC形式です。ffmpegコマンドを使用してフォーマットを変換します。

```bash
$ ffmpeg -i santaclaus-bell1.mp3 -acodec pcm_s16le -ac 1 -ar 16000 santaclaus-bell1.wav
```

```bash
$ ffmpeg -i santaclaus-bell1.mp3 -acodec sbc -ac 1 -ar 16000 -b:a 32k santaclaus-bell1.sbc
```

出力された音声ファイルをHTTPでアクセスできるウェブサイトへ置きます。

# Node-REDフロー

Node-RED MCUのDashboardサンプルフローに「change」ノードと「audioout」ノードを追加し、ノード間を接続します。

![スクリーンショット 2022-12-24 13.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/e340826c-bd1f-44c5-d18a-430dd8ecd48f.png)

「change」ノードはmsg.waveにWAVファイルのURLを、msg.sbcにSBCファイルのURLを設定します。

(msg.waveの例)
![スクリーンショット 2023-02-26 8.51.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/03a22e41-1d6b-a9d8-03ff-6e21e6b3ea64.png)

(msg.sbcの例)
![スクリーンショット 2023-02-26 8.51.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/7f1742ce-4488-2b03-c026-450d7bb8e072.png)

「audioout」ノードは再生するボリュームを設定します。

![スクリーンショット 2022-12-24 14.01.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8e4dc459-e41d-b041-3664-50b8f78f64dd.png)

サンプルフロー

```json:flows.json
[{"id":"5ed813308402a4b0","type":"tab","label":"フロー 1","disabled":false,"info":"","env":[],"_mcu":{"mcu":true}},{"id":"3c6c04d315fddf06","type":"ui_button","z":"5ed813308402a4b0","name":"A","group":"88ee1734c254e1cb","order":0,"width":0,"height":0,"passthru":false,"label":"A","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"A","payloadType":"str","topic":"topic","topicType":"msg","_mcu":{"mcu":true},"x":70,"y":40,"wires":[["def69a7b250c2736","172e2f277f989576"]]},{"id":"def69a7b250c2736","type":"ui_text","z":"5ed813308402a4b0","group":"88ee1734c254e1cb","order":1,"width":0,"height":0,"name":"","label":"Song","format":"{{msg.payload}}","layout":"row-spread","className":"","_mcu":{"mcu":true},"x":270,"y":80,"wires":[]},{"id":"2c72b81b70d481d9","type":"ui_button","z":"5ed813308402a4b0","name":"B","group":"88ee1734c254e1cb","order":0,"width":0,"height":0,"passthru":false,"label":"B","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"B","payloadType":"str","topic":"topic","topicType":"msg","_mcu":{"mcu":true},"x":70,"y":120,"wires":[["def69a7b250c2736","b1bc49e3731414ac"]]},{"id":"172e2f277f989576","type":"change","z":"5ed813308402a4b0","name":"","rules":[{"t":"set","p":"wave","pt":"msg","to":"http://host01.norahack.tk/bell.wav","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"_mcu":{"mcu":true},"x":300,"y":220,"wires":[["93893f1b5c7f304e"]]},{"id":"b1bc49e3731414ac","type":"change","z":"5ed813308402a4b0","name":"","rules":[{"t":"set","p":"wave","pt":"msg","to":"http://test.moddable.com/audio/ChristmasMusic/god_rest.wav","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"_mcu":{"mcu":true},"x":300,"y":280,"wires":[["93893f1b5c7f304e"]]},{"id":"93893f1b5c7f304e","type":"audioout","z":"5ed813308402a4b0","name":"","volume":"1.5","_mcu":{"mcu":true},"x":520,"y":220,"wires":[]},{"id":"88ee1734c254e1cb","type":"ui_group","name":"Happy X'mas!","tab":"5a15d716f5894281","order":1,"disp":true,"width":"6","collapse":false,"className":"","_mcu":{"mcu":false}},{"id":"5a15d716f5894281","type":"ui_tab","name":"home","icon":"dashboard","disabled":false,"hidden":false,"_mcu":{"mcu":false}}]
```

# 動作確認

Dashboardのボタンを押すと、「クリスマスの鈴」が再生されます。

https://twitter.com/Zakkiea/status/1606494884390920193

### (参考) メモリ不足エラー(cannot allocate SharedArrayBuffer)

![error_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0555e762-ff1b-d6fb-85d1-ba57e9df9b86.png)