#include <M5StickCPlus.h>
const int servo_pin = 26;
uint8_t ledChannel = 0;
uint8_t resolution = 8;
uint32_t sampling_rate = 16000; //16kの場合。8kの場合は、8000
/*
別ファイル(ファイル名拡張子は.ino)に、音声データを以下の形式で貼っておく。
【音1】
const uint8_t coin05_8k_raw[] PROGMEM = { 0x80, ... };
const uint32_t coin05_8k_raw_len = 7218; // ←配列のサイズ
【音2】
const uint8_t coin05_16k_raw[] PROGMEM = { 0x80, ... };
const uint32_t coin05_16k_raw_len = 14437; // ←配列のサイズ
PROGMEM と書くと、フラッシュメモリに配置する
そのうえで、以下のextern文を、別タブの変数名と合わせて書く。
変数名を一致させることが重要です。
*/
// 【音1】
extern const uint8_t coin05_8k_raw[];
extern const uint32_t coin05_8k_raw_len;
// 【音2】
extern const uint8_t coin05_16k_raw[];
extern const uint32_t coin05_16k_raw_len;
void setup() {
// put your setup code here, to run once:
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.setCursor(0, 30, 4);
M5.Lcd.println(" speaker hat test");
ledcSetup(ledChannel, sampling_rate * 32, resolution);
ledcAttachPin(servo_pin, ledChannel);
ledcWrite(ledChannel, 0);
}
void playMusic(const uint8_t* music_data, uint32_t len, uint16_t sample_rate) {
uint32_t delay_interval = ((uint32_t)1000000 / sample_rate);
for (int i = 0; i < len; i++) {
ledcWrite(ledChannel, music_data[i]);
delayMicroseconds(delay_interval);
}
ledcWriteTone(ledChannel, 0);
}
void loop() {
M5.update();
if (M5.BtnA.wasReleased()) {
playMusic(coin05_16k_raw, coin05_16k_raw_len, sampling_rate + 800); //なぜか音が低いので +800した
} else if (M5.BtnB.wasReleased()) {
playMusic(coin05_8k_raw, coin05_8k_raw_len, sampling_rate / 2); // 8kなので、2で割った
}
ledcWriteTone(ledChannel, 0);
delay(100);
}