LoginSignup
1
0

M5stack Core2のSPIFFSに保存したmp3を再生する

Posted at

背景

  • そこまで大きくないmp3ファイルを用いて音を鳴らしたい
  • データの書き換えにSDカードを抜き差しするのが面倒だった
  • M5stack Core2にはSPIFFSがあり、内蔵フラッシュにデータを置けるので、そこから読み出せるかやってみた

環境・データ

  • Windows11
  • mp3ファイル(yaho.mp3)
    • VOICEVOXでやっほー等の短いワードのwavデータを出力し、ffmpegで変換して作成
  • vscode、platformio
  • ライブラリは、ESP8266Audio、M5Unifiedを使用

手順

SPIFFへの書き込み

  1. プロジェクトを作成
  2. プロジェクトの直下にdataフォルダを作成し、その下にmp3を置く
    image.png
  3. M5stack Core2をつなぎ、蟻のマーク > PROJECT TASKS > Platform > Upload Filesystem Imageをダブルクリックしてmp3を書き込みます
    image.png

再生ファームウェアの用意

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);
    }
}
1
0
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
1
0