M5StickCPlus + Speaker Hat
M5StickCPlusで音を鳴らすサンプルにはArduino IDE / M5StickCPlus ライブラリ付属の Speaker.ino がありますが、ビープ音を鳴らす実装しかされていませんでした。音のデータ配列を鳴らす関数もあるのですがデータが入ってなかったので探してくっつけてみました。
見つけた音データはどうやらM5Stackの起動音的なものらしいです。探して分かったのですがバイナリデータがデカいのでサンプルコードから外されているのかなと思いました。
また音を再生する上で26番PINにデータを送るのですがいろいろ試した結果 dacWrite 関数で出力するのが一番素直に再生されているようだったのでledcWriteToneから変更しています。
デモ
ボタンを押すとサンプル音が鳴りました!音質は8bitで古いサンプラーのような味のある音です。
これでM5StickCPlusに付属のMicで録音した音、Webからダウンロードした音・SDカード等から読み出した音を再生したりできそうです。
コード
#include <M5StickCPlus.h>
const int speakerPin = 26;
#define SAMPLES (40000)
// BITSPERSAMPLE: 8,
// CHANNELS: 1,
#define SAMPLERATE (20000)
// NORMALIZED: FALSE,
extern const unsigned char m5stack_startup_music[];
void setup() {
// put your setup code here, to run once:
M5.begin();
M5.Lcd.setRotation(0);
M5.Lcd.setCursor(25, 80, 4);
M5.Lcd.println("speaker");
}
void playMusic(const uint8_t* music_data,uint16_t sample_rate) {
uint32_t length = strlen((char*)music_data);
uint32_t delay_interval = ((uint32_t)1000000 / sample_rate);
for (int i = 0; i < length; i++) {
dacWrite(speakerPin,music_data[i]);
delayMicroseconds(delay_interval);
}
}
void loop() {
M5.update();
if(M5.BtnA.wasReleased()){
M5.Lcd.setCursor(25, 80, 4);
M5.Lcd.println("playing!");
//音楽の再生
playMusic(m5stack_startup_music,SAMPLERATE);
M5.Lcd.setCursor(25, 80, 4);
M5.Lcd.println("speaker");
}
}
// music from https://github.com/m5stack/M5Stack/blob/7e863fb9934bcb25f15afa720e9299b8a8e9a8fd/examples/Basics/FactoryTest/startup_music.c
const unsigned char m5stack_startup_music[] = {
//ここに上のリンクの配列データを貼り付ける
};