背景
- そこまで大きくないmp3ファイルを用いて音を鳴らしたい
- データの書き換えにSDカードを抜き差しするのが面倒だった
- M5stack Core2にはSPIFFSがあり、内蔵フラッシュにデータを置けるので、そこから読み出せるかやってみた
環境・データ
- Windows11
- mp3ファイル(yaho.mp3)
- VOICEVOXでやっほー等の短いワードのwavデータを出力し、ffmpegで変換して作成
- vscode、platformio
- ライブラリは、ESP8266Audio、M5Unifiedを使用
手順
SPIFFへの書き込み
- プロジェクトを作成
- プロジェクトの直下にdataフォルダを作成し、その下にmp3を置く
- M5stack Core2をつなぎ、蟻のマーク > PROJECT TASKS > Platform > Upload Filesystem Imageをダブルクリックしてmp3を書き込みます
再生ファームウェアの用意
SPIFFSにアクセス可能かと、データの存在を確認してから、音声の再生を行う
I2SのdefineはM5stackCORE2に合わせて変更
M5Unifiedで自動設定できそうな気もする
main.cpp
#include <M5Unified.h>
#include "FS.h"
#include "SPIFFS.h"
#include "AudioFileSourceID3.h"
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2S *audioOut;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;
float volume = 100;
#define BCLK_PIN 12
#define LRCK_PIN 0
#define SADTA_PIN 2
#define EXTERNAL_I2S 0
void soundInit(void) {
audioOut = new AudioOutputI2S(I2S_NUM_0, EXTERNAL_I2S);
audioOut->SetPinout(BCLK_PIN, LRCK_PIN, SADTA_PIN);
audioOut->SetGain(volume / 100.0);
audioOut->SetOutputModeMono(false);
}
void setup() {
auto cfg = M5.config();
cfg.internal_spk = true;
M5.begin(cfg);
M5.Speaker.begin();
M5.Lcd.setTextFont(2);
//SPIFFS
if(!SPIFFS.begin(true)){
M5.Lcd.printf("can not accessed\n");
return;
}
//check data
File fileTest= SPIFFS.open("/yaho.mp3", "a");
if(!fileTest){
M5.Lcd.println("- failed to open file for appending");
return;
}
M5.Lcd.println("OK");
fileTest.close();
soundInit();
delay(500);
M5.Lcd.printf("test start\n");
file = new AudioFileSourceSPIFFS("/yaho.mp3");
id3 = new AudioFileSourceID3(file);
mp3 = new AudioGeneratorMP3();
mp3->begin(id3, audioOut);
}
void loop() {
if (mp3->isRunning()) {
if (!mp3->loop()) mp3->stop();
} else {
M5.Lcd.printf("MP3 done\n");
delay(1000);
}
}