#M5StickCPlus + Speaker Hat でサンプル音を鳴らす Speaker.ino の改良 #Arduino

M5StickCPlus + Speaker Hat

M5StickCPlusで音を鳴らすサンプルにはArduino IDE / M5StickCPlus ライブラリ付属の Speaker.ino がありますが、ビープ音を鳴らす実装しかされていませんでした。音のデータ配列を鳴らす関数もあるのですがデータが入ってなかったので探してくっつけてみました。

見つけた音データはどうやらM5Stackの起動音的なものらしいです。探して分かったのですがバイナリデータがデカいのでサンプルコードから外されているのかなと思いました。

https://github.com/m5stack/M5Stack/blob/7e863fb9934bcb25f15afa720e9299b8a8e9a8fd/examples/Basics/FactoryTest/startup_music.c

また音を再生する上で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[] = {

 //ここに上のリンクの配列データを貼り付ける

 };

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です