#include <M5StickCPlus.h> const int servo_pin = 26; uint8_t ledChannel = 0; uint8_t resolution = 8; uint32_t sampling_rate = 16000; //16kの場合。8kの場合は、8000 /* 別タブ(ファイル名はなんでもよい)に、音声データを以下の形式で貼っておく。 【音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); }