ATOMICスピーカーベース(NS4168搭載 )で音楽再生
※このページは神奈川工科大学電気電子情報工学科およびホームエレクトロニクス開発学科コミュニケーションロボティクス研究室の平凡なチュートリアルを淡々と示したものです。過度な期待はしないでください。 やってること
解説してること:下の①のサンプルに解説を加えてあります
①Micro SDに保存したMp3を再生する
Mp3を再生したいとの要望があったので、こちらのみ説明を用意しました。
このサンプルでは、setup関数内でmp3の再生を開始し、loop関数内で停止しています。ボタン操作等のイベントで再生を開始したい場合は、再生開始の処理( mp3->begin(id3, out); )をloop関数内で扱ってください(と、サンプルコードの該当箇所にも記載してあります)。
用意するもの
MicroSD
サンプル
code:PlayMP3FromSD.ino
/********************************************************************************
* Copyright (c) 2021 by M5Stack
* Equipped with Atom-Lite sample source code
* Product: SPK.
* Date: 2021/9/1
* M5StackのAtom-Liteボードを使用して、MicroSDカードに保存されたMP3ファイルを再生するサンプルコードです。公式が下記で配布しているものに日本語の解説を加えました by yama 2024.7.12
*******************************************************************************
Use ATOM SPK play mp3 files from TF Card
Before runing put the music file to the TF card
使用前にMicro SDに音楽ファイルを書き込んでおく必要があります。上のリンクにあるmp3ファイル、おもいっきりFFのファンファーレですね……。もう片方のサンプルもチョコボなんだよなぁ……。
*/
//ライブラリのインクルード(Atom Lite、オーディオ再生用)
//オブジェクトの宣言、変数の定義
AudioGeneratorMP3 *mp3;
AudioFileSourceSD *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;
//エラー時のコールバック関数
//オーディオ再生の状態をハンドリングするコールバック
void StatusCallback(void *cbData, int code, const char *string) {
const char *ptr = reinterpret_cast<const char *>(cbData);
// Note that the string may be in PROGMEM, so copy it to RAM for printf.
strncpy_P(s1, string, sizeof(s1));
Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1);
Serial.flush();
}
//ID3タグ(MP3ファイルに埋め込まれたメタデータ)の解析結果をハンドリングするコールバック
void MDCallback(void *cbData, const char *type, bool isUnicode,
const char *string) {
(void)cbData;
Serial.printf("ID3 callback for: %s = '", type);
if (isUnicode) {
string += 2;
}
while (*string) {
char a = *(string++);
if (isUnicode) {
string++;
}
Serial.printf("%c", a);
}
Serial.printf("'\n");
Serial.flush();
}
//setup() 関数
void setup() {
M5.begin(true, false, true); // M5Stackの初期化
SPI.begin(SCK, MISO, MOSI, -1); // SPI通信の初期化
// SDカードの初期化
if (!SD.begin(-1, SPI, 40000000)) {
Serial.println("Card Mount Failed");
return;
}
M5.dis.drawpix(0, 0x00ff00); // LEDマトリクスの初期化
audioLogger = &Serial;
file = new AudioFileSourceSD("/11-fanfare.mp3"); // SDカードから音声ファイルを読み込み
id3 = new AudioFileSourceID3(file); // ID3タグの解析
id3->RegisterMetadataCB(MDCallback, (void *)"ID3TAG");
out = new AudioOutputI2S(); //I2S経由での音声出力の設定
out->SetPinout(22, 21, 25); //pinアサインの設定
mp3 = new AudioGeneratorMP3(); // MP3デコーダの初期化
mp3->RegisterStatusCB(StatusCallback, (void *)"mp3");
// 再生を開始
mp3->begin(id3, out);
/* このサンプルではsetup関数の中で再生を開始している。(ボタンを押すなどの)イベントで再生を開始したい場合は、ここの1行をループ関数内で処理する。停止についてはループ関数内の処理をそのまま用いればよい。 */
}
//
void loop() {
if (mp3->isRunning()) { // MP3再生中かどうかを確認
if (!mp3->loop()) mp3->stop(); //mp3->loop() で再生。再生が終了したら場合は mp3->stop()で停止
} else {
Serial.printf("MP3 done\n"); //再生が終了したら "MP3 done" と表示
delay(1000);
}
}